Win10 +VS2015+双gtx Titan X使用YOLO v2训练VOC数据

其他博客地址:http://blog.csdn.net/baolinq

    本文主要是记录在win10下,yolo v2训练数据的一整个过程,网上很多是在linux下的,不得不说这个东西还是linux下方便啊,主要依赖项:

VS2015或者VS2013都可以

Opencv2.x或者opencv3.x

Cuda8.0和cudnn6.0

GitHub上下载darknet源码

最近老师给配了一个深度学习专用的电脑,两路Titan X显卡+i7 6700K+SSD 256G+HD 4T(企业级),自己组装,搞了一下午(电脑硬件小白)。然后装双系统,配环境,真的是麻烦,搞了很久。磨刀不误砍柴工,为了以后效率高点还是值得的。

    好了,不扯淡了。回到正题,使用YOLO v2训练VOC数据,我觉得使用yolo的朋友应该都是看上了它的速度,可以做到实时检测,这是最大的优点。

1.  配环境

装cuda和cudnn环境,这里就不说了,直接官网下载下来一路默认安装就好了,本文使用cuda8.0和cudnn6.0,cudnn下载的时候需要注册和填一个调查问卷,很简单这里就不谈了,网上也有很多是写这个的。配好在cmd窗口运行nvcc –V,有出现

目标检测之三 Win10 +VS2015+双gtx Titan X使用YOLO v2训练VOC数据

表示安装成功。

为了显示图像,这里还安装了opencv,随便选一个版本,我装了opencv2.413,具体安装方法见我转载的博客(),并把环境配好,主要是环境变量和VS是属性管理器。

 

2.  编译源文件

从GitHub上下载darknet网络的源代码,在darknet-master\build\darknet目录下有这些文件,包括gpu版本和cpu版本,我们这里选择darknet.vcxproj,即是gpu版本,用VS

打开一般是出错的,不能正确加载项目,这是正常的。如果是no gpu版本的是能正常打开的,它并不依赖cuda的环境。

目标检测之三 Win10 +VS2015+双gtx Titan X使用YOLO v2训练VOC数据

这里有一个很关键 的步骤,因为我们的cuda环境没有加入到相应的VS里面去,作者是用属性文件.props文件配置的工程,所以我们需要把cuda的一些props文件等加到相应的VS

版本里面去,很简单。复制几个文件到另一个地方就行了。我们查找发现project文件里面有两处关于cuda8.0的文件,props和target文件,找到他们复制到VS环境中即可。Darknet.project文件用notepad++打开,看到如下内容:

  <ImportGroupLabel="ExtensionSettings">

    <ImportProject="$(VCTargetsPath)\BuildCustomizations\CUDA 8.0.props" />

 

  <ImportGroup Label="ExtensionTargets">

<ImportProject="$(VCTargetsPath)\BuildCustomizations\CUDA 8.0.targets" />

 

把cuda里面的这个文件夹C:\Program Files\NVIDIA GPU ComputingToolkit\CUDA\v8.0\extras\visual_studio_integration\MSBuildExtensions

目标检测之三 Win10 +VS2015+双gtx Titan X使用YOLO v2训练VOC数据

所有的文件复制到

