1. 概述
现在比较流行的目标检测的框架,比如yolo,rcnn,ssd等,不同的模型通常采用不同的数据预处理和训练方法,这使得不同的目标检测方法很难相互受益或在其他领域取得相关进展。
所以,本文提出了一些可以适用于一般模型的tricks,并且不会改变网络结构,损失函数,也不会增加前向推理时间。比如mixup,learning rate scheduling,label smoothing,synchronized BatchNorm 等等
2.1 mixup
mixup就是通过混合像素作为训练图像对之间的插值。在图像分类中,也就是如图,一张图片所有像素乘0.9,另一张乘0.1,后像素叠加起来。对于标签也做相同的操作。
在目标检测中,本文作者不断增加混合过程中使用的混合比,生成的帧中的对象与自然呈现更具活力和连贯性,类似于我们观看低FPS电影或监控视频时通常观察到的过渡帧。同时通过采用保留几何形状并对齐的方式以避免在初始步骤中扭曲图像。
mixup原文中的混合比从beta distribution中提取出来(a=0.2,b=0.2)。然而在这篇论文中,选取a>=1,b>=1的beta distribution,因为这种分布视觉相干性更强。
那么什么是beta distribution呢?
一共有两个参数,a和b,该分布的均值为 a / (a + b), 计算公式如图
2.2. Classification Head Label Smoothing
标签平滑。
在一般分类标签中,通过用独热码表示,也就是[0,0,0,1,0,0],只有标注的类别为1,其余均为0,这样有什么问题?通过这样训练,就会使得我们的网络过于相信训练集,非常容易过拟合。因为测试集与训练集不同,如果太过相信训练集。标签平滑就是变为[0.01,0.01,0.01,0.95,0.01,0.01]这样,增加一些噪声,使得网络更加健壮。公式如下
2.3. Data Preprocessing
数据预处理
作者认为,在图像分类中,旋转,裁剪图像等操作是可以有效提高模型泛化性和减少过拟合的。但是在目标检测中,我们需要更加谨慎,因为目标检测对于这种变化是非常敏感的。
作者提出以下几点:
1. 随机几何变换。包括随机裁剪(带约束)、随机展开、随机水平翻转和随机调整大小(带随机插值)。
2. 随机颜色抖动,包括亮度、色调、饱和度和对比度。
同时认为,相对于单阶段(yolo,ssd),多阶段(rcnn)由于有ROI层,多了很多采样,裁剪等操作,故不需要几何上的数据增强。
2.4. Training Schedule Revamping
现在大多数我们训练网络时,都会采用基于step的操作,也就是逐步减小学习率。在网络刚开始训练时,距离最优值较远,采取较大学习率来快速逼近。而随着不断的逼近,我们逐步减小学习率,以防止越过最优解。比如yolo和RCNN都是。
而较为流行的就是基于cos余弦的学习率减小策略。cos函数随着角度的增大,值就在不断减小。并且开始和末尾减小的非常快,中间探索阶段,减少较慢。
这样有什么问题?我们的优化函数比如SGD,随机梯度更新策略。如果我们一开始就采取了错误的更新策略,那么后面就需要迭代更多次来弥补,因为一开始学习率是较大的,所以就会出现这样的情况。那么怎么避免呢?作者提出了预热的思路。
也就是说,比如刚刚开始的前1000论轮,我们采取从0增大到预设学习率的策略。这样可以使得网络在开始训练时,更加谨慎,能够选择的更加谨慎。俗话说,万事开头难嘛。之后就正常采用余弦衰减策略,更新学习率。
2.5. Synchronized Batch Normalization
同步批标准化。这点我个人觉得其实意义不大。他主要是指出,在大规模任务中,多卡训练会将原先的batch分成一个个较小的batch,确实是加快了训练的速度,但是却与batch normalization的功能不太相符,因为批标准化就是针对一个batch来算的。于是乎,作者就提出了Synchronized Batch Normalization(个人感觉没什么用,觉得batch分成一个个小的,那就加大原先不就行了,直接拉满)
2.6 Random shapes training for single-stage objectdetection networks
这一点作者,其实是借鉴了yolov3的,也就是多尺度训练,经过一定的迭代轮次,改变输入图像的尺寸,达到多尺度特征融合的效果。
之后就是作者进行了一系列的训练验证,
如有错误,欢迎各位批评指正!!!