每一步超详细 制作自己的voc数据集并通过yolov3训练

首先给大家推荐一下我老师大神的人工智能教学网站。教学不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵黄段子!点这里可以跳转到网站

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的话就是一次丢一半。

点这里可以跳转到人工智能网站

发表评论