C:\ProgramFiles (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\BuildCustomizations(注意:我的是VS2015,所以是v140,不同版本加到不同的文件夹下)

文件夹下面即可。

 目标检测之三 Win10 +VS2015+双gtx Titan X使用YOLO v2训练VOC数据

不出意外,现在就能正确打开darknet.project。然后把include文件、lib文件的路径和lib文件名添加到VS的属性中即可

(注:上图来源于网络http://blog.csdn.net/qq_14845119/article/details/53612362,偷个懒~~)

 

然后把lib文件夹下的lib文件名添加到连接器的输入里面的附加依赖项,我的如下:

pthreadVC2.lib

cublas.lib

curand.lib

cudart.lib

opencv_core2413.lib

opencv_highgui2413.lib

opencv_imgproc2413.lib

 

注意:一定要添加自己对应的版本,不要复制别人的哈~

 

环境配好了之后,就可以直接点击重新生成文件,正常情况下不会出错,有出错发到评论大家一起看看.这样就会生成darknet.exe文件。你可以去看一下main函数,在darknet.c文件里,根据不同的输入参数,进入不同函数,执行不同的功能。

目标检测之三 Win10 +VS2015+双gtx Titan X使用YOLO v2训练VOC数据

3.  开始训练

先准备数据,我是新手,先使用VOC的数据试试水,如果用其他数据(自己的数据或者kitti数据等等),可以先转化为voc数据格式的,GitHub上有很多源码教程,这里不谈了。

根据源代码里面的scripts文件夹下的voc_label.py文件把voc数据格式稍作变换,使yolo网络能使用。

你把准备好的数据放到scripts文件夹下,一定做成和VOC一样的格式。包含以下几个文件夹Annotations,ImageSets,JPEFImages,SegmentationClass,SegmentationObject;(不做分割,后面两个应该可以不用)Annotations中是放着所有图片的标记信息,以xml为后缀名.以分类检测的数据为例,打开ImageSets中的layout,

 目标检测之三 Win10 +VS2015+双gtx Titan X使用YOLO v2训练VOC数据

根据实际情况修改voc_label.py文件,主要是设置sets和classes,以及数据的目录和输出目录,我的是设置为3类只检测车(car、bus)和人(person)。

在cmd窗口执行python voc_label.py后,会生成label文件夹里面是每个图片的groundtruth 的框坐标信息txt格式,还会在scripts目录生成2007_train.txt文件。图片的绝对路径。

 目标检测之三 Win10 +VS2015+双gtx Titan X使用YOLO v2训练VOC数据

根据自己的需求配置网络结构文件.cfg文件

 目标检测之三 Win10 +VS2015+双gtx Titan X使用YOLO v2训练VOC数据

darknet网络文件,很多参数都可以改,像batch、learningrate等等,根据实际训练情况调参。

必改的地方:最后一层filters的个数,根据classes个数决定,将它改成「(你的类别数+5)×5」。更准确地说,「this depends on the num and coords, i.e. equal to (classes +coords + 1)*num」。

Classes为你的类别数

还有就是voc.names文件,是object的种类名称,就写为你自己的classes的名称就好了

例如我的是

bus

car

person

 

最后一个是voc.data文件,修改后的内容如下

classes= 3

train  =D:\HBL_data\object_detect\darknet-master\scripts/2007_train.txt

//valid  = /home/pjreddie/data/voc/2007_test.txt

names = data/voc-3.names

backup =D:\HBL_data\object_detect\darknet-master/backup/

 

就是种类数,train数据集的文件位置,前面voc_label.py生成的txt文件,我没有用valid,注释掉,names是自己修改后的voc.names路径,backup是训练好的权重文件,前1000轮是每100轮保存一次权重文件,之后是每1000轮保存一次文件。

 

万事俱备,只欠东风了。

下载预训练权重(http://pjreddie.com/media/files/darknet19_448.conv.23)

 

新建一个cmd文件写上内容如下,直接放到cmd窗口也可以

darknet.exe detector train data/voc-3.data cfg/yolo-3.cfg pre_model/ darknet19_448.conv.23-gpus 0,1

含义如下:程序名 模块名称 动作(train 还是test等) data配置文件 cfg配置文件权重文件 –gpus (使用的gpu编号,有多个才需要写,0,1,2,3之类的,我这里是2个)

然后就出现了下面的截图:

 目标检测之三 Win10 +VS2015+双gtx Titan X使用YOLO v2训练VOC数据

从上图看到,gpu的显存只是用了3G多,但是gpu的利用率(指计算能力)却到了99%,说明这个网络的计算量很大呀,虽然显存占用不大。

我的训练过程还没结束,从下午3点到此时晚上8点,5个小时,训练了14000轮,我给的maxbatch是25000,还有10000多轮呢。

过几天用kitti的数据集再做些实验,十几个G的数据已经下载完备,哈哈。

参考文献

[1]https://pjreddie.com/darknet/yolo/  官网提供了很多训练好的模型,很良心

[2]https://arxiv.org/abs/1612.08242  yolo v2论文原文

[3] https://github.com/pjreddie/darknet  github源码

[4]还有很多优秀的博客,感谢他们的贡献

好了,本篇就到此结束,废话有点多了~~有问题欢迎底下评论交流