YOLOV3的编译及训练(Windows10)
1.所用的环境
win10系统
VS2015
CUDA8.0/CUDA9.0(都有试过)
CUDNN6.0
OpenCV3.3
推荐:
我是在release x64下编译的
编译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,在记事本中点编辑可以进行全部替换,挺省事的;
第二个就是修改OpenCV的路径(根据自己的路径修改),不用都修改的(VS中配置哪个修改哪个),建议修改release x64,最开始用的是Debug,不过后来报错不会改用了release x64就可以。
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
这样可以直接显示一张图片
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.还有个比较有意思的可以使用手机摄像头,给一个链接写的很好,感兴趣照着做就可以:https://blog.csdn.net/baidu_36669549/article/details/81510955?utm_source=app
到这里就已经调通Yolo了,下面就来说明如何训练以用来实际应用 。
4.YOLO的训练
1.当然是选择数据集了,我训练的是栅栏,没有相关数据集所以自己制作了一个数据集, 大概搜集了100张图片,放在新建文件夹(fence_image)中,然后将其放在D:\darknet-master\build\darknet\x64\data下面
2.标注图片,我用的是YOLO_mark(yolo自带的标注工具,当然也可以选用labeling),
yolo_mark的使用教程参考此链接https://blog.csdn.net/heiheiya/article/details/83506913?utm_source=app
标注以后是这样的,每张图片都生成一个对应txt文本
第一个数字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是这样的
4.在D:\darknet-master\build\darknet\x64\data中新建文件fence.names和fence.data(新建文本改后缀即可),填写fence.names中的内容,就是类别名字
填写fence.data(内容可以到coco.data里面复制,然后修改成蓝色区域的样子,我没有用测试集,所以把测试的那一行删掉了)
classes是类别数,到这里已经完成大部分啦
5.要新建一个fence.cfg放在D:\darknet-master\build\darknet\x64下(直接复制yolov3.cfg,然后重命名并修改以下内容)
这里的batch和subdivision的设置为
batch=32(如果显卡够强可以设64)
subdivision=8
有的网上说可以都设置为1,我试了不过效果不好,不建议设置为1,如果显示显卡溢出(out of memory)可以选择多尺度训练(修改为random=0,在最后一行处)或者适当减小batch(减的太多效果不好),然后修改类数以及滤波器数量如下
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
就可以得到下面的结果啦
9.问题
我第一次训练的图片上没有框,然后修改了阈值:
.\darknet detector test data\fence.data fence.cfg backup\fence_last.weights test\1.jpg -thresh 0.1
这样就有框了不过效果并不好(下面图片的名字可以忽略,因为我开始的测试命令没加data\fence.data,这样就是默认用CoCo数据集的名字,后来就改好啦)
遇到这种问题就说明你的模型没有训练好,我开始将batch和subdivision设置为1的时候就出现了这种问题,后来batch=32,subdivision=8在训练出来的结果就不会出现没有框的情况了。
5. 致谢
非常感谢文中链接的帮助,由于很多就不一 一例举啦