1 把自己的数据集打标记
用labelImg生成的是xml格式标记文件
https://blog.csdn.net/qq_34806812/article/details/81670310
https://blog.csdn.net/qq_34806812/article/details/81394646
这里建议大家用VOC和ILSVRC比赛的数据集,因为xml文件都是现成的,省去很多功夫。
或者可以去下载现成的数据集
ILSVRC2015比赛的地址是: http://image-net.org/challenges/LSVRC/2015/download-images-3j16.php
VOC 比赛地址是: http://host.robots.ox.ac.uk/pascal/VOC/index.html
标记文本的解释:https://blog.csdn.net/qq_34806812/article/details/82355614
2 整理数据集路径格式:
2.1 建立文件夹层次为 darknet / VOCdevkit / VOC2018,voc2018下面有三个文件夹:
2.2 JPEGImages放所有的训练图片,annotation放所有的xml标记文件。
2.3 Imagesets包含两个文件夹:
3 生成txt标签和list文件
3.1 Main包下新建3个txt:
里面的txt内容格式为图片名(不带后缀):
(生成train.txt的教程:
把一个文件夹中的所有文件名统计到一个txt中 https://blog.csdn.net/qq_34806812/article/details/81674290)
3.2 修改voc_label.py(根据自己情况修改):
3.3 运行voc_label.py
运行后发现label文件夹下面已经生成了对应的txt标签
同时发现在vocdevkit同目录下也生成了5个list文件
打开发现路径也自动写好了:
4 修改需要的各种配置文件
4.1 新建 cfg/voc_birds.data:(可以复制cfg/voc.data进行根据自己情况的修改)
4.2 新建data / voc_birds.names:(可以复制data/voc.names 进行根据自己情况的修改)
4.3 新建cfg / yolov3-voc-birds.cfg:(可以复制cfg/yolov3-voc.cfg 进行根据自己情况的修改)
修改如下:
4.3.1 注释掉testing,打开train
4.3.2 subdivisions=8
4.3.3 共三个yolo层都要改,yolo层中的class为类别数,每一个yolo层前的conv层中的filters =(类别+5)* 3
5 在darknet目录下载权重文件:
wget https://pjreddie.com/media/files/darknet53.conv.74
6 训练
nohup ./darknet detector train cfg/voc_birds.data cfg/yolov3-voc-birds.cfg darknet53.conv.74 2>1 | tee visualization/train_yolov3_birds.log &
nohup $ 是防止因为ssh断开而中断服务器的进程(如果出现“找不到nohup文件”的错误,去掉命令中的“nohup ... &”)
2>1 | tee visualization/train_yolov3_birds.log 是为了保留训练中的log,为了后续绘制loss曲线。
训练开始:
训练直到loss下降到0.0X之后,不再下降了,就可以停止训练了:
7.测试
训练好后可以在backup看到权重文件,
尝试test前要修改cfg文件,切换到test模式:
开始测试:
./darknet detector test cfg/voc_birds.data cfg/yolov3-voc-birds.cfg backup/birds/yolov3-voc-birds.weights
测试结果:
绘制训练中的loss、IOU等变化曲线的教程:https://blog.csdn.net/qq_34806812/article/details/81459982
8.问题集锦
8.1 问题:CUDA Error: out of memory
解决:增大cfg文件中subdivisions,16、32或者64(最多为batch值)
subdivision:这个参数很有意思的,它会让你的每一个batch不是一下子都丢到网络里。而是分成subdivision对应数字的份数,一份一份的跑完后,在一起打包算作完成一次iteration。这样会降低对显存的占用情况。如果设置这个参数为1的话就是一次性把所有batch的图片都丢到网络里,如果为2的话就是一次丢一半。