训练自己的数据主要分为以下几个步骤:
A.数据集制作
1.制作VOC格式的xml文件
工具:labelImg (github上直接下载即可)
2.将VOC格式的xml文件转换成YOLO格式的txt文件
找到darknet/script目录下的脚本:voc_label.py,根据自己的数据集修改执行就行了。
本人设置:
sets = [('2007', 'train'), ('2007', 'val')]
classes=[ ] /一共18种类别
B.文件修改
1.关于 .data .names 两个文件修改非常简单,参考官网YOLOv3.txt连接中的文件。
举个栗子,本人对服务器类别识别训练设置:
.data文件:
classes=18
train=(train.txt所在路径)
valid=(2007_val.txt所在路径)
names=(.names所在文件夹/.names)
backup=(在darcknet下建一个文件夹,可命名为backup)
.names文件:
server.names保存所有服务器类型的名字
2.关于cfg修改,以6类目标检测为例,主要有以下几处调整(蓝色标出)#表示注释,根据训练和测试,自行修改。
[net]
# Testing
# batch=1
# subdivisions=1
# Training
batch=64
subdivisions=8
......
[convolutional]
size=1
stride=1
pad=1
filters=33###75
activation=linear
[yolo]
mask = 6,7,8
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=6###20
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0###1
......
[convolutional]
size=1
stride=1
pad=1
filters=33###75
activation=linear
[yolo]
mask = 3,4,5
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=6###20
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0###1
......
[convolutional]
size=1
stride=1
pad=1
filters=33###75
activation=linear
[yolo]
mask = 0,1,2
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
classes=6###20
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=0###1
A.filters数目是怎么计算的:3x(classes数目+5),和聚类数目分布有关,论文中有说明;
B.如果想修改默认anchors数值,使用k-means即可;
C.如果显存很小,将random设置为0,即关闭多尺度训练;
D.其他参数如何调整,有空再补;
E.前100次迭代loss较大,后面会很快收敛;
Region xx: cfg文件中yolo-layer的索引;
Avg IOU: 当前迭代中,预测的box与标注的box的平均交并比,越大越好,期望数值为1;
Class: 标注物体的分类准确率,越大越好,期望数值为1;
obj: 越大越好,期望数值为1;
No obj: 越小越好;
.5R: 以IOU=0.5为阈值时候的recall; recall = 检出的正样本/实际的正样本
0.75R: 以IOU=0.75为阈值时候的recall;
count: 正样本数目。
本文参考:https://blog.csdn.net/lilai619/article/details/79695109/