YOLOV3的编译及训练(Windows10)

1.所用的环境

win10系统

VS2015

CUDA8.0/CUDA9.0(都有试过)

CUDNN6.0

OpenCV3.3

推荐:

我是在release x64下编译的

yolo用不了gpu训练_编译


编译VS与OpenCV编译VS与CUDA

这两个链接写的很好,照着编译就可以,使用与所选版本

另外还需要处理一下cudnn与CUDA比较简单cudnn与CUDA的配置

以上都完成以后我们就可以下载YOLO的相关文件了

2.开始编译YOLO

1.下载darknet文件

https://github.com/AlexeyAB/darknet 2.打开文件中的darknet.vcxproj(用记事本打开)

对其中几处进行修改,

第一个就是CUDA的版本,将CUDA9.1改成CUDA8.0/9.0,在记事本中点编辑可以进行全部替换,挺省事的;

yolo用不了gpu训练_配置_02


第二个就是修改OpenCV的路径(根据自己的路径修改),不用都修改的(VS中配置哪个修改哪个),建议修改release x64,最开始用的是Debug,不过后来报错不会改用了release x64就可以。

yolo用不了gpu训练_YOLO_03


3.由于我之前配置过VS2013,这里提醒一下用VS2013的需要修改一下darknet.sln中对应的版本,当然我们用VS2015就不用修改啦

4.打开darknet.sln,刚开始我可以打开-no gpu版本的,不过打不开darknet.sln也就是带GPU的,这是因为GPU没有配置好(配置之后一定要验证),或者就是忘了选解决方案release x64,在release上配置CUDA和OPENCV,在debug上当然不好用(当然配置debug就选debug)。

5.编译上面说的darknet.sln,如果生成成功,那么基本就完事了,如果缺少某个库文件就会报错,所以在配置CUDA和OpenCV一定要仔细。

3.测试结果

1.去官网下载yolov3.weights(放在…\darknet\build\darknet\x64下)

https://pjreddie.com/media/files/yolov3.weights 2.点击win+R输入CMD打开终端,切换到…\darknet\build\darknet\x64这个路径下

3.输入检测图片的命令

darknet.exe detector test data/coco.data yolov3.cfg yolov3.weights dog.jpg

这样可以直接显示一张图片

yolo用不了gpu训练_训练_04


4.不仅可以检测图片,还可以开启摄像头进行检测和检测视频(不能保存,需要保存可能要改部分代码)

摄像头命令:darknet.exe detector demo data\coco.data yolov3.cfg weights\yolov3.weights

视频命令:.\darknet detector demo cfg\coco.data cfg\yolov3.cfg yolov3.weights test.avi(test.avi类似视频放在x64路径下面)

5.还有个比较有意思的可以使用手机摄像头,给一个链接写的很好,感兴趣照着做就可以:

到这里就已经调通Yolo了,下面就来说明如何训练以用来实际应用 。

4.YOLO的训练

1.当然是选择数据集了,我训练的是栅栏,没有相关数据集所以自己制作了一个数据集, 大概搜集了100张图片,放在新建文件夹(fence_image)中,然后将其放在D:\darknet-master\build\darknet\x64\data下面

2.标注图片,我用的是YOLO_mark(yolo自带的标注工具,当然也可以选用labeling),

yolo_mark的使用教程参考此链接

标注以后是这样的,每张图片都生成一个对应txt文本

yolo用不了gpu训练_yolo用不了gpu训练_05


yolo用不了gpu训练_YOLO_06


第一个数字0代表类别,后四个代表目标的坐标,如果使用labeling标注要转换成txt格式。

3.在D:\darknet-master\build\darknet\x64下面新建一个fence.txt的空文本,然后将下面程序放在D:\darknet-master\build\darknet\x64\data下面并运行,

import glob
path = 'data/'
def generate_train(image_path, txt_file):
    with open(txt_file, 'w') as tf:
        for jpg_file in glob.glob(image_path + '*.jpg'):
            tf.write(jpg_file + '\n')
generate_train(path + 'fence_image/', path + 'fence.txt')

运行完成程序就可以看到fence.txt是这样的

yolo用不了gpu训练_YOLO_07


4.在D:\darknet-master\build\darknet\x64\data中新建文件fence.names和fence.data(新建文本改后缀即可),填写fence.names中的内容,就是类别名字

yolo用不了gpu训练_yolo用不了gpu训练_08


填写fence.data(内容可以到coco.data里面复制,然后修改成蓝色区域的样子,我没有用测试集,所以把测试的那一行删掉了)

yolo用不了gpu训练_训练_09


classes是类别数,到这里已经完成大部分啦

5.要新建一个fence.cfg放在D:\darknet-master\build\darknet\x64下(直接复制yolov3.cfg,然后重命名并修改以下内容)

yolo用不了gpu训练_训练_10


这里的batch和subdivision的设置为

batch=32(如果显卡够强可以设64)

subdivisinotallow=8

有的网上说可以都设置为1,我试了不过效果不好,不建议设置为1,如果显示显卡溢出(out of memory)可以选择多尺度训练(修改为random=0,在最后一行处)或者适当减小batch(减的太多效果不好),然后修改类数以及滤波器数量如下

yolo用不了gpu训练_yolo用不了gpu训练_11


6.到这里准备工作基本做好啦,接下来下载预训练权重,将其放在D:\darknet-master\build\darknet\x64下:

https://pjreddie.com/media/files/darknet53.conv.74 7.正式开始训练

使用以下命令进行训练(还是在输入测试命令的地方输入)

.\darknet detector train cfg\fence.data fence.cfg darknet53.conv.74

小于1000次每100保存一份权重,大于1000次每1000保存一份权重,当avg loss几乎不变时就可以停止训练(我训练的大概在0.1以下收敛的训练的速度还挺快的)

8最后一步进行测试

输入测试命令:

.\darknet detector test data\fence.data fence.cfg backup\fence_last.weights test\1.jpg

就可以得到下面的结果啦

yolo用不了gpu训练_YOLO_12


9.问题

我第一次训练的图片上没有框,然后修改了阈值:

.\darknet detector test data\fence.data fence.cfg backup\fence_last.weights test\1.jpg -thresh 0.1

这样就有框了不过效果并不好(下面图片的名字可以忽略,因为我开始的测试命令没加data\fence.data,这样就是默认用CoCo数据集的名字,后来就改好啦)

yolo用不了gpu训练_编译_13


yolo用不了gpu训练_编译_14


遇到这种问题就说明你的模型没有训练好,我开始将batch和subdivision设置为1的时候就出现了这种问题,后来batch=32,subdivisinotallow=8在训练出来的结果就不会出现没有框的情况了。

5. 致谢

非常感谢文中链接的帮助,由于很多就不一 一例举啦