YOLO fastest cfg文件注释分析,大体上跟其他版本的YOLO配置文件一致,此处主要是记录一下,针对自己不熟悉的地方额外添加一点说明。
1.[net]层
[net]
batch=64
subdivisions=1
width=320
height=320
channels=3
momentum=0.949 #动量参数影响着梯度下降到最优值的速度。
decay=0.0005 #权重衰减正则项,防止过拟合。
angle=0 #数据增强,设置旋转角度。
saturation=1.5 #饱和度
exposure=1.5 #曝光量
hue=.1 #色调
这里的batch与普遍意义上的batch不是一致的。训练的过程中将一次性加载16张图片进内存,然后分4次完成前向传播,每次4张。经过16张图片的前向传播以后,进行一次反向传播。在网上的其他博客中,测试的时候需要如下设置
#Testing
#batch=1
#subdivisions=1
在YOLO fastest的cfg文件中不需要更改,因为在测试的时候,parse_network_cfg_custom函数内根据train和test进行了区分设置。
网络的宽、高和通道个数设置,由于YOLOv3的下采样一般是32倍,所以宽高必须能被32整除。多尺度训练选择为32的倍数最小320*320,最大608*608。长和宽越大,对小目标越好,但是占用显存也会高,需要权衡。
learning_rate=0.001 #学习率:刚开始训练时可以将学习率设置的高一点,而一定轮数之后,将其减小。在训练过程中, #一般根据训练轮数设置动态变化的学习率。
burn_in=4000 # 在迭代次数小于burn_in时,其学习率的更新有一种方式,大于burn_in时,才采用下面的policy的更新方式。网上查到的都是这么一句描述,小于burn_in的时候是怎么更新的,我在看代码的时候没有看到yolo fastest内具体的一个计算方式,只在void update_network_gpu(network net)函数内,看到if (l.burnin_update && (l.burnin_update*net.burn_in > iteration_num)) continue;这一句,后面有时间再研究下这块。
max_batches=250000 #训练过程中最大batch
policy=steps #学习率调整的策略:constant, steps, exp, poly, step, sig, RANDOM,constant等方式。
steps=150000,180000
scales=.1,.1 #steps和scale是设置学习率的变化,比如迭代到400000次时,学习率衰减十倍,45000次迭代时,学习率又会在前一个学习率的基础上衰减十倍。
2.[convolutional]
[convolutional]
batch_normalize=1 #是否做BN操作
filters=32 #输出特征图的数量
size=3 #卷积核的尺寸
stride=1 #做卷积运算的步长
pad=1 #如果pad为0,padding由padding参数指定。如果pad为1,padding大小为size/2, #padding应该是对输入图像左边缘拓展的像素数量
activation=leaky #激活函数的类型:logistic,loggy,relu,elu,relie,plse,hardtan, #lhtan,linear,ramp,leaky,tanh,stair
# alexeyAB版添加了mish, swish, nrom_chan等新的激活函数
3.下采样都是通过调整卷积层参数进行的,不存在maxpooling下采样方式:
[convolutional]
filters=8
size=3
pad=1
stride=2
batch_normalize=1
activation=leaky
4.上采样 只有一个upsample层
[upsample]
stride = 2 #上采样通过线性插值实现
5.shortcut和route层 cfg中有18个shortcut层,2个route层
[shortcut]
from=-5
activation=linear
#shortcut操作是类似ResNet的跨层连接,参数from是−5,意思是shortcut的输出是当前层与先前的倒数第三层相加而得到。一般就是add操作
[route]
layers = -7 #当属性只有一个值时,它会输出由该值索引的网络层的特征图。 此处就是提取从当前倒数第7个层输出
[route]
layers=-1,81 # 当属性有两个值,就是将上一层和第81层进行concate,即沿深度的维度连接,feature map大小一致
6.yolo层
[convolutional]
size=1
stride=1
pad=1
filters=21 #每一个[region/yolo]层前的最后一个卷积层中的filters=num(每yolo层个数)*(classes+5) ,5的意义是5个坐标,代表论文中的tx,ty,tw,th,po 这里类别个数为2,(1+5)*3=21
activation=linear
[yolo]
# 该层预测哪个规模的框,0,1,2用于预测小物体的anchor
# 使用anchor的索引,0,1,2表示使用下面定义的anchors中的前三个anchor
mask = 0,1,2
# anchors = 26, 48, 67, 84, 72,175, 189,126, 137,236, 265,259
# own data anchors
anchors = 20, 24, 27, 36, 38, 52, 52, 35, 61, 66, 105, 94 # 有2个yolo层,所以6个anchor
classes=2
num=6 # anchor数量,每个grid cell预测的bounding box个数是anchor总数/yolo层个数,此处是6/2=3
jitter=.15
ignore_thresh = .5 # ignore_thresh 指得是参与计算的IOU阈值大小。当预测的检测框与ground true的IOU大于ignore_thresh的时候,不会参与loss的计算,否则,检测框将会参与损失计算。目的是控制参与loss计算的检测框的规模,当ignore_thresh过于大,接近于1的时候,那么参与检测框回 归loss的个数就会比较少,同时也容易造成过拟合;而如果ignore_thresh设置的过于小,那 # 么参与计算的会数量规模就会很大。同时也容易在进行检测框回归的时候造成欠拟合。 # ignore_thresh一般选取0.5-0.7之间的一个值
# 小尺度(10*10)和大尺度(20*20)用的都是0.5,
truth_thresh = 1
random=0
scale_x_y = 1.00
iou_thresh=0.213
cls_normalizer=1.0
iou_normalizer=0.07
iou_loss=ciou
nms_kind=greedynms
beta_nms=0.6
7.dropout层 cfg中有18个dropout层,均在shortcut层前,probability的设置都为0.15
[dropout]
probability=.15