从零开始训练 Faster R - CNN 全流程指南
1. 数据准备与验证
1.1 记录文件创建
在完成相关操作后,查看 lisa/records 目录,你会看到训练和测试文件:
$ ls lisa/records/
classes.pbtxt
testing.record
training.record
这表明我们已成功创建了 TensorFlow 格式的记录文件和关联的类标签文件。
1.2 预训练关键步骤
在开始训练 Faster R - CNN 之前,务必注意:很多深度学习开发者、学生和研究人员常犯的错误是在构建数据集时急于求成,不仔细检查工作。在目标检测中,我们处理的不仅是输入图像和类标签,还有边界框坐标。不能因为代码执行完成且无错误,就认为一切正常。
在训练网络之前,要仔细检查代码。特别是在为给定图像构建边界框和类标签时,可按以下步骤进行可视化验证:
1. 通过 OpenCV 从磁盘加载图像。
2. 将 xMin 、 xMax 、 yMin 和 yMax 缩放回标准整数坐标,然后在图像上绘制边界框。
3. 同时在图像上绘制类标签。
以下是实现此过程的代码段:
# loop over the bounding boxes + labels associated with
# the image
for (label, (startX, startY, endX, endY)) in D[k]:
# TensorFlow assumes all bounding boxes are in the
# range [0, 1] so we need to scale them
xMin = startX / w
xMax = endX / w
yMin = startY / h
yMax = endY / h
# load the input image from disk and denormalize the
# bounding box coordinates
image = cv2.imread(k)
startX = int(xMin * w)
startY = int(yMin * h)
endX = int(xMax * w)
endY = int(yMax * h)
# draw the bounding box on the image
cv2.rectangle(image, (startX, startY), (endX, endY),
(0, 255, 0), 2)
# show the output image
cv2.imshow("Image", image)
cv2.waitKey(0)
虽然不需要检查数据集中的每一张图像,但每个类别抽取几百张,花 10 - 20 分钟查看是否有错误,这种可视化验证至关重要,绝不能跳过。
如果你想使用自定义数据集并构建关联的记录文件,可将此脚本作为起点,修改类标签/边界框解析部分,尽量不要修改 TFAnnotation 对象的实际构造,以减少引入错误的可能性。
2. 配置 Faster R - CNN
2.1 训练步骤概述
在 LISA 数据集上训练 Faster R - CNN 分为四个步骤:
1. 下载预训练的 Faster R - CNN 以进行网络微调。
2. 下载样本 TFOD API 配置文件,并修改其指向我们的记录文件。
3. 启动训练过程并进行监控。
4. 训练完成后导出冻结的模型图。
2.2 下载预训练模型
首先,前往 TensorFlow 对象检测模型库: http://pyimg.co/1z34r ,找到在 COCO 数据集上训练的 Faster R - CNN + ResNet - 101 模型链接并下载。截至撰写本文时,文件名是 faster_rcnn_resnet101_coco_2018_01_28.tar.gz 。
下载完成后,将模型移动到 experiments/training 子目录并解压:
$ cd lisa/experiments/training
$ mv ~/Downloads/faster_rcnn_resnet101_coco_2018_01_28.tar.gz ./
$ tar -zxvf faster_rcnn_resnet101_coco_2018_01_28.tar.gz
$ ls -l faster_rcnn_resnet101_coco_2018_01_28
checkpoint
frozen_inference_graph.pb
model.ckpt.data-00000-of-00001
model.ckpt.index
model.ckpt.meta
pipeline.config
saved_model
这些文件构成了在 COCO 数据集上预训练的 TensorFlow Faster R - CNN。
2.3 下载并修改配置文件
从 http://pyimg.co/r2xql 下载 Faster R - CNN + ResNet - 101 架构的样本配置文件 faster_rcnn_resnet101_pets.config ,并保存到 experiments/training 目录,可将其重命名为 faster_rcnn_lisa.config 。
打开 faster_rcnn_lisa.config 文件,需要更新以下七个配置:
1. num_classes :将其从 37 改为 3,因为 LISA 数据集样本中有 3 个类别(行人过街、前方信号和停车标志)。
faster_rcnn {
num_classes: 3
image_resizer {
keep_aspect_ratio_resizer {
min_dimension: 600
max_dimension: 1024
}
}
}
-
num_steps:训练时执行的批处理步数,默认值为 200,000,建议在这个特定数据集上使用 50,000。大多数数据集至少训练 20,000 步。
train_config: {
batch_size: 1
...
num_steps: 50000
data_augmentation_options {
random_horizontal_flip {
}
}
}
-
fine_tune_checkpoint:指向下载的 Faster R - CNN + ResNet 101 模型的model.ckpt基础文件路径,要提供完整路径。
gradient_clipping_by_norm: 10.0
fine_tune_checkpoint: "/home/adrian/pyimagesearch/dlbook/ssds_and_rcnn/lisa/experiments/training/faster_rcnn_resnet101_coco_2018_01_28/model.ckpt"
from_detection_checkpoint: true
-
train_input_reader中的input_path和label_map_path:分别指向training.record文件和classes.pbtxt文件。
train_input_reader: {
tf_record_input_reader {
input_path: "/home/adrian/pyimagesearch/dlbook/ssds_and_rcnn/lisa/records/training.record"
}
label_map_path: "/home/adrian/pyimagesearch/dlbook/ssds_and_rcnn/lisa/records/classes.pbtxt"
}
-
eval_input_reader中的input_path和label_map_path:input_path指向testing.record文件,label_map_path指向classes.pbtxt文件。
eval_input_reader: {
tf_record_input_reader {
input_path: "/home/adrian/pyimagesearch/dlbook/ssds_and_rcnn/lisa/records/testing.record"
}
label_map_path: "/home/adrian/pyimagesearch/dlbook/ssds_and_rcnn/lisa/records/classes.pbtxt"
shuffle: false
num_readers: 1
}
-
eval_config中的num_examples:设置为测试集中边界框的总数。可注释掉max_evals以确保评估脚本无限期运行。
eval_config: {
num_examples: 955
# Note: The below line limits the evaluation process to 10 evaluations.
# Remove the below line to evaluate indefinitely.
#max_evals: 10
}
3. 训练 Faster R - CNN
3.1 启动训练
使用以下命令启动训练(确保在运行此命令前执行 setup.sh 脚本导出 PYTHONPATH ):
$ python object_detection/train.py --logtostderr \
--pipeline ssds_and_rcnn/lisa/experiments/training/faster_rcnn_lisa.config \
--train_dir ssds_and_rcnn/lisa/experiments/training
3.2 启动评估
打开另一个终端,执行以下命令启动评估:
$ python object_detection/eval.py --logtostderr \
--pipeline_config_path ssds_and_rcnn/lisa/experiments/training/faster_rcnn_lisa.config \
--checkpoint_dir ssds_and_rcnn/lisa/experiments/training \
--eval_dir ssds_and_rcnn/lisa/experiments/evaluation
3.3 可视化训练过程
在系统的任何位置执行以下命令,可在浏览器中可视化训练过程:
$ cd ~/pyimagesearch/dlbook/ssds_and_rcnn/
$ tensorboard --logdir lisa/experiments
4. 使用 TFOD API 的建议
4.1 接受学习曲线
使用 TFOD API 存在学习曲线,初次使用时,不要期望所有脚本都能直接运行。建议预留一到两天时间来熟悉该 API。遇到错误时,要冷静诊断,很多错误可能是由于 Python 路径或文件路径设置不当导致的,一定要仔细检查文件路径。
4.2 先复现已知结果
建议先在 LISA 交通标志数据集上训练第一个 Faster R - CNN,至少训练 2,500 步,以验证训练和评估流程是否正常。不要急于替换示例数据集,应先熟悉 TFOD API 工具,再使用自己的数据集进行训练。
4.3 导出 PYTHONPATH
如果在执行 TFOD API 脚本或导入文件时遇到 ImportError ,可能是 PYTHONPATH 未正确设置。可使用 setup.sh 脚本或手动导出:
$ source setup.sh
$ python build_lisa_records.py
4.4 清理 “training” 目录
如果发现网络训练速度变慢或结果异常,可清理 training 目录,删除除 faster_rcnn_resnet101_coco_2018_01_28.tar.gz 和 faster_rcnn_lisa.config 之外的所有文件,然后重新解压模型并重启训练。
$ cd lisa/experiments/training/
$ rm checkpoint graph.pbtxt pipeline.config
$ rm events.* model.*
$ rm -rf faster_rcnn_resnet101_coco_2018_01_28
$ tar -zxvf faster_rcnn_resnet101_coco_2018_01_28.tar.gz
$ ls -l
faster_rcnn_lisa.config
faster_rcnn_resnet101_coco_2018_01_28
faster_rcnn_resnet101_coco_2018_01_28.tar.gz
4.5 监控损失和 mAP
训练目标检测器时,要监控损失和平均精度均值(mAP)。mAP 应在开始时较低,在训练的前 10,000 - 50,000 步内快速上升,然后趋于平稳,同时损失应逐渐降低。理想情况下,损失应低于 1.5,低于 1 更佳。
4.6 GPU 和 CPU 训练与评估
在熟悉 TFOD API 工具之前,建议使用单个 GPU 进行训练和评估。如果只有一个 GPU,不要在同一个 GPU 上同时进行训练和评估,可在 GPU 上启动训练,在 CPU 上进行评估。评估时,将 eval_config 中的 num_examples 设置为较小的数字(如 5 - 10),以减少评估时间。
4.7 设置 CUDA 可见设备
可通过设置 CUDA_VISIBLE_DEVICES 环境变量来指定 TensorFlow 使用的 GPU。例如:
# 只使用 GPU 0 进行训练
$ export CUDA_VISIBLE_DEVICES="0"
$ python object_detection/train.py --logtostderr \
--pipeline ssds_and_rcnn/lisa/experiments/training/faster_rcnn_lisa.config \
--train_dir ssds_and_rcnn/lisa/experiments/training
# 只使用 GPU 1 进行评估
$ export CUDA_VISIBLE_DEVICES="1"
$ python object_detection/eval.py --logtostderr \
--pipeline_config_path ssds_and_rcnn/lisa/experiments/training/faster_rcnn_lisa.config \
--checkpoint_dir ssds_and_rcnn/lisa/experiments/training \
--eval_dir ssds_and_rcnn/lisa/experiments/evaluation
# 使用 CPU 进行评估
$ export CUDA_VISIBLE_DEVICES=""
$ python object_detection/eval.py --logtostderr \
--pipeline_config_path ssds_and_rcnn/lisa/experiments/training/faster_rcnn_lisa.config \
--checkpoint_dir ssds_and_rcnn/lisa/experiments/training \
--eval_dir ssds_and_rcnn/lisa/experiments/evaluation
4.8 优化器参数
在 Faster R - CNN + ResNet - 101 中,默认配置文件使用 SGD + Nesterov 动量优化器,学习率为 0.0003。在熟悉工具包并多次复现结果之前,建议保持这些优化器参数不变。同时,要参考 TensorFlow 社区在管道配置中的注释,获取参数建议。
4.9 尊重工具包
TFOD API 是一个强大的工具,但使用它有学习曲线,需要耐心和时间。遇到错误时,要仔细阅读错误信息,参考 TensorFlow 文档,不要期望快速解决问题。大多数情况下,错误可能是由于文件路径设置不当、Python 路径未更新等原因导致的。
5. 训练流程总结与注意事项
5.1 训练流程总结
为了更清晰地展示整个 Faster R - CNN 的训练流程,我们可以用一个流程图来概括:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(数据准备):::process --> B(创建记录文件):::process
B --> C(可视化验证数据):::process
C --> D(下载预训练模型):::process
D --> E(下载并修改配置文件):::process
E --> F(启动训练):::process
F --> G(启动评估):::process
F & G --> H(可视化训练过程):::process
整个流程主要包括以下几个关键步骤:
1. 数据准备 :创建 TensorFlow 格式的记录文件和关联的类标签文件,并进行可视化验证,确保数据的准确性。
2. 模型和配置准备 :下载预训练的 Faster R - CNN 模型,下载并修改样本配置文件,使其指向我们的记录文件和模型文件。
3. 训练和评估 :使用修改后的配置文件启动训练和评估过程,并通过 TensorBoard 可视化训练过程。
5.2 注意事项
在整个训练过程中,有一些重要的注意事项需要我们牢记:
|注意事项|详情|
| ---- | ---- |
|数据验证|可视化验证数据至关重要,不能因为代码执行无错误就认为数据没问题。每个类别抽取几百张图像,花 10 - 20 分钟查看是否有错误。|
|文件路径|在修改配置文件时,要确保提供完整的文件路径,避免使用控制台快捷方式。同时,要仔细检查 Python 路径和文件路径,很多错误可能是由于路径设置不当导致的。|
|训练步数|大多数数据集至少训练 20,000 步,在这个特定的 LISA 数据集上,建议训练 50,000 步。不要过早停止训练,通常在 20,000 步之后再考虑是否停止。|
|GPU 和 CPU 使用|在熟悉 TFOD API 工具之前,建议使用单个 GPU 进行训练和评估。如果只有一个 GPU,不要在同一个 GPU 上同时进行训练和评估,可在 GPU 上启动训练,在 CPU 上进行评估,并将 eval_config 中的 num_examples 设置为较小的数字。|
|优化器参数|在熟悉工具包并多次复现结果之前,建议保持默认的优化器参数不变。同时,要参考 TensorFlow 社区在管道配置中的注释,获取参数建议。|
6. 常见错误及解决方法
6.1 ImportError
当执行 TFOD API 脚本或导入文件时,可能会遇到 ImportError ,这通常是由于 PYTHONPATH 未正确设置导致的。解决方法是使用 setup.sh 脚本或手动导出 PYTHONPATH :
$ source setup.sh
$ python build_lisa_records.py
6.2 训练速度变慢或结果异常
如果发现网络训练速度变慢或结果异常,可能是 training 目录中的文件过多导致的。解决方法是清理 training 目录,删除除 faster_rcnn_resnet101_coco_2018_01_28.tar.gz 和 faster_rcnn_lisa.config 之外的所有文件,然后重新解压模型并重启训练:
$ cd lisa/experiments/training/
$ rm checkpoint graph.pbtxt pipeline.config
$ rm events.* model.*
$ rm -rf faster_rcnn_resnet101_coco_2018_01_28
$ tar -zxvf faster_rcnn_resnet101_coco_2018_01_28.tar.gz
$ ls -l
faster_rcnn_lisa.config
faster_rcnn_resnet101_coco_2018_01_28
faster_rcnn_resnet101_coco_2018_01_28.tar.gz
6.3 GPU 内存耗尽错误
如果在同一个 GPU 上同时进行训练和评估,可能会遇到 GPU 内存耗尽错误。解决方法是在 GPU 上启动训练,在 CPU 上进行评估,并将 eval_config 中的 num_examples 设置为较小的数字(如 5 - 10)。
6.4 其他错误
遇到其他错误时,要仔细阅读 TensorFlow 输出的错误信息,通常错误信息会提示问题所在。可以通过 Google 搜索错误信息,参考 TensorFlow 文档或相关论坛来解决问题。同时,要接受使用 TFOD API 存在学习曲线,不要期望快速解决问题,要有耐心和毅力。
7. 总结
通过以上的步骤和建议,我们可以从零开始训练一个 Faster R - CNN 模型。整个过程虽然涉及多个步骤和配置,但只要我们按照流程进行,仔细检查每一个环节,就能够顺利完成训练。
在训练过程中,要特别注意数据的准确性、文件路径的设置、训练步数的选择、GPU 和 CPU 的使用以及优化器参数的调整。同时,要接受使用 TFOD API 存在学习曲线,遇到错误时要冷静分析,参考相关文档和论坛来解决问题。
希望这篇指南能够帮助你成功训练出一个高性能的 Faster R - CNN 模型,在目标检测领域取得更好的成果。如果你在训练过程中遇到任何问题,欢迎在评论区留言,我们一起探讨解决。
超级会员免费看
13

被折叠的 条评论
为什么被折叠?



