任务:
共有100张这样的螺蛳图片用于训练,同样预留了10张这样的图片用于测试
labellmg标记图片时,每张图片需要标记20个螺蛳,每个格子中一个
在训练结束后,用训练完成的权重文件对图片进行测试,观察是否能够识别出图片中螺蛳
使用yolov3训练自己VOC格式的数据集的步骤与训练VOC数据集的步骤大致相同,这里只阐述一些重要的不同点,具体可以参考:
省略的步骤:(可以在上述链接中找到)
一、.准备工作:检查cuda版本,创建项目的文件夹等
二、.安装好darknet
三、.下载权重文件测试一下yolov3(选做)
四、创建所需的文件夹
进入到darknet/scripts目录下,创建如下6个文件夹,缩进代表父目录和子目录的关系
五、标记图片
使用labellmg图片标记工具标记训练图片中的类别,安装和使用教程可以参考官方文档:
https://github.com/tzutalin/labelImg
标记完成后,labellmg会生成相应的XML文档,放入创建的Annotation文件夹中,XML文档的格式如下,其中框住的两处是需要修改的,folder标签为JPEGImages,path标签为JPEGImages所在的绝对路径,路径尾部是图片的名称,这个是可以自由设置的。
六、将图片,XML文件放入指定的文件夹
XML文档放入:Annotation文件夹
图片文件放入:JPEGImages文件夹
在Main文件夹下创建train.txt 和test.txt,里面存放训练集合测试集的图片名称,不包含后缀,每个名称占一行。
000
001
002
003
004
005
006
007
...
093
094
095
096
097
098
099
七、修改darknet/scripts/voc_label.py文件
2020根据上面创建的文件夹的名字来更改,上面创建的是什么就改什么
train和test对应创建的两个txt文件
tips:在vim编辑器中,数字1+G可以快速返回第一行
注释文档最后的两行,这里不需要合并文件
tips:在vim编辑器中,输入G可以快速到最后一行
修改完成后运行该py文件
python voc_label.py
之后,在darknet/scripts文件下就能看到2020_train.txt和2020_test.txt两个文件,里面存储的是训练和测试图片的绝对路径
八、在 darknet/data 目录下创建myvoc.names文件
其实也可以修改原先存在的voc.names文件,这里创建是为了避免混淆,这里创建的文件名称也是自己决定的,后面步骤中把文件名配置对了就可以。
文件的内容就是训练图片的所有类别,每个类别独自占一行,这里我训练的只有一个类别,因此文件内容如下:
九、在 darknet/cfg 目录下修改voc.data文件
classes:类别的数量
train,valid:运行voc_label.py文件生成的训练和测试文件
names:类别名称的文件,也就是上一步创建的文件
backup:训练过程中产生的权重文件保存的位置
十、修改darknet/cfg/yolov3-voc.cfg文件
文件一共需要修改三个地方:将测试状态改为训练状态、修改 filters 的值、修改 classes 的值
1.将测试状态改为训练状态
按照训练图片的数量,batch和subdivisions可以调整,max_batches也适当调小,当损失降低到一定程度时,再训练就没意义了
2.修改 filters 的值
yolov3-voc.cfg中搜索yolo,可以发现一共有三处yolo层,即改网络结构的检测层。因为,yolov3的网络结构就是darknet53+yolo检测层组成的。这里我们修改yolo 检测层前一层的 filters 的值大小。filters 大小利用如下公式计算:
filters = 3×(classes + 1 + 4) ,我这里1个目标,所以 filters 的值为18(注意一共需要改3处)。3代表的是多尺度预测,即yolov3是3次预测,所以乘以3。1代表的是置信度,4代表的是 boxes 的位置,即左顶点的坐标和长宽,四个参数。
tip:输入 :/搜索的字符串 可以在vim中搜索
filters在yolo关键词的上方
3.修改 classes 的值
classes 的值就是自己检测的类别,默认的voc数据集是20种,这里只有一种。注意每一个yolo 层的 classes 值都要修改 ,一共也是三处。
classes在yolo关键词的下方
十一、开始训练
darknet53.conv.74是预训练权重,我之前的博客有提到
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
训练过程中,出现nan较多,可能是因为训练时batch设置过小造成
当训练的损失降的很低时(图中是刚开始训练的数值,属于很大的损失),就可以Ctrl + C停止训练,使用backup中的权重文件进行测试了
十二、测试
权重文件可以自由指定,训练过程中的权重文件都在backup文件夹下面,每一个权重文件都是可以用的
我这里是把测试的图片上传到data目录,这里的路径应该是任意的,在最后指定好就可以
./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_600.weights data/XXX.jpg
测试结果:
将图片上传到windows中查看,结果如下:
参考博客:
【学习笔记—Yolov3】Yolov3训练VOC数据集&训练自己的数据集