TensorFlow 1 目标检测模型训练与评估实战指南:本地、Cloud AI Platform 与 TPU 全流程解析
【免费下载链接】modelsModels and examples built with TensorFlow项目地址: https://gitcode.com/GitHub_Trending/mode/models
导读
本文基于 TensorFlow Object Detection API(TF1 分支)官方训练与评估指南,完整讲解如何从零训练一个目标检测模型:从目录规划、模型配置文件编写、预训练权重初始化,到在本地环境、Google Cloud AI Platform(多 Worker GPU)以及 TPU 上提交训练与评估任务,并借助 TensorBoard 监控训练进度。读完本文,你将能够独立完成一条pipeline.config→ 训练任务 → 评估任务 → TensorBoard 可视化的完整闭环,并理解底层model_main.py/model_tpu_main.py的执行机制。
适用前提:本文对应仓库中的 TF1 训练链路,环境要求 Python 3.6 与 TensorFlow 1.15。仓库中同步提供了 TF2 训练与评估指南,新项目建议优先考虑 TF2 版本。
开始前的前置条件
本文假定读者已经完成以下两项准备工作:
- 已按 安装说明 安装好 TensorFlow Object Detection API(含依赖包与
slim路径配置)。 - 已经准备好了合法的数据集。关于如何为 PASCAL VOC 挑战赛或 Oxford-IIIT Pet 数据集生成 TFRecord 数据,参见 preparing_inputs(对数据格式、label map 与目录组织还有疑问的读者,还可参考 using_your_own_dataset)。
在此基础上,官方还推荐先在本地跑少量迭代验证任务可行性,再提交到云端,可大幅降低排查成本(详见下文各云任务的“建议本地预演”)。
推荐的训练与评估目录结构
为了让训练产物、评估产物彼此隔离、便于 TensorBoard 统一加载,官方推荐使用如下目录结构:
. ├── data/ │ ├── eval-00000-of-00001.tfrecord │ ├── label_map.txt │ ├── train-00000-of-00002.tfrecord │ └── train-00001-of-00002.tfrecord └── models/ └── my_model_dir/ ├── eval/ # Created by evaluation job. ├── my_model.config └── train/ # └── model_ckpt-100-data@1 # Created by training job. └── model_ckpt-100-index # └── checkpoint #要点说明:
data/存放 TFRecord 与 label map(label map 在训练集和评估集之间必须保持一致);my_model_dir/作为单一模型目录(即下文的${MODEL_DIR}),训练任务生成的 checkpoint(含model_ckpt-*.data-*、*.index、checkpoint元文件等)与评估任务生成的 events 分别落在train/、eval/子目录下,便于后续tensorboard --logdir=${MODEL_DIR}一条命令同时看到两侧曲线;- checkpoint 文件后缀中的
data@1等编号来自分布式(TPU)训练的多分片存储约定,属于正常现象。
编写模型配置文件
所有训练参数都由一份基于 protobuf 的 pipeline 配置文件(pipeline.config)承载。其模式定义在 protos/pipeline.proto,顶层由五大部分组成:model(模型结构)、train_config(训练超参与预训练权重初始化)、eval_config(评估指标)、train_input_reader与eval_input_reader(训练/评估数据源)。
仓库在 samples/configs 目录下提供了大量可直接复用的示例配置(例如 SSD、Faster R-CNN 及其各 backbone 变体)。建议操作方式:挑选与目标网络最接近的 config 作为模板,将其内容作为骨架,替换三处关键路径与超参,具体配置字段的逐项说明见 configuring_jobs。以 ssd_mobilenet_v2_coco.config 为例,模板中以PATH_TO_BE_CONFIGURED占位的字段正是需要用户替换的部分:
train_input_reader.tf_record_input_reader.input_path与eval_input_reader...input_path:训练/评估 TFRecord 路径(支持?????通配符匹配多分片文件,也支持gs://开头的云端路径);label_map_path:label map 文件路径;train_config.fine_tune_checkpoint:预训练 checkpoint 前缀(见下节);model.ssd.num_classes:必须改成自己数据集的类别数。
模型参数初始化(使用预训练权重加速收敛)
从零训练一个目标检测器往往耗时数天。官方强烈建议复用已有图像分类或目标检测 checkpoint 中的特征提取器参数。train_config提供两个关键字段(定义见 protos/train.proto):
fine_tune_checkpoint:已有 checkpoint 的路径前缀,例如"/usr/home/username/checkpoint/model.ckpt-#####";fine_tune_checkpoint_type:取值为classification或detection,决定从哪种类型的预训练模型加载。
对fine_tune_checkpoint_type的底层语义,train.proto 中有更精确的注释:
classification:仅恢复特征提取器中用于分类的 backbone 部分,典型场景是从 ImageNet 预训练分类模型(如 ResNet)起步训练检测模型;detection:恢复整个特征提取器,仅不恢复 box 与 class 预测头,典型场景是复用预训练检测模型在新数据集/新任务上微调;full:恢复完整检测模型(特征提取器 + 预测头),仅当预训练任务与微调任务完全一致时使用,否则参数 shape 不兼容会在恢复时直接报错。
此外需要注意:旧字段from_detection_checkpoint(默认false)与load_all_detection_checkpoint_vars在 proto 中已被标记为deprecated,新配置应统一改用fine_tune_checkpoint_type。加载 checkpoint 时默认还会跑一次 dummy computation 以触发变量构建(对应run_fine_tune_checkpoint_dummy_computation字段,默认true),CenterNet 等部分 meta architecture 可将其置false以缩短启动时间。
仓库在 samples/configs 的示例中对该字段的典型用法如下:
train_config: { fine_tune_checkpoint: "PATH_TO_BE_CONFIGURED/model.ckpt" fine_tune_checkpoint_type: "detection" ... }可用的检测预训练模型清单(含模型名、下载地址、速度与 mAP 等指标)请查阅 tf1_detection_zoo。其中每个模型的名称都对应samples/configs下的一份训练配置文件;解压 tar.gz 后即可得到 checkpoint、pipeline.config及可供推理的 frozen graph。
本地训练(训练 + 评估交错执行)
在本地 GPU/CPU 环境启动训练使用入口脚本 model_main.py:
# 在 tensorflow/models/research/ 目录下执行 PIPELINE_CONFIG_PATH={path to pipeline config file} MODEL_DIR={path to model directory} NUM_TRAIN_STEPS=50000 SAMPLE_1_OF_N_EVAL_EXAMPLES=1 python object_detection/model_main.py \ --pipeline_config_path=${PIPELINE_CONFIG_PATH} \ --model_dir=${MODEL_DIR} \ --num_train_steps=${NUM_TRAIN_STEPS} \ --sample_1_of_n_eval_examples=${SAMPLE_1_OF_N_EVAL_EXAMPLES} \ --alsologtostderr其中${PIPELINE_CONFIG_PATH}指向 pipeline 配置文件,${MODEL_DIR}指向训练 checkpoint 与 events 的输出目录。需要特别强调的是:该二进制会将训练与评估交错执行——从源码(model_main.py)可以看到,未指定checkpoint_dir时程序会调用create_train_and_eval_specs构造 TrainSpec/EvalSpec,再交由tf_estimator.train_and_evaluate运行,评估会在训练中途周期性自动执行。
该脚本支持的完整 flag 集合(来自 model_main.py)如下:
| Flag | 类型 | 默认值 | 含义 |
|---|---|---|---|
model_dir | string | 必填 | 模型输出目录,event/checkpoint 将写入这里 |
pipeline_config_path | string | 必填 | pipeline 配置文件路径 |
num_train_steps | int | None | 训练步数 |
sample_1_of_n_eval_examples | int | 1 | 评估时每 n 个样本取 1 个参与评估 |
sample_1_of_n_eval_on_train_examples | int | 5 | 对训练数据做评估时每 n 个取 1 个(仅eval_training_data=True时生效) |
eval_training_data | bool | False | 是否评估训练数据(仅用于 eval-only 模式,且必须提供checkpoint_dir) |
checkpoint_dir | string | None | 若提供,则本二进制进入eval-only模式,将指标写入model_dir |
run_once | bool | False | eval-only 模式下只跑一轮评估,否则持续评估(默认) |
max_eval_retries | int | 0 | 持续评估遇到InvalidArgumentError时的最大重试次数;为负则总是重试 |
Google Cloud AI Platform 上的分布式训练
TensorFlow Object Detection API 官方支持在 Google Cloud AI Platform 上训练与评估。开始前需要满足:
- 已在 Cloud AI Platform 上创建并配置好项目(涉及 GPU/TPU 的配额与网络配置,官方另有 Using GPUs / Using TPUs 指南,此处不再展开);
- 数据已上传至 Google Cloud Storage(GCS)存储桶,路径形式如
gs://${BUCKET}/...。
同样地,官方建议先在本地跑少量迭代验证任务脚本正确,再提交云端。
单 GPU 多 Worker 训练
多 Worker GPU 训练任务需要一份 YAML 集群配置文件,样例内容如下:
trainingInput: runtimeVersion: "1.15" scaleTier: CUSTOM masterType: standard_gpu workerCount: 9 workerType: standard_gpu parameterServerCount: 3 parameterServerType: standard编写 YAML 时务必遵循以下经验法则:
- n 个 worker 的任务实际会有n + 1 台训练机器(n 个 worker + 1 个 master);
- parameter server 数量应使用奇数,以避免因轮询调度导致某个 PS 上只存放了权重变量或只存放了偏置变量;
- worker 数量增多时应相应降低学习率,最优值需要通过实验确定(仓库各示例 config 给出的学习率高度依赖具体训练环境,例如 worker 数量与 GPU 型号)。
YAML 文件应保存在本地机器(而非 GCP 上)。随后用gcloud ml-engine jobs submit training提交任务:
# 在 tensorflow/models/research/ 目录下执行 cp object_detection/packages/tf1/setup.py . gcloud ml-engine jobs submit training object_detection_`date +%m_%d_%Y_%H_%M_%S` \ --runtime-version 1.15 \ --python-version 3.6 \ --job-dir=gs://${MODEL_DIR} \ --package-path ./object_detection \ --module-name object_detection.model_main \ --region us-central1 \ --config ${PATH_TO_LOCAL_YAML_FILE} \ -- \ --model_dir=gs://${MODEL_DIR} \ --pipeline_config_path=gs://${PIPELINE_CONFIG_PATH}参数说明:
${PATH_TO_LOCAL_YAML_FILE}:本地 YAML 配置路径;gs://${MODEL_DIR}:GCS 上写入训练 checkpoint 与 events 的目录(即model_dir);gs://${PIPELINE_CONFIG_PATH}:存放在 GCS 上的 pipeline 配置文件路径;- 先执行
cp object_detection/packages/tf1/setup.py .,是因为 packages/tf1/setup.py 声明了云端任务打包安装所依赖的REQUIRED_PACKAGES(pillow、lxml、matplotlib、Cython、contextlib2、tf-slim、six、pycocotools、lvis、scipy、pandas 等),并将slim下的子包纳入find_packages的范围; - 与本地运行相同,
module-name object_detection.model_main的任务同样会在训练中交错执行评估; - 训练进度可在 AI Platform 的任务管理控制台实时查看。
使用 TPU 训练
TPU 训练需要 pipeline config 是 TPU 兼容的(batch size、anchor、网络结构均需适配),随后使用 TPU 专用入口脚本 model_tpu_main.py 提交:
# 在 tensorflow/models/research/ 目录下执行 cp object_detection/packages/tf1/setup.py . gcloud ml-engine jobs submit training `whoami`_object_detection_`date +%m_%d_%Y_%H_%M_%S` \ --job-dir=gs://${MODEL_DIR} \ --package-path ./object_detection \ --module-name object_detection.model_tpu_main \ --runtime-version 1.15 \ --python-version 3.6 \ --scale-tier BASIC_TPU \ --region us-central1 \ -- \ --tpu_zone us-central1 \ --model_dir=gs://${MODEL_DIR} \ --pipeline_config_path=gs://${PIPELINE_CONFIG_PATH}与 GPU 训练命令的差异:
- 不需要 YAML 文件,改用
--scale-tier BASIC_TPU一键拉起 TPU 集群; module-name从object_detection.model_main换成object_detection.model_tpu_main;- 需额外提供
--tpu_zone(--tpu_name、--gcp_project可选,不指定时从环境自动探测); pipeline_config_path必须指向TPU 兼容的模型配置。
从源码看(model_tpu_main.py),TPU 训练基于tf_estimator.tpu.RunConfig+TPUConfig构建 Estimator,其中几个默认值值得留意:num_shards(TPU core 数,默认 8)、iterations_per_loop(每个 TPU 训练循环的迭代数,默认 100);另有mode(train或eval)、train_batch_size(默认不指定,则从 train config 读取)等 flag。TPU 任务默认每 10 分钟保存一次最近 checkpoint。与 GPU 多 Worker 不同,model_tpu_main的train模式不会在训练中交错执行评估(见 model_tpu_main.py,train模式仅调用estimator.train),因此需要单独起评估任务(见下节)。
使用 GPU 单独执行评估
注意:仅当使用 TPU 训练时才需要这一步,因为 TPU 训练不像多 Worker GPU 训练那样在训练过程中交错执行评估。评估任务运行在单机上,因此不需要编写 YAML 集群配置。命令如下:
# 在 tensorflow/models/research/ 目录下执行 cp object_detection/packages/tf1/setup.py . gcloud ml-engine jobs submit training object_detection_eval_`date +%m_%d_%Y_%H_%M_%S` \ --runtime-version 1.15 \ --python-version 3.6 \ --job-dir=gs://${MODEL_DIR} \ --package-path ./object_detection \ --module-name object_detection.model_main \ --region us-central1 \ --scale-tier BASIC_GPU \ -- \ --model_dir=gs://${MODEL_DIR} \ --pipeline_config_path=gs://${PIPELINE_CONFIG_PATH} \ --checkpoint_dir=gs://${MODEL_DIR}参数说明:
gs://${MODEL_DIR}既是训练 checkpoint 的存放目录(与训练任务保持一致),也是评估 events 的输出目录;gs://${PIPELINE_CONFIG_PATH}是 GCS 上 pipeline 配置文件路径;- 通过给
model_main追加--checkpoint_dir=gs://${MODEL_DIR}使其进入eval-only 模式——对照 model_main.py 的逻辑:指定checkpoint_dir后会读取tf.train.latest_checkpoint(checkpoint_dir)得到最新 checkpoint 进行评估;默认使用第一个 eval input 对应的验证集(validation_data),若加--eval_training_data则评估训练集;不加--run_once时通过continuous_eval持续监控新 checkpoint 并循环评估。
最佳实践是让评估任务与训练任务并发启动。还需注意:官方不支持在 TPU 上运行评估,因此无论训练使用的是 GPU 还是 TPU,评估任务的启动命令都是上面这一条(GPU 环境)。评估循环的健壮性由model_lib.continuous_eval保证,它支持配置max_eval_retries:在评估单个 checkpoint 遇到InvalidArgumentError时可自动重试(设为负数则无条件重试),实现见 model_lib.py。
使用 TensorBoard 监控训练与评估进度
训练与评估的进度曲线都可以用 TensorBoard 查看。如果采用了本文推荐的目录结构(train/与eval/位于同一model_dir下),则只需一条命令:
tensorboard --logdir=${MODEL_DIR}其中${MODEL_DIR}指向同时包含train/与eval/目录的父目录。TensorBoard 会自动把两侧的标量曲线(loss、mAP 等)按目录区分展示。需要提醒的是,TensorBoard 拉取并聚合数据可能需要几分钟时间,启动后稍候片刻再刷新页面即可看到完整曲线。
训练/评估执行链路原理速览
把上述操作背后的调用关系串起来,可以得到一条清晰的主线(统一以 model_lib.py 为核心工具库):
model_main.py/model_tpu_main.py解析命令行 flag,并强制要求model_dir与pipeline_config_path;- 调用
model_lib.create_estimator_and_inputs(model_lib.py)读取 pipeline config,构建 Estimator 以及 train/eval/predict 对应的 input_fn(TPU 场景会传入use_tpu_estimator=True与num_shards); - 无
checkpoint_dir时,create_train_and_eval_specs(model_lib.py)将第一个 EvalSpec 关联一个名为Servo的FinalExporter(用于导出 serving 模型),然后交给tf_estimator.train_and_evaluate交错执行训练与评估; - 指定
checkpoint_dir(eval-only)时,continuous_eval(model_lib.py 起的生成器实现)持续扫描模型目录中的新 checkpoint,逐个评估并写入model_dir,直至训练总步数对应的最终 checkpoint 评估完成。
理解这条链路后,本地单机训练、云上多 Worker GPU 训练、TPU 训练与独立 GPU 评估这四种任务形态的区别(是否交错评估、是否复用同一model_main、是否需要 YAML、入口是model_main还是model_tpu_main)便会一目了然,排查训练中断、评估不启动等常见问题时也更有章可循。
常见问题与进阶参考
- 训练一步都不走/checkpoint 不落盘:优先检查
model_dir是否可写、pipeline config 中input_path与 label map 路径是否准确(含?????通配与gs://前缀场景),以及fine_tune_checkpoint_type与预训练权重是否匹配; - 加载 checkpoint 报 shape 不兼容:多为
classification/detection/full选择与来源模型不一致所致,请对照前文 train.proto 语义重新选择; - 评估任务一直不结束/不更新:确认未加
--run_once(默认持续评估),并核对checkpoint_dir与训练侧model_dir一致。
更进一步的资料可继续阅读仓库中的 tf1.md(TF1 环境安装与整体概览)、configuring_jobs.md(pipeline 各字段详解)、tf1_detection_zoo.md(预训练模型清单),以及 tf2_training_and_evaluation.md(TF2 训练流程)。若要在自定义数据集上走完整流程,结合 using_your_own_dataset.md 与 running_pets.md 一起阅读效果最佳。
【免费下载链接】modelsModels and examples built with TensorFlow项目地址: https://gitcode.com/GitHub_Trending/mode/models
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考