Yolov3基于Windows系统训练及测试(二.训练及测试篇二)

0. 目录/步骤

3. 基于yolov3的个人数据集训练(训练)

3.4 基于数据集的训练初步

3.4.0 训练情况分析

1 第一次训练
如果读者是初次开始训练自己的数据集 进入步骤3.4.1->
2 中途继续训练
如果读者之前已经开始进行工程训练,并留有上次训练时最近生成的权重文件,没必要从头开始的 进入步骤3.4.2->

3.4.1 初次进行训练

1 准备预训练权重文件darknet53.conv.74
因为工程训练工作量的巨大,官方为我们提供了训练较为成熟的darknet53.conv.74模型,里面包含了20个丰富的类,基本涵盖了我们日常训练所需,为我们从零开始的训练节约了大量的时间
网盘下载链接(darknet53.conv.74):
安装包: darknet53.conv.74
链接:https://pan.baidu.com/s/17WK07o9Qw8xf5kLDa0eP_A 提取码:dcrt

2 开始训练
打开cmd(Win+R),cd到x64目录下,输入如下命令行:
命令行:darknet.exe detector train data\voc.data cfg\yolov3-voc.cfg darknet53.conv.74
到这里可能有的读者会遇见如下报错,这种情况是由于GPU调用冲突造成的,在多GPU的电脑中没有指明调用哪块GPU,具体见 错误3.4.1->
3.4.1.1图片GPU调用报错->
Yolov3基于Windows系统训练及测试(二.训练及测试篇二)
3 多GPU训练
另外,yolov3是支持多GPU训练的,读者视情况进行调整,一般在linux服务器展开多GPU训练,方法也很简单如下,-gpus后面的是GPU在系统中的编号,不清楚的可以通过打开任务管理器->性能查看:
3.4.1.2图片任务管理器查看GPU型号->
Yolov3基于Windows系统训练及测试(二.训练及测试篇二)
打开cmd(Win+R),cd到x64目录下,输入如下命令行:
命令行: darknet.exe detector train data\voc.data cfg\yolov3-voc.cfg darknet53.conv.74 -gpus 0,1

终端测试画面如下,同时也可以看见Avg loss的实时显示,对于训练各参数的介绍,会在 3.4.4进行详细阐述 进入3.4.4.->
3.4.1.3图片终端开始训练->
Yolov3基于Windows系统训练及测试(二.训练及测试篇二)
3.4.1.4图片实时图标->
Yolov3基于Windows系统训练及测试(二.训练及测试篇二)

到这里时注意观察loss的收敛,一般的,前期会出现大量nan值,但后期出现率降到30%左右.但如果实时图长时间收敛不下来并且出现全屏nan值,说明训练出现问题了 见错误3.2.2->
3.4.1.5图片灾难性nan值->
Yolov3基于Windows系统训练及测试(二.训练及测试篇二)

4 查看新权重文件
打开x64目录下文件夹,可以看到所有新生成的权重文件,默认的,前1000次每100次保存一次权重文件,前10000次每1000次保存一次权重文件,其实这里的代码可以自定义 见源码优化3.4.1->
3.4.1.6图片查看新权重文件->
Yolov3基于Windows系统训练及测试(二.训练及测试篇二)

3.4.2 断点继续训练

1 准备权重文件
如果读者想接着上次的权重文件继续训练, 我们在x64目录文件夹下,找到最新生成的权重文件如图,例如作者的为yolov3-voc_1100.weights在这个权重文件上开始训练之前,要保证该文件完整无损坏,切记
3.4.2.1图片查看权重文件->
Yolov3基于Windows系统训练及测试(二.训练及测试篇二)
2 开始断点继续训练
打开cmd(Win+R),cd到x64目录下,输入如下命令行:
命令行: darknet.exe detector train data\voc.data cfg\yolov3-voc.cfg backup\ yolov3-voc_1100.weights
这样就可以在上次的基础上继续训练了

3 GPU单到多训练转换
如果读者之前采用单GPU,中途转换成多GPU训练需要注意,多GPU在工程训练带来快速高效的同时,也需要一些技巧.盲目使用可能导致loss下降,recall上升,obj几乎为零,最终得到的权重文件无法预测出bounding box
使用多GPU训练前需要先用单GPU训练至有稳定上升的趋势后(一般在obj大于0.1后切换),再使用backup中的weights通过多GPU继续训练,一般的,使用单GPU训练1000个迭代即可切换到多GPU

3.4.3 评估训练结果

