从零开始训练SSD进行车辆检测
1. 训练SSD的前期准备
要在车辆数据集上训练SSD,首先需要从TensorFlow对象检测模型库(http://pyimg.co/1z34r)下载在COCO上预训练的SSD + Inception v2模型。这里有两种SSD模型可供选择:
- SSD + MobileNet
- SSD + Inception
为了获得更高的检测精度,我们选择SSD + Inception架构。可以通过上述链接下载该网络,也可以使用以下命令:
$ cd dlib_front_and_rear_vehicles_v1/experiments/training
$ mv ~/Downloads/ssd_inception_v2_coco_2017_11_17.tar.gz ./
$ tar -zxvf ssd_inception_v2_coco_2017_11_17.tar.gz
$ ls -l ssd_inception_v2_coco_2017_11_17
checkpoint
frozen_inference_graph.pb
model.ckpt.data-00000-of-00001
model.ckpt.index
model.ckpt.meta
saved_model
接下来,需要下载基础配置文件。从样本配置页面(http://pyimg.co/r2xql)下载
ssd_inception_v2_pets.config
文件,并将其移动到dlib车辆数据集目录并重命名:
$ cd dlib_front_and_rear_vehicles_v1/experiments/training
$ mv ~/Downloads/ssd_inception_v2_pets.config ssd_vehicles.config
2. 配置文件的更新
和之前更新Faster R - CNN的配置一样,我们也需要对SSD的配置文件进行更新。
-
设置类别数量
:由于我们有两个类别标签,即车辆的“前部”和“后部”视图,所以将
num_classes
设置为2:
7
model {
8
ssd {
9
num_classes: 2
10
box_coder {
11
faster_rcnn_box_coder {
12
y_scale: 10.0
13
x_scale: 10.0
14
height_scale: 5.0
15
width_scale: 5.0
16
}
17
}
-
设置微调检查点
:将
train_config中的fine_tune_checkpoint指向下载的SSD + Inception模型检查点:
150
fine_tune_checkpoint: "/home/adrian/pyimagesearch/dlbook/ssds_and_rcnn/
151
dlib_front_and_rear_vehicles_v1/experiments/training/
152
ssd_inception_v2_coco_2017_11_17/model.ckpt"
153
from_detection_checkpoint: true
注意,这里的路径需要根据实际情况进行修改。
-
设置训练步数
:可以让模型最多训练200,000步,但在75,000 - 100,000步时也能获得相近的精度:
134
train_config: {
135
batch_size: 24
136
...
137
num_steps: 200000
138
...
139
}
-
更新训练和评估输入读取器
:将
train_input_reader指向训练记录文件和类别标签文件:
167
train_input_reader: {
168
tf_record_input_reader {
169
input_path: "/home/adrian/pyimagesearch/dlbook/ssds_and_rcnn/
170
dlib_front_and_rear_vehicles_v1/records/training.record"
171
}
172
label_map_path: "/home/adrian/pyimagesearch/dlbook/ssds_and_rcnn/
173
dlib_front_and_rear_vehicles_v1/records/classes.pbtxt"
174
}
同时,将
eval_input_reader
指向测试记录文件和类别标签文件:
181
eval_input_reader: {
182
tf_record_input_reader {
183
input_path: "/home/adrian/pyimagesearch/dlbook/ssds_and_rcnn/
184
dlib_front_and_rear_vehicles_v1/records/training.record"
185
}
186
label_map_path: "/home/adrian/pyimagesearch/dlbook/ssds_and_rcnn/
187
dlib_front_and_rear_vehicles_v1/records/classes.pbtxt"
188
shuffle: false
189
num_readers: 1
190
}
另外,建议根据使用的设备更新
eval_config
中的
num_examples
,如果使用GPU可以使用全部示例,如果使用CPU则设置为5 - 10:
174
eval_config: {
175
num_examples: 382
176
# Note: The below line limits the evaluation process to 10 evaluations.
177
# Remove the below line to evaluate indefinitely.
178
#max_evals: 10
179
}
3. 训练和评估过程
在正确设置文件路径后,就可以开始训练了。打开一个新的终端,确保从
ssds_and_rcnn
目录执行
setup.sh
以设置
PYTHONPATH
,然后切换到
models/research
目录并执行以下命令:
$ source setup.sh
$ cd ~/models/research
$ python object_detection/train.py --logtostderr \
--pipeline ~/ssds_and_rcnn/dlib_front_and_rear_vehicles_v1/
experiments/training/ssd_vehicles.config \
--train_dir ~/ssds_and_rcnn/dlib_front_and_rear_vehicles_v1/
experiments/training
训练过程开始后,还需要运行评估脚本:
$ python object_detection/eval.py --logtostderr \
--pipeline_config_path ~/ssds_and_rcnn/dlib_front_and_rear_vehicles_v1/
experiments/training/ssd_vehicles.config \
--checkpoint_dir ~/ssds_and_rcnn/dlib_front_and_rear_vehicles_v1/
experiments/training \
--eval_dir ~/ssds_and_rcnn/dlib_front_and_rear_vehicles_v1/experiments
同时,还可以使用TensorBoard来可视化训练过程:
$ cd ~/pyimagesearch/dlbook/ssds_and_rcnn/
$ tensorboard --logdir dlib_front_and_rear_vehicles_v1/experiments
训练过程的流程图如下:
graph LR
A[下载预训练模型] --> B[下载配置文件]
B --> C[更新配置文件]
C --> D[设置文件路径]
D --> E[开始训练]
E --> F[运行评估脚本]
F --> G[使用TensorBoard可视化]
4. SSD模型的导出和应用
训练完成后,我们可以导出模型:
$ cd ~/models/research
$ python object_detection/export_inference_graph.py --input_type image_tensor \
--pipeline_config_path ~/ssds_and_rcnn/dlib_front_and_rear_vehicles_v1/experiments/
training/ssd_vehicles.config \
--trained_checkpoint_prefix ~/ssds_and_rcnn/dlib_front_and_rear_vehicles_v1/
experiments/training/model.ckpt-200000 \
--output ~/ssds_and_rcnn/dlib_front_and_rear_vehicles_v1/experiments/exported_model
导出模型后,就可以将其应用到示例图像上:
$ python predict.py \
--model dlib_front_and_rear_vehicles_v1/experiments/
exported_model/frozen_inference_graph.pb \
--labels dlib_front_and_rear_vehicles_v1/records/classes.pbtxt \
--image path/to/input/image.png \
--num-classes 2
在应用模型进行检测时,我们发现SSD通常能够正确检测和标记车辆的“前部”和“后部”视图,但在某些情况下,检测正确但标签错误。这可能不是检测器本身的问题,也不一定是优化器或超参数的问题,有时候可能是数据集或训练框架的局限性导致的。
5. 潜在问题和局限性
使用SSD进行车辆检测时,可能会遇到以下两个主要问题:
-
对小物体检测效果不佳
:从检测结果可以看出,SSD对小车辆的检测效果不好。可以通过增加输入图像的分辨率来缓解这个问题,但如果要检测远处的小车辆,可能需要考虑使用Faster R - CNN框架,不过这会牺牲检测速度。
-
混淆车辆的前后视图
:SSD有时会将车辆的后部视图误分类为前部视图。这部分是因为车辆的前后部虽然语义不同,但在视觉上有很多相似特征,而且TFOD API无法标记图像为“忽略”区域,使得远处车辆的特征可能会干扰训练过程。
总结与后续学习建议
通过上述步骤,我们成功训练了一个SSD模型来识别车辆的前后视图,在数据集上获得了约65.5%的平均精度均值(mAP),并且能够实时运行。SSD框架的实时预测是其主要优点之一,相比之下,Faster R - CNN的速度较慢。
然而,在训练自定义目标检测器时,我们也遇到了一些问题。由于TFOD API没有“忽略图像区域”的概念,我们无法在训练过程中排除可能“混淆”的图像部分,例如密集区域的车辆或远处难以识别的小车辆。这可能会影响SSD的硬负样本挖掘过程,降低性能。
对于想要进一步学习深度学习的人,以下是一些建议:
-
课程学习
:推荐斯坦福大学的cs231n课程(http://cs231n.stanford.edu/),该课程每年春季开课,会在课程大纲页面发布幻灯片和笔记。
-
理论书籍
:阅读Goodfellow等人的《Deep Learning》(http://www.deeplearningbook.org/),这本书提供了更深入的理论知识。
-
社区和论坛
:关注/r/machinelearning和/r/deeplearning子reddit,以及LinkedIn上的Computer Vision Online和Computer Vision and Pattern Recognition群组,与其他学习者交流讨论。
-
文献筛选
:使用Andrej Karpathy的Arxiv Sanity Preserver(http://www.arxiv-sanity.com/)来筛选深度学习预印本。
-
软件跟踪
:关注Keras(https://github.com/fchollet/keras)和mxnet(https://github.com/dmlc/mxnet)的GitHub仓库,及时了解软件更新。
-
新闻订阅
:订阅This Wild Week in AI(http://www.wildml.com/newsletter/)和Deep Learning Weekly(http://www.deeplearningweekly.com/),获取每周的深度学习新闻。
-
博客学习
:关注PyImageSearch.com博客,学习计算机视觉知识。同时,还可以参考Practical Python and OpenCV(http://pyimg.co/ppao)和PyImageSearch Gurus课程(http://pyimg.co/gurus)提升计算机视觉技能。
总之,深度学习是一门既包含科学又包含艺术的领域,不断实践和应用所学知识,才能不断提高自己的能力。如果有任何问题,可以随时咨询相关专业人士。
从零开始训练SSD进行车辆检测
6. 训练结果分析
在本次车辆检测的训练中,我们使用了SSD + Inception架构,并在dlib车辆数据集上进行了200,000步的训练,整个过程在单GPU上大约花费了50小时。训练结束时,损失约为1.7,mAP@0.5约为65.5%。从训练曲线来看,损失一开始较高,然后在200,000步的过程中逐渐下降。继续增加训练步数,对准确率和损失的提升效果并不明显。理想情况下,我们希望损失能低于1,甚至低于1.5,但由于数据集和训练框架的局限性,很难达到这个目标。
下面是训练过程中关键指标的变化情况表格:
| 训练指标 | 初始值 | 训练200,000步后的值 | 理想值 |
| ---- | ---- | ---- | ---- |
| 损失 | 较高 | 约1.7 | 低于1.5 |
| mAP@0.5 | - | 约65.5% | - |
从实际检测结果的可视化来看,SSD模型通常能够正确检测和标记车辆的“前部”和“后部”视图。但也存在一些问题,例如在某些情况下,检测正确但标签错误,或者小车辆被漏检。这进一步验证了前面提到的SSD在小物体检测和区分车辆前后视图方面的局限性。
7. 不同检测框架的对比
为了更清晰地了解SSD在车辆检测中的表现,我们将其与Faster R - CNN进行对比。以下是两者的主要特点对比表格:
| 检测框架 | 检测速度 | 对小物体检测效果 | 训练难度 |
| ---- | ---- | ---- | ---- |
| SSD | 约24 FPS,速度较快 | 对小物体检测效果不佳 | 相对较低 |
| Faster R - CNN | 约9 FPS,速度较慢 | 对小物体检测效果较好 | 相对较高 |
从表格中可以看出,SSD的主要优势在于检测速度快,能够满足实时检测的需求。而Faster R - CNN虽然速度较慢,但在小物体检测方面表现更好。在实际应用中,需要根据具体的需求来选择合适的检测框架。如果对检测速度要求较高,且小物体检测不是关键需求,那么SSD是一个不错的选择;如果需要准确检测远处的小物体,那么Faster R - CNN可能更适合。
8. 应对局限性的策略探讨
针对SSD在车辆检测中遇到的问题,我们可以探讨一些应对策略:
-
数据增强
:通过对数据集进行旋转、翻转、缩放等操作,增加数据的多样性,从而提高模型的泛化能力。例如,可以对车辆图像进行随机旋转,让模型学习到不同角度下车辆的特征。
-
多尺度训练
:在训练过程中,使用不同尺度的输入图像,让模型能够适应不同大小的物体。可以在训练时随机选择不同分辨率的图像输入到模型中,这样模型就可以学习到不同尺度下车辆的特征。
-
结合其他模型
:可以将SSD与其他对小物体检测效果较好的模型结合使用,例如Faster R - CNN。可以先使用SSD进行快速检测,然后对检测结果中的小物体区域使用Faster R - CNN进行二次检测,以提高小物体的检测准确率。
9. 深度学习学习路径总结
深度学习是一个不断发展和变化的领域,要想在这个领域取得进步,需要持续学习和实践。以下是一个深度学习学习路径的流程图:
graph LR
A[基础课程学习] --> B[理论知识阅读]
B --> C[参与社区交流]
C --> D[关注文献动态]
D --> E[实践项目操作]
E --> F[持续学习和改进]
- 基础课程学习 :可以从斯坦福大学的cs231n课程开始,系统地学习深度学习的基础知识和原理。
- 理论知识阅读 :阅读《Deep Learning》等理论书籍,深入理解深度学习的数学原理和算法。
- 参与社区交流 :加入相关的社区和论坛,如/r/machinelearning和/r/deeplearning子reddit,以及LinkedIn上的相关群组,与其他学习者交流经验和心得。
- 关注文献动态 :使用Arxiv Sanity Preserver等工具,及时了解深度学习领域的最新研究成果和发展趋势。
- 实践项目操作 :通过实际项目来应用所学的知识,例如训练自定义的目标检测器,不断提高自己的实践能力。
- 持续学习和改进 :深度学习领域发展迅速,需要不断学习新的知识和技术,改进自己的模型和方法。
10. 结语
通过本次车辆检测的训练实践,我们深入了解了SSD模型的训练过程、优缺点以及可能遇到的问题。虽然SSD在实时检测方面具有明显优势,但也存在一些局限性。在实际应用中,我们需要根据具体需求选择合适的检测框架,并采取相应的策略来应对可能遇到的问题。
同时,深度学习是一个充满挑战和机遇的领域,要想在这个领域取得成功,需要不断学习、实践和创新。希望以上的内容和建议能够对想要学习深度学习的人有所帮助,祝愿大家在深度学习的道路上取得更好的成绩。如果在学习过程中遇到任何问题,不要害怕,积极寻求帮助,不断探索和尝试,相信你一定能够克服困难,实现自己的目标。
超级会员免费看
3万+

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



