文章目录
- 1、标注数据
- 1.1、标注
- 1.2、生成训练列表文件train.txt
- 1.3、转换数据标注格式
- 2、训练数据整理
- 2.1、修改train.txt路径
- 2.2、修改yolov3.cfg
- 2.3、obj.name和obj.data
- 2.4、训练脚本文件trian.sh
- 2.5、测试脚本文件test.sh
- 3、训练
本文对应的脚本文件和程序下载链接 darkent yolo自定义数据标注训练全流程说明示例,也可发私信获取。
1、标注数据
使用labelImg.exe工具对数据进行标注,默认使用voc的数据集格式,之后使用脚本转换为yolo专用的数据格式,并且生成一些训练依赖的准备数据。
准备工作:
- (1)执行脚本 0——清理train文件下的img、xml、txt文件文件 ,将上次训练的所有数据删除(需要的话进行备份)
- (2)复制训练图片到 train/JPEGImages 目录下 (图片过大建议等比缩放到1080以下)
exe和train的目录结构
1.1、标注
使用脚本 1——LabelImg.cmd 打开工具,
按钮 Open Dir 选择待标注的图片数据目录 这里为 to_path/train/JPEGImages
按钮 Change Save Dir,选择存放标注文件xml目录,to_path/train/Annotations
加载图片之后,点击 Edit label按钮 标注目标的类别标签
按键 a 、d 切换图片, 按键 w 开始绘制标准框, ctrl+s 保存当前标注图片数据。
详细参考互联网内容,搜索 yolov3标注自定义数据。标注完成后,目录下train/Annotations会得到每一张图片对应的的xml标注文件,
1.2、生成训练列表文件train.txt
训练需要给出所有图片的绝对地址,这里注意,标注机器可能和后期训练不在一个机器,路径会变化,后期根据实际路径进行批量修改替换。
执行脚本 2——Label_generate_traintxt.cmd 即可,会在当前目录生成train.txt文件。如下
红框目录可能变化,可以通过修改脚本的参数,自动生成
1.3、转换数据标注格式
先修改脚本文件 exe/label_conver_voc_2_yolo.py
中的classes 列表为标注工具中的标签名,例如有4个标签 car,huoche,guache和keche,那么将之前行用#注释,修改如下图。
修改后保存之后,执行脚本 3——Label_conver_voc_2_yolo.cmd ,之后可以在目录 train\labels看到txt格式的标注文件
格式为 标签序号 x y w h
:这里标签序号从0开始,值为python脚本中 classes 列表的下标;位置为相对图像宽高尺寸的百分比例。
这里实际是通过标注文件目录下train/Annotations的xml文件转换得到,一一对应(txt,xml,图片都要一一对应)。
可能出现的问题:
- LabelImage.exe标注得到的xml文件中图像宽高尺寸为0,导致txt转换错误,训练时报错。脚本使用PIL库增加验证修复环节,保证转换正确无误。
- 提示标签不存在:因为标注时lable输入错误,和脚本中的classes列表元素不一致
2、训练数据整理
在训练机器上的训练工具目录darknet下,拷贝标注文件目录train和列表文件train.txt到新建训练目录如data-vehicle-0926-772,这里的目录结构如下
2.1、修改train.txt路径
修改图片列表文件路径的真实路径,前面 1.2、 生成训练列表文件train.txt 已经说明。注意要换行格式,要求unix、utf8格,否可能在训练出错、但会提示STB类似错误。
2.2、修改yolov3.cfg
从darknet目录复制一份原始yolov3.cfg
文件到当前训练目录。修改地方有两快
-
(1) 修改网络结构参数
找到cfg文件中的
所有[yolo]标签段(共3个)
,修改红框中的数据
classes修改为标注时的类别数量,例如4类,filters修改 (类别数+5)*3,这里就修改为(4+5)*3 = 27。(后期其他类别对应修改即可)
注意,一共是修改3组数据。 -
(2) 修改训练参数
这里参数比较专业,在大量数据训练时,需要不断调参设计。当前我们使用默认设计。训练时使用 batch=64, subdivision=16,如果机器GPU性能好显存足够,可以将subdivision降低为8、4、2等(3090可以修改为2)。
2.3、obj.name和obj.data
照着修改即可
2.4、训练脚本文件trian.sh
脚本内容为
cd ..
./darknet detector train data-vehicle-0926-772/obj.data data-vehicle-0926-772/yolov3.cfg /yolov3.cfg darknet53.conv.74 -i 0 -clear
例如机器上已有的脚本文件为
2.5、测试脚本文件test.sh
(训练完成后进行)使用训练的指定模型文件对图片进行测试,并生成结果图片。
例如在服务器的darknet目录下执行
./darknet
detector
test
car-0612-400/obj.data
car-0612-400/yolov3-tiny.cfg
car-0612-400/weights/yolov3-tiny_best.weights
-i 0 -thresh 0.25
./car-0612-400/train/JPEGImages/11.jpg
-ext_output
控制台会打印检测的结果,运行完成后,会生成一个 predictions.jpg 的文件,
3、训练
在训练数据目录下,执行train.sh训练脚本即可,根据控制台训练数据输入检查是否存在错误,进行针对性调整。
正式训练时,后台执行,使用 命令 nohup train.sh &
即可, 生成nohup.out 的训练日志。
训练中间的输出,关注中间的 avg loss,直观上一般越低越好。
后面可以使用脚本drawLossPlot.py绘制loss(train)曲线