1 单张图片评估模型
对于权重文件的选取,我们可以根据生成的chart.jpg文件进行筛选,选取最低的点取整值进行验证才能获得更好的测试效果
3.4.3.1图片选取最低点->
Yolov3基于Windows系统训练及测试(二.训练及测试篇二)

我们分别对测试集和验证集中的各随机一张图片进行测试,查看训练效果
验证训练集:打开cmd(Win+R),cd到工程x64目录下,输入如下命令:
命令行:darknet.exe detector test data/voc.data cfg/yolov3.cfg backup/yolov3-voc_1100.weights C:\Users\hp\Desktop\darknet\scripts\VOCdevkit\VOC2007\ JPEGImages\00000034.jpg
3.4.3.2图片训练集测试结果->
Yolov3基于Windows系统训练及测试(二.训练及测试篇二)
验证测试集:打开cmd(Win+R),cd到工程x64目录下,输入如下命令:
命令行:darknet.exe detector test data/voc.data cfg/yolov3.cfg backup/yolov3-voc_1100.weights C:\Users\hp\Desktop\darknet\scripts\VOCdevkit\VOC2007\ JPEGImages\00000027.jpg
3.4.3.3图片测试集测试结果->
Yolov3基于Windows系统训练及测试(二.训练及测试篇二)

对于训练和测试图片可以在train.txt和val.txt中查找,对比上面两图,训练的效果还是可以的
3.4.3.4图片其他测试图片->
Yolov3基于Windows系统训练及测试(二.训练及测试篇二)
2 验证集评估模型
打开cmd(Win+R),cd到工程x64目录下,输入如下命令:
命令行:darknet.exe detector valid data/voc.data yolov3-voc.cfg backup/yolov3-voc_1100.weights
在工程主目录下文件夹内,会发现新生成了一个txt文件1100.txt,里面是批量生成的目标检测出来的各张图片的坐标信息
3.4.3.5图片测试坐标文件->
Yolov3基于Windows系统训练及测试(二.训练及测试篇二)

3.4.4 训练分析深入

1 训练日志参数说明
3.4.4.1图片训练日志->
Yolov3基于Windows系统训练及测试(二.训练及测试篇二)
Region: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:正样本数目

标识1:指示当前的迭代次数
标识2:总体的loss损失
标识3:平均loss,越低越好,一般的,一旦avg<0.060730就可以停止训练了
标识4:当前的学习率,在.cfg文件中定义
标识5:当前批次训练停留的总时间
标识6:到目前为止,参与训练图片的总量

2 mask值得作用
三个尺度上预测不同大小的框,82卷积层为最大的预测尺度,使用较大的mask,但是可以预测出较小的物体.94卷积层为中间的预测尺度,使用中等的mask,106卷积层为最小的预测尺度,使用较小的mask,可以预测出较大的物体

3 num值的作用
关于 3.3.2公式中num值的作用:yolov3总共提供9种不同尺度的先验框,每个尺度预测三种(random的由来)先验框.预测1种的话:3x(1+5)=18->filters的由来

4 Anchor box作用
yolov3的格子尺寸cfg文件中定义的是相对于网络输入图的尺寸,在数据集上对真实边框使用K-means聚类得到的边款长宽比例具有宏观特性预测的坐标值是,相对应格子的坐上点的偏移量而长宽是相对于整幅图像大小的比例
b.w = exp(x[index + 2stride]) * biases[2n]/w b.h = exp(x[index + 3stride]) * biases[2n+1]/h
x[] 为网络输出,biases[]为预设边框的大小
意思就是说,每个格子预测的边框输出为0~1之间且网络输出,x[] 是相对于预设格子尺寸的指数对数就是在预设格子尺寸上调整,预测输出.

3.4.5 yolov3源码优化

接下来提供的源码修改优化提议皆提供下载,有需要的转 1.4.1.1进行下载,所有重新优化的源码,要在VS下重新编译生成才能有效,在工程主目录下,打开文件夹->

1 源码优化3.4.1
优化训练权重文件的保存轮数
找到detector.c文件,在源码的198-199行, 将前1000次每100次保存一次权重文件,前10000次每1000次保存一次权重文件改为每100轮保存一次
优化代码如下:
3.4.5.1图片优化权重文件保存轮数->
Yolov3基于Windows系统训练及测试(二.训练及测试篇二)
2 待补充

参考文献

[1]Win10+VS2017配置yolov3(2)–训练自己数据集
[2]MVision-darknect at master · Ewenwan-MVision · GitHub