一: 使用darknet yolov3训练自己的数据集教程(本次由于训练集图片较少,没有验证集,只有训练集,故本教程只针对本次训练(12类12012张图片)进行总结的)
0.官网下载预训练模型文件darknet53.conv.74.
1.准备图片以及标签文件txt
a.图片(后缀格式不限)以数字进行命名,每一张图片对应一个标签文件txt,与图片名字同名.例如: 10011.jpg 则对应txt文件为: 10011.txt
b. Now we need to generate the label files that Darknet uses.
Darknet wants a .txt file for each image with a line for each ground truth object in the image that looks like:
<object-class> <x> <y> <width> <height>
标签文件内容,总共有五项:
1.所属类别数字编号,此编号从0开始.
2.boundingbox的中心点x归一化坐标 (center_x/width)
3.boundingbox的中心点y归一化坐标 (center_y/height)
4.boundingbox的width归一化坐标 (boundingbox_width/width) 目标框的宽度/图片的宽度
5.boundingbox的height归一化坐标 (boundingbox_height/height) 目标框的高度/图片的高度
例如:
100110000340.jpg
100110000340.txt
txt内容: 11 0.504294590643 0.661151960784 0.979989035088 0.430147058824
c.将所有图片以及标签文件放到同一文件夹下,my12trainImg.
2.生成所有训练图片的路径文件.
my12trainPath.txt
内容如下:
/home/swntech/songsl/my12/darknet/my12data/my12trainImg/100010000311.jpg
/home/swntech/songsl/my12/darknet/my12data/my12trainImg/100060000153.png
3.类别文件(将英文类别写入文件中,每行一个)
my12.names
内容如下:
Book
PlasticBottle
Can
BeerBottle
Socket
Phone
Screwdriver
DryCell
BananaPeel
CigaretteEnd
Pen
Glasses
4.修改训练网络配置文件
my12yolov3.cfg
本文件从darknet原始工程cfg/yolov3.cfg复制过来,进行修改.
1.ctrl+f 搜索 yolo,总共修改三处,每一个都要修改一下两个内容:
a. filters=51 ##计算公式 3*(class_num + 5).即3*(12+5)=51
b. classes=12 ##改为训练的类别数
修改前:
[convolutional]
size=1
stride=1
pad=1
filters=255
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=80
num=9
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1
修改后:
[convolutional]
size=1
stride=1
pad=1
filters=51 ##计算公式 3*(class_num + 5).即3*(12+5)=51
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=12 ##改为训练的类别数
num=9
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1
5.修改配置data文件
my12.data
内容如下:
classes= 12 ##类别数
train = /home/swntech/songsl/my12/darknet/my12data/my12trainPath.txt ##所有训练图片的路径文件
names = /home/swntech/songsl/my12/darknet/my12data/my12.names ##类别文件
backup = /home/swntech/songsl/my12/darknet/my12data/my12model ##指定模型保存路径
eval=coco
===========以上六步本次训练已经准备完毕(只有训练集的情况)===========
6.开始训练(需在mydata同级目录下执行)
train_my12.sh
将train_my12.sh 复制到mydata同级目录下(cp ./train_my12.sh ..)
./darknet detector train my12data/my12.data my12data/my12yolov3.cfg my12data/my12model/darknet53.conv.74 ##此命令会把输出log打印到屏幕上,不会保存
或者以下命令可以保存log到文件:
./darknet detector train my12data/my12.data my12data/my12yolov3.cfg my12data/my12model/darknet53.conv.74 2>&1|tee ./my12data/log/log|grep "Loaded"
===========此时训练已经开始,静候佳音即可======================
7.命令行测试单张图片
./darknet detect my12data/my12yolov3.cfg my12data/my12model/yolov3.weights my12data/my12testImg/dog.jpg
二:训练参数讲解
几个尺寸说明
(1)batch_size:批大小。即每次训练在训练集中取batch_size个样本训练;
(2)iteration:1个iteration等于使用batchsize个样本训练一次;
(3)epoch:1个epoch等于使用训练集中的全部样本训练一次;
1.
Region 82 Avg IOU: 0.890300, Class: 0.999051, Obj: 0.996995, No Obj: 0.003727, .5R: 1.000000, .75R: 1.000000, count: 2
Region 94 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.000000, .5R: -nan, .75R: -nan, count: 0
Region 106 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.000000, .5R: -nan, .75R: -nan, count: 0
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: 正样本数目.
2.
94296: 0.026593, 0.021316 avg, 0.000001 rate, 3.078118 seconds, 3017472 images
94296: 指示当前训练的batch的次数(batch 的次数,在my12yolov3.cfg中batchs设的64)
0.026593: 是总体的Loss(损失)
0.021316 avg: 是平均Loss,这个数值应该越低越好,一般来说,一旦这个数值低于0.060730 avg就可以终止训练了。
0.000001 rate: 代表当前的学习率,是在.cfg文件中定义的。
3.078118 seconds: 表示当前批次训练花费的总时间。
3017472 images: 这一行最后的这个数值是94296*64的大小,表示到目前为止,参与训练的图片的总量。
基本上avg loss 低于0.06就可以停止训练了.(本次训练最低0.02,再训练也基本不变了)
三:训练中调整参数
1.学习率调整(my12yolov3.cfg)
learning_rate=0.00001 #每次在这里调整学习率,然后接着训练
burn_in=1000
max_batches = 500200
policy=steps
steps=400000,450000
scales=.1,.1
接着指定的模型进行训练
./darknet detector train my12data/my12.data my12data/my12yolov3.cfg my12data/my12model/my12yolov3_51700.weight(指定从哪个模型开始)
四:常见问题
1.修改modle保存间隔
examples/detector.c 138行,现在每1000个batches保存一次
// if(i%10000==0 || (i < 1000 && i%100 == 0)){
if(i%1000==0){ //shouliang.song@swntech.com add 20190812