手把手教你用深度学习做物体检测(三):模型训练
本篇文章旨在快速试验使用yolov3算法训练出自己的物体检测模型,所以会重过程而轻原理,当然,原理是非常重要的,只是原理会安排在后续文章中专门进行介绍。所以如果本文中有些地方你有原理方面的疑惑,也没关系,可以自行网上搜索相关资料,也可以先留着问题,相信你会在后续文章中找到答案。
上篇文章《手把手教你用深度学习做物体检测(二):数据标注》中已经介绍了如何准备我们训练模型需要用到的数据,上篇文章中有个需要注意的地方就是在生成yolov3所需格式的文件时,务必在unbuntu下生成,我之前在windows下生成然后传到ubuntu上去的,其中的路径需要手动修改成unbuntu下的路径,而且后面在unbuntu下训练的时候会遇到编码问题导致报错。数据以及目录结构如下图:
进入下一步前,请确保你准备好了上面的数据并放到了相应的目录结构下,如果你还不太清楚如何准备这些数据,建议先看看上一篇文章《手把手教你用深度学习做物体检测(二):数据标注》。
数据准备好之后,我们需要找一个基于yolov3算法实现的成熟的训练框架,网上有很多文章都提及到了下面这三个项目:
https://github.com/qqwweee/keras-yolo3 ,基于keras编写
https://github.com/pjreddie/darknet ,基于c++编写
https://github.com/AlexeyAB/darknet , 基于c++编写
这里推荐上面的第三个,也就是AlexeyAB/darknet项目。原因有3点:
-
该项目最近的修改时间是2019-04-16,也就是说仍然在持续维护,而另外两个项目最早的也是7个月前了。
-
该项目的文档非常详细,比另外两个项目都详细很多。
-
该项目支持在训练过程中实时观测损失值、mAP等重要指标的变化趋势。
注意:下面的一切操作若无特殊说明,都是在unbuntu18.04桌面版操作系统环境下,并且假设你已经准备好了深度学习所需的硬件及软件环境,如果没有,可以参照这篇文章《如何在阿里云租一台GPU服务器做深度学习?》。
ok,让我们进入模型训练正式内容。-首先,下载AlexeyAB/darknet项目。-然后,进入项目目录,参考官网编译该项目。-接着,创建names-data目录 。-将2007_test.txt和2007_train.txt两个文件放到 names-data目录下。-下载预训练的权重文件: http://pjreddie.com/media/files/darknet53.conv.74 ,放置到names-data目录下,训练会在该文件的基础之上进行,这样会比较快收敛,若暂时不明白也不要紧,继续往后就行了。-拷贝cfg/yolov3-voc.cfg文件到 names-data目录下,重命名为:yolo-obj.cfg,该文件中有基础需要修改如下:
- names-data目录下创建voc.names文件,内容是你的目标类别,举例如下:
- names-data目录下创建backup目录
-names-data目录下创建voc.data文件,内容如下:
-确保VOCdevkit目录的路径同2007_test.txt、2007_train.txt两个文件中记录的图片路径所在目录一致。
-接下来,打开终端,输入训练命令:
./darknet detector train names-data/voc.data names-data/yolo-obj.cfg names-data/darknet53.conv.74 -gpus 1 -map
# 如果中途中断了,可以从backup目录下,找到最新的.weights文件或任意迭代周期生成的.weights文件,在此基础上继续训练,命令如下:
./darknet detector train names-data/voc.data names-data/yolo-obj.cfg names-data/backup/yolo-obj_last.weights -gpus 1 -map
我的目标类别是12类,每类大概有800张,迭代到3000次以后,平均损失值开始收敛,在0.5左右,另外由于测试样本和训练样本来此同一批次采集,只是拍摄角度距离不同,并且没有引入负样本,所以mAP的值可以接近100%。这里损失值、mAP什么的如果你暂时还不清楚具体的意义,也没关系,在后续的文章中会有介绍,这里可以先直观上理解为平均损失值越小越好,mAP越接近1越好就行了。训练时间在RTX-2060上大概是3个小时左右。训练结束后,我得到下面的模型文件:
ok,到此模型训练过程就结束了,此时你一定想要试试模型的识别情况怎么样,你可以使用AlexeyAB/darknet项目提供的命令:
--检测图片
./darknet detector test names-data/voc.data names-data/yolo-obj.cfg names-data/backup/yolo-obj_3000.weights -ext_output names-data/images/IMG_0728.JPG
--检测视频
./darknet detector demo names-data/voc.data names-data/yolo-obj.cfg names-data/backup/yolo-obj_3000.weights -ext_output names-data/videos/food52hd.mp4 -out_filename names-data/videos/food52hd_detect.mp4
此时,如果顺利,你将会看到目标被检测出来了,但是有一个问题,就是所有的中文都显示成了乱码,如果你想快速知道类别检测的对不对,可以将names-data目录下的voc.names文件内容改为英文,此时你将会看到类别正常显示出来了,但是没有显示对应的置信度,置信度可以直观上理解为该目标为当前显示类别的概率以及该矩形检测框位置的置信度,所以如果有置信度的显示,便于我们进一步了解目标检测的情况。
关于中文乱码和置信度缺失的问题,由于本篇文章已经够长的了,所以将会在下一篇《手把手教你用深度学习做物体检测(四):模型使用》中进行阐述,下一篇文章中,我们会基于python来实现一个模型使用程序,以及为什么非要用python来重新实现一个模型使用程序的原因。
ok,本篇就这么多内容啦~,感谢阅读O(∩_∩)O,88~
名句分享
赵客缦胡缨,吴钩霜雪明。银鞍照白马,飒沓如流星。
十步杀一人,千里不留行。事了拂衣去,深藏身与名。
闲过信陵饮,脱剑膝前横。将炙啖朱亥,持觞劝侯嬴。
三杯吐然诺,五岳倒为轻。眼花耳热后,意气素霓生。
救赵挥金槌,邯郸先震惊。千秋二壮士,煊赫大梁城。
纵死侠骨香,不惭世上英。谁能书閤下,白首太玄经。
赵客缦胡缨,吴钩霜雪明。银鞍照白马,飒沓如流星。
十步杀一人,千里不留行。事了拂衣去,深藏身与名。
闲过信陵饮,脱剑膝前横。将炙啖朱亥,持觞劝侯嬴。
三杯吐然诺,五岳倒为轻。眼花耳热后,意气素霓生。
救赵挥金槌,邯郸先震惊。千秋二壮士,煊赫大梁城。
纵死侠骨香,不惭世上英。谁能书閤下,白首太玄经。
—— 《侠客行》【唐】李白
为您推荐