资源经验分享手把手教你用深度学习做物体检测(三):模型训练

手把手教你用深度学习做物体检测(三):模型训练

2019-11-23 | |  59 |   0

原标题:手把手教你用深度学习做物体检测(三):模型训练

原文来自:博客园      原文链接:https://www.cnblogs.com/anai/p/11455320.html


本篇文章旨在快速试验使用yolov3算法训练出自己的物体检测模型,所以会重过程而轻原理,当然,原理是非常重要的,只是原理会安排在后续文章中专门进行介绍。所以如果本文中有些地方你有原理方面的疑惑,也没关系,可以自行网上搜索相关资料,也可以先留着问题,相信你会在后续文章中找到答案。

上篇文章《手把手教你用深度学习做物体检测(二):数据标注》中已经介绍了如何准备我们训练模型需要用到的数据,上篇文章中有个需要注意的地方就是在生成yolov3所需格式的文件时,务必在unbuntu下生成,我之前在windows下生成然后传到ubuntu上去的,其中的路径需要手动修改成unbuntu下的路径,而且后面在unbuntu下训练的时候会遇到编码问题导致报错。数据以及目录结构如下图:

20191118180009718.png

 

进入下一步前,请确保你准备好了上面的数据并放到了相应的目录结构下,如果你还不太清楚如何准备这些数据,建议先看看上一篇文章《手把手教你用深度学习做物体检测(二):数据标注》。       

 

数据准备好之后,我们需要找一个基于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,该文件中有基础需要修改如下:

 newsimg1108_05.png newsimg1108_06.png

newsimg1108_07.png

 - names-data目录下创建voc.names文件,内容是你的目标类别,举例如下:

 

- names-data目录下创建backup目录

 

-names-data目录下创建voc.data文件,内容如下:

newsimg1108_08.png

 

-确保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

训练过程开始后,除了终端会持续显示训练情况,还会额外出现一个窗口以图形的方式实时展示损失值和mAP的变化情况:

newsimg1108_09.png

 

我的目标类别是12类,每类大概有800张,迭代到3000次以后,平均损失值开始收敛,在0.5左右,另外由于测试样本和训练样本来此同一批次采集,只是拍摄角度距离不同,并且没有引入负样本,所以mAP的值可以接近100%。这里损失值、mAP什么的如果你暂时还不清楚具体的意义,也没关系,在后续的文章中会有介绍,这里可以先直观上理解为平均损失值越小越好,mAP越接近1越好就行了。训练时间在RTX-2060上大概是3个小时左右。训练结束后,我得到下面的模型文件:

newsimg1108_10.png

 

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~

 


免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:几何变换_遮挡

下一篇:NLP系列文章:子词嵌入(fastText)的理解!(附代码)

用户评价
全部评价

热门资源

  • Python 爬虫(二)...

    所谓爬虫就是模拟客户端发送网络请求,获取网络响...

  • TensorFlow从1到2...

    原文第四篇中,我们介绍了官方的入门案例MNIST,功...

  • TensorFlow从1到2...

    “回归”这个词,既是Regression算法的名称,也代表...

  • 机器学习中的熵、...

    熵 (entropy) 这一词最初来源于热力学。1948年,克...

  • TensorFlow2.0(10...

    前面的博客中我们说过,在加载数据和预处理数据时...