上一篇文章介绍了数据集的制作,本篇文章将介绍yolo训练的流程及参数设置。
划分训练集
在ImageSets/Main下生成train.txt、test.txt、trainval.txt、val.txt。本质是根据xml的文件名划分训练集、验证集、测试集,参考代码如下。
import os
import random
trainval_percent = 0.2
train_percent = 0.8
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'
total_xml = os.listdir(xmlfilepath)
num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)
ftrainval = open('ImageSets/Main/trainval.txt', 'w')
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
fval = open('ImageSets/Main/val.txt', 'w')
for i in list:
name = total_xml[i][:-4] +'\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftest.write(name)
else:
fval.write(name)
else:
ftrain.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()
若Annotations中的文件如下图
则train.txt的内容会是以下的形式
train.txt转换标注文件
将标注文件由xml格式转化为训练所需的txt格式,txt格式的标注文件如下
txt标注文件示例一幅图中有多少个目标就会有多少行,第一个数字代表类别,后四个数分别为归一化后的中心点X坐标、Y坐标、宽度、高度。
将scripts文件夹下的voc_label.py放在与VOCdevkit文件夹相同的位置,根据实际情况修改py文件,主要修改以下几处:
运行voc_label.py,会在与py文件同级的位置生成一个包含转化成txt文件的标注文件的名为label的文件夹。
(若对于python比较熟练文件夹可以用其他名称)
修改训练参数
这一部分主要需要修改3个文件:cfg、names、data。cfg文件描述不同网络的结构与参数,names文件记录模型的标签,data文件保存训练的总体信息。(以下内容以训练一个yolov3的模型为例)
cfg文件
1、在cfg文件夹下新建yolo-obj.cfg,内容与yolov3.cfg(在cfg文件夹下)相同
2、将width、height设置为32的倍数,且width==height,一般设置为608
3、max_batches设置为类别数*2000
4、steps设置为max_batches*0.8和max_batches*0.9
cfg文件及注释 part15、yolo标签的前一个filters修改为(类别数+5)*3,假设有6类则修改为33
6、重新计算yolo标签下的anchors(不重新计算则使用的是其他的数据集的anchor,可以训练,但会降低训练的模型的精度),原版需自己计算,alexey版提供了计算anchors的工具:
./darknet detector calc_anchors data/obj.data-num_of_clusters 9 -width 416 -height 416
7、修改classes的值为实际的类别数
8、若显存不够可将random置为0
9、共有3处yolo标签,重复4-7
cfg文件及注释part2names文件
在data文件夹下新建obj.names文件,保存类别名称,格式可参考data文件夹下的voc.names
data文件
在data文件夹下新建obj.data文件,可参考cfg文件夹下的voc.data
voc.data下载预训练权重
根据实际情况选择预训练权重,具体版本对应参考官网或readme文件,yolov3对应的预训练权重为darknet53.conv.74。
开始训练
在darknet下输入命令:
./darknet detector train cfg/coco.data cfg/yolov3.cfg darknet53.conv.74
Alexey版使用-map指令可以实时显示loss与accuracy曲线:
./darknet detector train cfg/coco.data cfg/yolov3.cfg darknet53.conv.74-map
当发现loss不再下降时可提前停止训练,loss最终的取值范围为0.05-3.0
最终生成的weights文件就是我们训练得到的模型。
网友评论