yolov3的config文件配置
[net]
# Testing ### 测试模式,测试的时候,去掉注释
# Training ### 训练模式
# batch=64
# subdivisions=16
---------------------------------------------------------------------------------------------------------
batch=64 ### 每一次迭代送到网络训练得的图片(样本)数量,也叫批数量
### 每batch个样本(64)更新一次参数。增大这个可以让网络在较少的
### 迭代次数内完成一个epoch。在固定最大迭代次数的前提下,
### 增加batch会延长训练时间,但会更好的寻找到梯度下降的
### 方向。如果你显存够大,可以适当增大这个值来提高内存利用率。
### 这个值是需要大家不断尝试选取的,过小的话会让训练不够收敛,
### 过大会陷入局部最优。
subdivisions=32 ### 这个参数很有意思的,它会让你的每一个batch不是一下子都丢到
### 网络里。而是分成subdivision对应数字的份数,一份一份的跑
### 完后,在一起打包算作完成一次iteration。这样会降低对显存的
### 占用情况。如果设置这个参数为1的话就是一次性把所有batch的
### 图片都丢到网络里,如果为2的话就是一次丢一半。
### batch/subdivisions作为一次性送入训练器的样本数量,
### 如果内存不够大,则会将batch分割为subdivisions个子batch
---------------------------------------------------------------------------------------------------------
#设置图片进入网络的宽、高和通道个数。
width=416 ### 输入图像的宽
height=416 ### 输入图像的高
channels=3 ### 输入图像的通道数 3为RGB彩色图片,1为灰度图,4为RGBA图,A通道表示透明度
### 以上三个参数为输入图像的参数信息
### width和height影响网络对输入图像的分辨率
### 从而影响precision,YOLOv3的下采样一般是32倍
### 所以宽高必须能被32整除。必须设置为32的倍数
### 多尺度训练选择为32的倍数最小320*320,最大608*608
### 长和宽越大,对小目标越好,但是占用显存也会高,需要权衡
---------------------------------------------------------------------------------------------------------
momentum=0.9 ### 冲量。DeepLearning1中最优化方法中的动量参数,这个值影响
### 梯度下降到最优值得速度,冲量的建议配置为0.9。
decay=0.0005 ### 权值衰减。使用的目的防止过拟合,当网络逐渐过拟合时
### 网络权值往往会变大,为了避免过拟合,在每次迭代过程中
### 以某个小因子降低,decay参数越大对过拟合的抑制能力越强
### 等效于给误差函数添加一个惩罚项,常用的惩罚项是所有权重的平方
### 乘以一个衰减常量之和。权值衰减惩罚项使得权值收敛到较小的绝对值。
angle=180 ### 图片角度变化,单位为度,假如angle=5,
### 就是生成新图片的时候随机旋转-5~5度
---------------------------------------------------------------------------------------------------------
saturation = 1.5
exposure = 1.5 ### 饱和度与曝光变化大小,tiny-yolo-voc.cfg中1到1.5倍,
### 以及1/1.5~1倍
hue=.1 ### 色调变化范围,tiny-yolo-voc.cfg中-0.1~0.1
### 在每次迭代中,会基于角度、饱和度、曝光、色调产生新的训练图片。
---------------------------------------------------------------------------------------------------------
learning_rate=0.001 ### 初始学习率。训练发散的话可以降低学习率。学习遇到瓶颈,loss不变
### 的话也可以减低学习率。
### 学习率决定了参数移动到最优值的速度快慢,如果学习率过大,
### 很可能会越过最优值导致函数无法收敛,甚至发散;反之,
### 如果学习率过小,优化的效率可能过低,算法长时间无法收敛,
### 也易使算法陷入局部最优(非凸函数不能保证达到全
### 局最优)。合适的学习率应该是在保证收敛的前提下,能尽快收
### 敛。设置较好的learning rate,需要不断尝试。在一开始的时
### 候,可以将其设大一点,这样可以使weights快一点发生改变,在
### 迭代一定的epochs之后人工减小学习率。在yolo训练中,网络训
### 练160epoches,初始学习率为0.001,在60和90epochs时将学习率除以10。
burn_in=1000 ### 在迭代次数小于burn_in时,其学习率的更新有一种方式,大于
### burn_in时,才采用policy的更新方式
max_batches = 50000 ### 最大迭代次数。训练达到max_batches后停止学习,如果先达到指定epochs,则停止学习
policy=steps ### 学习策略,一般都是step这种步进式。
### 有policy:constant, steps, exp, poly, step, sig, RANDOM,constant等方式
steps=1000,40000,45000 ### 学习率变化时的迭代次数,分别是总迭代次数的0.8和0.9
scales=10,.1,.1 ### 学习率变化的比率。这两个是组合一起的,举个例子:learn_rate: 0.001,
### step:1000,40000,45000 scales: 10, .1, .1 这组数据的
### 意思就是在0-1000次iteration期间learning rate为原始0.001,
### 在1000-40000次iteration期间learning rate为原始的10倍0.01,
### 在40000-45000次iteration期间learning rate为当前值的0.1倍,
### 就是0.001, 在45000到最大iteration期间使用learning rate为
### 当前值的0.1倍,就是0.0001。随着iteration增加,降低学习率可以
### 是模型更有效的学习,也就是更好的降低train loss。
卷积层
[convolutional]
batch_normalize=1 ### 是否做BN
filters=32 ### 输出多少个特征图
size=3 ### 卷积核的尺寸
stride=1 ### 做卷积运算的步长
pad=1 ### 如果pad为0,padding由 padding参数指定。
### 如果pad为1,padding为size/2,
activation=leaky ### alexeyAB版添加了mish, swish, nrom_chan等新的激活函数
feature map计算公式:
下采样
......
......
[convolutional]
size=1
stride=1
pad=1
filters=18 ### 每一个[region/yolo]层前的最后一个卷积层中的filters需要修改;
### filters=(classes+1+coords)*anchors_num,
### 其中anchors_num 是该层mask的一个值.如果没有mask,
### 则 anchors_num=num是这层的ancho5的意义是5个坐标,
### 分别是论文中的tx,ty,tw,th,to。
### filters的计算公式为: 3*(5+len(classes)),此处是只有1个类别,所以class=1,
### 所以3*(5+1)=18;3是代表yolov3有三个预测分支(3个检测层)。
### 根据自己项目的实际情况,进行相应修改
activation=linear ### 激活函数-activation
### 包括logistic, loggy, relu, elu, relie, plse, hardtan
### ,lhtan, linear, ramp, leaky, tanh, stair
可以通过带入以上公式,可以得到OutFeature是InFeature的一半。
也可以使用maxpooling进行下采样:
[maxpool]
size=2
stride=2
上采样
[upsample]
stride=2
#上采样是通过线性插值实现的。
Shortcut和Route层
#shortcut操作是类似ResNet的跨层连接,参数from是−3,
#意思是shortcut的输出是当前层与先前的倒数第三层相加而得到。
# 通俗来讲就是add操作
[shortcut]
from=-3
activation=linear
[route]
layers = -1, 36
# 当属性有两个值,就是将上一层和第36层进行concate
#即沿深度的维度连接,这也要求feature map大小是一致的。
[route]
layers = -4
#当属性只有一个值时,它会输出由该值索引的网络层的特征图。
#本例子中就是提取从当前倒数第四个层输出
yolo层
[convolutional]
size=1
stride=1
pad=1
filters=18 ### 每一个[region/yolo]层前的最后一个卷积层中的
### filters=num(yolo层个数)*(classes+5),5的意义是5个坐标
### 代表论文中的tx,ty,tw,th,po
### 这里类别个数为1,(1+5)*3=18
activation=linear
[yolo] ### yolo层叫region层
mask = 6,7,8 ### 当前属于第几个预选框,这一层预测第7、8、9个anchor boxes,
### 每个yolo层实际上只预测3个由mask定义的anchors
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
### 预测框的初始宽高,第一个是w,第二个是h,总数量是num*2,
### anchors是使用K-MEANS获得,其实就是计算出
### 哪种类型的框比较多,可以增加收敛速度,如果不设置anchors,
### 默认是0.5;总共有三个检测层,共计9个anchor
classes=1 ### 网络需要识别的物体种类数,此处只有1个检测类别
num=9 ### 每个grid cell预测几个box(num/yolo层个数)与anchors的数量一致。
### 当想要使用更多anchors时需要调大num,且如果调大num后训练时
### obj趋近0的话,可以尝试调大object_scale
jitter=.3 ### 通过抖动增加噪声来抑制过拟合
### 属于TTA(Test Time Augmentation)
ignore_thresh = .5 ### 决定是否需要计算IOU误差的参数,大于thresh,IOU误差不会夹在cost function中
# ignore_thresh 指的是参与计算的IOU阈值大小。
#当预测的检测框与ground true的IOU大于ignore_thresh的时候,
#不会参与loss的计算,否则,检测框将会参与损失计算。
#目的是控制参与loss计算的检测框的规模,当ignore_thresh过于大,
#接近于1的时候,那么参与检测框回归loss的个数就会比较少,同时也容易造成过拟合;
#而如果ignore_thresh设置的过于小,那么参与计算的会数量规模就会很大。
#同时也容易在进行检测框回归的时候造成欠拟合。
#ignore_thresh 一般选取0.5-0.7之间的一个值
# 小尺度(13*13)用的是0.7,
# 大尺度(26*26)用的是0.5。
truth_thresh = 1
random=1 ### random为1时会启用Multi-Scale Training,随机使用不同尺
### 寸的图片进行训练,如果为0,每次训练大小与输入大小一致;
### 是否随机确定最后的预测框,显存小可设置成0
#注意:yolov3一共有3对(yolo检测层+其前面的convolutional层),记得这3对地方均要修改。
总结:
epochs
epochs被定义为向前和向后传播中所有批次的单次训练迭代。这意味着1个周期是整个输入数据的单次向前和向后传递。简单说,epochs指的就是训练过程中数据将被“轮”多少次。
公式:one epoch = numbers of iterations = N = 训练样本的数量/batch_size
例:有786个训练样本,batch_size=32,训练总次数max_batches=40000。那epochs=40000/(786/32)≈1628.5。
iterations
iterations(迭代):每一次迭代都是一次权重更新,每一次权重更新需要batch_size个数据进行Forward运算得到损失函数,再BP算法更新参数。
1个iteration = 使用batchsize个样本训练一次。
Darket-53结构如下图所示:
它是由重复的类似于ResNet的模块组成的,其下采样是通过卷积来完成的。通过对cfg文件的观察,提出了以下总结:
不改变feature大小的模块:
[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky
[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky
[shortcut]
from=-3
activation=linear
[convolutional]
batch_normalize=1
filters=512
size=1
stride=1
pad=1
activation=leaky
python .\train.py --data my.yaml --workers 8 --batch-size 32 --epochs 100
yolov5的训练很简单,下载好仓库,装好依赖后,只需自定义一下data目录中的yaml文件就可以了。这里我使用自定义的my.yaml文件,里面就是定义数据集位置和训练种类数和名字。
workers和batch-size参数的理解
一般训练主要需要调整的参数是这两个:
workers:指数据装载时cpu所使用的线程数,默认为8。
一般默使用8的话,会报错~~。原因是爆系统内存,除了物理内存外,需要调整系统的虚拟内存。训练时主要看已提交哪里的实际值是否会超过最大值,超过了不是强退程序就是报错。
对于workers,并不是越大越好,太大时gpu其实处理不过来,训练速度一样,但虚拟内存(磁盘空间)会成倍占用。
我的显卡是rtx3050,实际使用中上到4以上就差别不大了,gpu完全吃满了。但是如果设置得太小,gpu会跑不满。比如当workers=1时,显卡功耗只得72W,速度慢了一半;workers=4时,显卡功耗能上到120+w,完全榨干了显卡的算力。所以需要根据你实际的算力调整这个参数。
对于batch-size,有点玄学。理论是能尽量跑满显存为佳,但实际测试下来,发现当为8的倍数时效率更高一点。就是32时的训练效率会比34的高一点,这里就不太清楚原理是什么了,实际操作下来是这样。