YOLO算法学习及训练

1. YOLO2代码

在window下的训练代码:
https://github.com/AlexeyAB/darknet

原始代码:
https://pjreddie.com/darknet/

Tips:
1. 虽然要求OPENCV版本为2.4.13或2.4.3以上,VS2015,但实际上改一下代码中opencv和VS的配置信息,低版本也可以,本人版本opencv2.4.10 + VS2013。
2. VS运行代码时会出现大量的找不到定义错误,这是因为C和C++代码风格差距导致的,本代码为C风格,而在C风格下需要把变量的声明反正其生命周期开始的地方!

2. YOLO网络参数

batch:

每一次迭代送到网络的图片数量,也叫批数量。增大这个可以让网络在较少的迭代次数内完成一个epoch。在固定最大迭代次数的前提下,增加batch会延长训练时间,但会更好的寻找到梯度下降的方向。如果你显存够大,可以适当增大这个值来提高内存利用率。这个值是需要大家不断尝试选取的,过小的话会让训练不够收敛,过大会陷入局部最优。

subdivision:

这个参数很有意思的,它会让你的每一个batch不是一下子都丢到网络里。而是分成subdivision对应数字的份数,一份一份的跑完后,在一起打包算作完成一次iteration。这样会降低对显存的占用情况。如果设置这个参数为1的话就是一次性把所有batch的图片都丢到网络里,如果为2的话就是一次丢一半。

angle:

图片旋转角度,这个用来增强训练效果的。从本质上来说,就是通过旋转图片来变相的增加训练样本集。

saturation,exposure,hue:

饱和度,曝光度,色调,这些都是为了增强训练效果用的。

learning_rate:

学习率,训练发散的话可以降低学习率。学习遇到瓶颈,loss不变的话也减低学习率。

max_batches:

最大迭代次数。

policy:

学习策略,可以设置成以下方式:
- fixed:   保持base_lr不变.
- step:    如果设置为step,则还需要设置一个stepsize, 返回 base_lr * gamma ^ (floor(iter / stepsize)),其中iter表示当前的迭代次数
- exp:   返回base_lr * gamma ^ iter, iter为当前迭代次数
- inv:   如果设置为inv,还需要设置一个power, 返回base_lr * (1 + gamma * iter) ^ (- power)
- multistep: 如果设置为multistep,则还需要设置一个stepvalue。这个参数和step很相似,step是均匀等间隔变化,而multistep则是根据 stepvalue值变化
- poly:    学习率进行多项式误差, 返回 base_lr (1 - iter/max_iter) ^ (power)
- sigmoid: 学习率进行sigmod衰减,返回 base_lr ( 1/(1 + exp(-gamma * (iter - stepsize))))

step,scales:

这两个是组合一起的,举个例子:learn_rate: 0.001, step:100,25000,35000 scales: 10, .1, .1 这组数据的意思就是在0-100次iteration期间learning rate为原始0.001,在100-25000次iteration期间learning rate为原始的10倍0.01,在25000-35000次iteration期间learning rate为当前值的0.1倍,就是0.001, 在35000到最大iteration期间使用learning rate为当前值的0.1倍,就是0.0001。随着iteration增加,降低学习率可以是模型更有效的学习,也就是更好的降低train loss。

最后一层卷积层中filters数值是 5×(类别数 + 1*5)。具体原因就不多说了,知道就好哈。
region里需要把classes改成你的类别数。

random

如果设置为1的话,就是在训练的时候每一batch图片会随便改成320-640(32整倍数)大小的图片。目的和上面的色度,曝光度等一样。如果设置为0的话,所有图片就只修改成默认的大小 416*416。

参考博客:

【Darknet】【yolo v2】训练自己数据集的一些心得—-VOC格式

网络参数文件cfg解析:

[net]
batch=64                           每batch个样本更新一次参数。
subdivisions=8                     如果内存不够大,将batch分割为subdivisions个子batch,每个子batch的大小为batch/subdivisions。
                                   在darknet代码中,会将batch/subdivisions命名为batch。
height=416                         input图像的高
width=416                          Input图像的宽
channels=3                         Input图像的通道数
momentum=0.9                       动量
decay=0.0005                       权重衰减正则项,防止过拟合
angle=0                            通过旋转角度来生成更多训练样本
saturation = 1.5                   通过调整饱和度来生成更多训练样本
exposure = 1.5                     通过调整曝光量来生成更多训练样本
hue=.1                             通过调整色调来生成更多训练样本

learning_rate=0.0001               初始学习率
max_batches = 45000                训练达到max_batches后停止学习
policy=steps                       调整学习率的policy,有如下policy:CONSTANT, STEP, EXP, POLY, STEPS, SIG, RANDOM
steps=100,25000,35000              根据batch_num调整学习率
scales=10,.1,.1                    学习率变化的比例,累计相乘

