1.数据准备
a.labelImage.exe
此处笔者下载的是已经做好的xml等文件。如果是原始图片数据,需要自己标注和按照voc的模式创建对应的文件夹和文件。
数据组织结构:
文件夹Annotations
文件夹ImageSets - 文件夹Main(test.txt, train.txt,trainval.txt,val.txt里面的文件非必须完整)
文件夹JPEGImages
文件 valid_label.py
链接:download
b.voc_label.py
链接:在后面下载的的darknet里面会有这个文件。
(1)下载原始的voc_label.py后,复制了一个
(2) 修改,笔者按照如下的的###处
备注:voc_label.py中低29处,open('xxx', 'rb'),解决了unicode报错的问题。
(3) 使用
切换到voc_label.py目录后,python voc_label.py,会生成2028_train.txt,2028_train.txt,里面都是图片的绝对路径。
c.obj.names
如下改成你自己的类别名称即可。
d.voc.data
原始截图:
classes = 20 ### 自己需要分几类
train = data/train_voc.txt ### 执行voc_label.py后生成的2028_train.txt的路径
valid = data/val_voc.txt ### 执行voc_label.py后生成的2028_val.txt的路径
names = data/voc.names ### 自己的obj.names文件的路径
backup = backup/ ### 后面执行darknet训练后,保存权重weights文件的路径
修改完后,保存即可。
e.cfg 模型文件
基于tiny-yolo-voc.cfg进行修改,复制一个进行修改如下:
此外,learning_rate和max_batches也可以修改。
备注:
yolov3或者tiny-yolov3中,filter = (classes + 4 + 1)*3
例如:mask =1,2,3 classes = 80 num = 9 filter = 3*(80+4+1) = 255
yolov3 从下往上三个yolo层,classes,filters,randam = 1开启多尺度训练 0关闭多尺度训练,最近的filters = 3*(5+classes)
tiny-yolov3中从下往上二个yolo层,classes,filters,randam = 1开启多尺度训练 0关闭多尺度训练,最近的filters = 3*(5+classes)
Training #训练模式,每次前向的图片数目batch/subvisionvisions
batch = 64 #每个迭代训练的图片数
subvisionvisions = 8 #将每个迭代分成subvisionvisions次训练
更多参考:https://blog.csdn.net/a417197457/article/details/80225001
2.初始参数准备(非必须)
链接:download
此处使用darknet19_448.conv.23进行参数初始化
3.网络准备
(1)下载cuda8.0+cudnn7.0.5,下载opencv3.1(win下的exe),并安装好。
(2)下载好win下的darknet。
链接:download
(3.1) 编译darknet(使用gpu)
a.配置cuda相关的路径。
详细参考:https://www.cnblogs.com/lyx2018/p/7905856.html
b.管理员身份启动vs2015,打开build文件夹下面的darknet.sln,切换到Release x64模式。
c.用的cuda10的话貌似不需要这一步,没有尝试过。笔者使用的是cuda8.0+cudnn7.0.5,需要以下的配置。
(3.2) 编译darknet_no_gpu(使用cpu)
a.管理员身份启动vs2015,下载好的darknet,打开build文件夹下面的darknet_no_gpu.sln,切换到Release x64模式。
b.配置opencv
c.编译此项目即可在x64下生成darknet_no_gpu.exe。
4.训练
a.管理员模式命令行,切换到darknet生成的exe目录下
b1.使用gpu训练,执行以下命令(二选一):
darknet detector train data/voc_my.data cfg/tiny-yolo-voc_my2obj.cfg wiehts/darknet19_448.conv.23(使用初始化参数)
darknet detector train data/voc_my.data cfg/tiny-yolo-voc_my2obj.cfg(不使用初始化参数)
b2. 使用cpu训练,执行以下命令(二选一):
darknet_no_gpu detector train data/voc_my.data cfg/tiny-yolo-voc_my2obj.cfg wiehts/darknet19_448.conv.23(使用初始化参数)
darknet_no_gpu detector train data/voc_my.data cfg/tiny-yolo-voc_my2obj.cfg(不使用初始化参数)
笔者此处使用的gpu训练,学习率0.001,迭代40200次,在gpu1060上运行约10小时。
训练完成结束截图:
5.测试
a.管理员模式命令行,切换到darknet生成的exe目录下
b1.如果使用gpu训练,执行以下命令:
darknet.exe detector detect test data/voc.data cfg/tiny-yolo-voc_my2obj.cfg backup/tiny-yolo-voc_my2obj_final.weights gr.jpg
b2.如果使用cpu训练,执行以下命令:
darknet_no_gpu.exe detect test data/voc.data cfg/tiny-yolo-voc_my2obj.cfg backup/tiny-yolo-voc_my2obj_final.weights gr.jpg
测试结果截图: