yolo训练日志
yolo训练日志
通过两天的训练,得到训练后的权值,效果有喜有忧.
- 数据量的大小对训练的影响.
第一次训练的图片约为6000张
第一次训练的图片约为94000张
迭代次数为120000次
准确度是否与数据集大小成正相关?
但是效果却不明显.
- 参数设置对训练的影响
net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# batch:每次迭代要进行训练的图片数量
# subdivisions:源码中的图片数量int imgs = net.batch * net.subdivisions * ngpus,按subdivisions大小分批进行训练
batch=64
subdivisions=8
# width:输入图片宽度, height:输入图片高度,channels :输入图片通道数
width=416
height=416
channels=3
momentum=0.9
decay=0.0005
# 对于每次迭代训练,YOLOv2会基于角度(angle),饱和度(saturation),曝光(exposure),色调(hue)产生新的训练图片
# angle:图片角度变化,单位为度,假如angle=5,就是生成新图片的时候随机旋转-5~5度
angle=0
# saturation & exposure: 饱和度与曝光变化大小,tiny-yolo-voc.cfg中1到1.5倍,以及1/1.5~1倍
saturation = 1.5
exposure = 1.5
# hue:色调变化范围,tiny-yolo-voc.cfg中-0.1~0.1
hue=.1
# 学习率
learning_rate=0.001
# max_batches:最大迭代次数
max_batches = 120000
# 按照steps策略调整学习率,还有EXP,CONSTANT,POLY等
policy=steps
# 根据batch_num调整学习率
steps= -1,100,80000,100000
# 学习率变化的比例,累计相乘
scales=.1,10,.1,.1
convolution
1
2
3
4
5
6
7
8
9
10
11
12
batch_normalize=1
#卷积核的个数
filters=512
size=3
stride=1
pad=1
#leaky激活函数,大于0的为x,小于0的为0
activation=leaky
max pool
1
2
3
size=2
stride=1
region
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# anchors:预测框的初始宽高,第一个是w,第二个是h,总数量是num*2,
# YOLOv2作者说anchors是使用K-MEANS获得,其实就是计算出哪种类型的框比较多,可以增加收敛速度,
# 如果不设置anchors,默认是0.5,还有就是anchors读入参数中名字是biases
anchors = 0.738768,0.874946, 2.42204,2.65704, 4.30971,7.04493, 10.246,4.59428, 12.6868,11.8741
#在YOLOv2中anchors的维度是通过对GT聚类得到的,所给出的5个尺度肯定是适用于VOC2007 2012数据集的,如果借鉴的网络训练自己的数据,就需要更改这个anchor的尺度,anchor的个数当然是越多越好,兼顾效率和精度,作者选了5个,对于小目标这个没有直接的关系,希望能帮到你。
# bias_match:如果为1,计算best iou时,预测宽高强制与anchors一致
bias_match=1
# classes:类别数量
classes=98
# coords: BoundingBox的tx,ty,tw,th,tx与ty是相对于左上角的gird,
# 同时是当前grid的比例,tw与th是宽度与高度取对数
coords=4
# num:每个grid预测的BoundingBox个数
num=5
# softmax:如果为1,使用softmax作为激活函数
softmax=1
# jitter:利用数据抖动产生更多数据,YOLOv2中使用的是crop,filp,以及net层的angle,flip是随机的
# crop就是jitter的参数,tiny-yolo-voc.cfg中jitter=.2,就是在0~0.2中进行crop
# 通过抖动增加噪声,控制过拟合
jitter=.2
# rescore:决定使用哪种方式计算IOU的误差,为1时,使用当前best iou计算,为0时,使用1计算
rescore=1
# object_scale & noobject_scale & class_scale & coord_scale
# YOLOv1论文中cost function的权重,哪一个更大,每一次更新权重的时候,对应方面的权重更新相对比重更大
# 计算损失时,预测框中有物体的权重
object_scale=5
# 计算损失时,预测框中没有物体的权重
noobject_scale=1
# 计算类别损失时的权重
class_scale=1
# 计算损失时坐标偏差的权重
coord_scale=1
absolute=1
# thresh:决定是否需要计算IOU误差的参数,大于thresh,IOU误差不会夹在cost function中
thresh = .6
# random:如果为1每次迭代图片大小随机从320到608,步长为32,如果为0,每次训练大小与输入大小一致
random=1
- 输出结果分析 ``` Loaded: 0.000029 seconds Region Avg IOU: 0.776567, Class: 0.999925, Obj: 0.418946, No Obj: 0.000931, Avg Recall: 1.000000, count: 8 … 119999: 6.035534, 6.783708 avg, 0.000010 rate, 2.310784 seconds, 7679936 images
```
1
2
3
4
5
6
7
8
9
10
11
* Region Avg IOU: 这个是预测出的bbox和实际标注的bbox的交集 除以 他们的并集。显然,这个数值越大,说明预测的结果越好。
* Avg Recall: 这个表示平均召回率, 意思是 检测出物体的个数 除以 标注的所有物体个数。
* count: 标注的所有物体的个数。 如果 count = 6, recall = 0.66667, 就是表示一共有6个物体(可能包含不同类别,这个不管类别),然后我预测出来了4个,所以Recall 就是 4 除以 6 = 0.66667 。
* `11999`是~次数,`6.035534`是`train loss`,`6.783708 avg`是`avg train loss`,`0.000010 rate`是学习率, `2.310784 seconds`是 batch的处理时间, 最后是已经一共处理了多少张图片。
* 重点关注 train loss 和avg train loss,这两个值应该是随着iteration增加而逐渐降低的。
* 如果loss增大到几百那就是训练发散了,如果loss在一段时间不变,就需要降低learning rate或者改变batch来加强学习效果。 4. 如何处理呢
* 找到 loss的极值点
* 多训练个几万次
* 迷茫中.....
Reference
https://blog.csdn.net/Fate_fjh/article/details/70598510
https://www.cnblogs.com/hansjorn/p/7491391.html
训练自己的数据集时 修改参数和代码