[convolutional]
batch_normalize=1                  是否做BN
filters=32                         输出多少个特征图
size=3                             卷积核的尺寸
stride=1                           做卷积运算的步长
pad=1                              如果pad为0,padding由 padding参数指定。如果pad为1,padding大小为size/2
activation=leaky                   激活函数:
                                   logistic,loggy,relu,elu,relie,plse,hardtan,lhtan,linear,ramp,leaky,tanh,stair

[maxpool]
size=2                             池化层尺寸
stride=2                           池化步进

[convolutional]
batch_normalize=1
filters=64
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

......
......


#######

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=1024
activation=leaky

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=1024
activation=leaky

[route]                            the route layer is to bring finer grained features in from earlier in the network
layers=-9

[reorg]                            the reorg layer is to make these features match the feature map size at the later layer. 
                                   The end feature map is 13x13, the feature map from earlier is 26x26x512. 
                                   The reorg layer maps the 26x26x512 feature map onto a 13x13x2048 feature map 
                                   so that it can be concatenated with the feature maps at 13x13 resolution.
stride=2

[route]
layers=-1,-3

[convolutional]
batch_normalize=1
size=3
stride=1
pad=1
filters=1024
activation=leaky

[convolutional]
size=1
stride=1
pad=1
filters=125                        region前最后一个卷积层的filters数是特定的,计算公式为filter=num*(classes+5) 
                                   5的意义是5个坐标,论文中的tx,ty,tw,th,to
activation=linear

[region]
anchors = 1.08,1.19,  3.42,4.41,  6.63,11.38,  9.42,5.11,  16.62,10.52          预选框,可以手工挑选,
                                                                     也可以通过k means 从训练样本中学出
bias_match=1
classes=20                         网络需要识别的物体种类数
coords=4                           每个box的4个坐标tx,ty,tw,th
num=5                              每个grid cell预测几个box
softmax=1                          使用softmax做激活函数
jitter=.2                          通过抖动增加噪声来抑制过拟合
rescore=1                          暂理解为一个开关,非0时通过重打分来调整l.delta(预测值与真实值的差)

object_scale=5                     暂理解为计算损失时预测框中有物体时的权重
noobject_scale=1                   暂理解为计算损失时预测框中无物体时的权重
class_scale=1                      暂理解为计算类别损失时的权重                      
coord_scale=1                      暂理解为计算损失时坐标偏差的权重

absolute=1
thresh = .6
random=0                           

具体的参数代码解析,可以参考:

YOLO网络参数的解析与存储

3. YOLO的算法原理

参考博客:

YOLO 论文阅读

YOLO2

(Paper)Network in Network网络分析

Batch Normalization导读

论文心得:BatchNorm及其变体

3.1 网络架构 :

从AlexNet理解卷积神经网络的一般结构

Yolo的架构类似于AlexNet, 有的层存在多个GPU分块并行处理的情况,所以输入数据维度和卷积核维度存在倍数差!(我的理解,如有误还望指正)


Yolo v2架构:


3.2 global average pooling :

主要是用来解决全连接的问题,其主要是是将最后一层的特征图进行整张图的一个均值池化,形成一个特征点,将这些特征点组成最后的特征向量进行softmax中进行计算。

举个栗子:
假如,最后的一层的数据是10个6*6的特征图,global average pooling是将每一张特征图计算所有像素点的均值,输出一个数据值,这样10 个特征图就会输出10个数据点,将这些数据点组成一个1*10的向量的话,就成为一个特征向量,就可以送入到softmax的分类中计算了

全连接与全局均值池化的差异:

3.3 Anchor boxes与Bouding boxes

Anchor boxes的概念源自Faster R-CNN:

【目标检测】Faster RCNN算法详解

Yolo作者利用K-means进行先验Anchor boxes个数及形状大小预测:
K-means 计算 anchor boxes

但是,引入了anchor boxes就会产生模型不稳定的问题,该问题产生于边界框位置的预测。简单的解释,如果训练的图片中的物体一张是在左面,下一张又在右面,就会产生这样的波动,显然的这个过程是不受控制的,毕竟图片中的物体位置他在哪里就在哪里。这里作者,变换了个思路,把最终预测的相对于anchor的边界框的相关系数变为预测相对于grid cell(yolo v1的机制)的相关系数,使得输出的系数在0-1直接波动,如此就解决了波动的问题。最终,使用维度聚类和直接预测边界框中心比使用anchor boxes提升了5%的mAP。详见论文!

猜你喜欢

转载自blog.csdn.net/u012554092/article/details/78263456