以下内容是对YOLOv4总结出的Bag of freebies进行一个汇总记录,也就是一个分支
通常,传统的目标检测器是离线训练的。因此,研究人员总是喜欢利用这一优势,开发更好的训练方法,使目标检测器在不增加推理代价的情况下获得更好的准确率。我们把这些只会改变培训策略或只会增加培训成本的方法称为“Bag of freebies”。
以下我对这些方法进行一个简要的汇总与介绍:
1.pixel-wise调整
满足Bag of freebies定义的目标检测方法经常采用的是数据扩增。数据增强的目的是增加输入图像的可变性,使所设计的目标检测模型对不同环境下获得的图像具有更高的鲁棒性。
1)photometric distortion
- Brightness(亮度)
- Contrast(对比度)
- Hue(色调)
- Saturation(饱和度)
- Noise(噪声)
通过调整输入图片的亮度、对比度、色调、饱和度和添加噪声来进行数据增强。
2)geometric distortion
- Random Scaling(随机缩放)
- Random Cropping(随机裁剪)
- Random Flipping(随机翻转)
- Random Rotating(随机旋转)
随机翻转和随机旋转的区别在于,随机翻转是通常对输入图片以某个轴进行翻转,随机旋转是随输入图片进行顺时针角度旋转。
2.物体遮挡
1)random erase 、CutOut
random erase 、CutOut可以随机选择图像中的矩形区域,并填充一个随机或互补值为零
- random erase
论文:Random Erasing Data Augmentation
arxiv:https://arxiv.org/pdf/1708.04896v2.pdf
github源码:https://github.com/zhunzhong07/Random-Erasing
Random Erase称为随机擦除,随机选择一个区域,采用随机值进行覆盖,所选区域一定在图像内。把物体遮挡一部分也能被正确识别分类,这样就迫使网络利用局部数据进行训练识别,增大了训练难度,一定程度提高模型的泛化能力。
- CutOut
论文:Improved Regularization of Convolutional Neural Networks with Cutout
arxiv:https://arxiv.org/pdf/1708.04552v2.pdf
github源码:https://github.com/uoguelph-mlrg/Cutout
思路比Random Erase简单,随机选择一个固定大小的正方形区域,像素值全部用0填充即可,但为了避免0填充对训练数据有影响,需要对训练数据进行归一化处理,norm到0,但需要注意的是,随机选择的区域可能不在图像内,也就是说正方形区域可能只有部分处在图像内,因而模拟了任意形状的擦除操作。
2)hide-and-seek 、grid mask
hide-and-seek 、grid mask在图像中随机或均匀地选择多个矩形区域,并将其全部替换为零
- hide-and-seek
论文:Hide-and-Seek: A Data Augmentation Technique for Weakly-Supervised Localization and Beyond
arxiv:https://arxiv.org/pdf/1811.02545.pdf
github源码:https://github.com/kkanshul/Hide-and-Seek
将图像切分成S*S网络,每个网络使用一定概率进行遮挡,从而模拟出Random Erase和CutOut的效果。但是遮挡值设置为何值比较关键,如果填0或者255都可能改变训练集的数据分布,作者经过计算,采用整个数据集的均值影响最小。
- grid mask
论文:GridMask Data Augmentation
arxiv:https://arxiv.org/pdf/2001.04086v2.pdf
该方法是前三个遮挡方法的改进,因为Random Erase、CutOut和Hide-and-Seek都可能存在一个问题,就是把图像的可判别区域全部删除或者保留,引入噪声并且效果不佳。
怎么解决上述问题,在删除信息和保留信息之间做权衡呢?只需结构化drop操作,例如均匀分布地删除正方形区域,并且通过控制密度和size参数,来达到平衡,密度就是正方形个数,size就是正方形大小。
四种遮当方法的对比:
3)DropOut、DropConnect、DropBlock
类似于输入图像遮挡,在特征图上丢弃某些信息的方法常叫做正则化,也就是将类似的概念应用到特性映射中,最终目的还是防止模型过拟合。正则化的操作方式有:DropOut、DropConnect、DropBlock
- DropOut
DropOut是在训练过程中随意按概率丢弃一些神经元,丢弃的神经元输出置0;也就是随机删除减少神经元的数量,使网络变得更简单。
- DropConnect
DropConnect是国人提出的一个方法,思路和Dropout类似,但是DropConnect是在训练过程中把神经元的输入权值按概率置0,由于DropConnect处理起来比Dropout麻烦,效果和Dropout差不多,故没有成为主流技术。
- DropBlock
论文:DropBlock: A regularization method for convolutional networks
arxiv:https://arxiv.org/pdf/1810.12890.pdf
github源码:https://github.com/miguelvr/dropblock
中间Dropout的方式会随机的删减丢弃一些信息,但Dropblock的研究者认为,卷积层对于这种随机丢弃并不敏感,因为卷积层通常是三层连用:卷积+激活+池化层,池化层本身就是对相邻单元起作用。而且即使随机丢弃,卷积层仍然可以从相邻的激活单元学习到相同的信息。因此,在全连接层上效果很好的Dropout在卷积层上效果并不好。所以右图Dropblock的研究者则干脆整个局部区域进行删减丢弃。
如图:
图中(b)绿色的部分就是语义信息,该图模拟了Dropout的做法,随机丢弃一些位置的特征,但是作者认为这样并没有什么效果,因为网络依旧可以从相邻位置元素推断出来。
图(c)就是DropBlock的做法,既然丢弃某个单独位置不行,那么就按照一块一块地随意丢弃,迫使网络去学习到更加鲁棒的特征。
3.用多张图来进行数据增强
1)MixUp
论文:mixup: BEYOND EMPIRICAL RISK MINIMIZATION
arxiv:https://arxiv.org/pdf/1710.09412.pdf
MixUp使用两个图像与不同的系数比率相乘叠加,然后用这些叠加的比率调整标签。也就是就是将两张图片采用比例混合,label也按照比例混合。
例如将图片1的像素值乘以0.2+图片2的像素值乘以0.8,相应的one-hot的label也需要按照比例融合,对应的lable值就是[0.2,0.8],比如,原图如下所示:
而MixUp处理后的图像如图所示,需要注意,对于的标签也需要进行处理:
2)CutMix
论文:CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features
arxiv:https://arxiv.org/pdf/1905.04899.pdf
github源码:https://github.com/clovaai/CutMix-PyTorch
CutMix是将裁剪后的图像覆盖到其他图像的矩形区域,并根据混合区域面积的大小调整标签。也就相当于是是CutOut和Mixup的结合,将图片的一部分区域擦除并随机填充训练集中的其他数据区域像素值
4.GAN实现数据增强
1)style transfer GAN
论文:ImageNet-trained cnns are biased towards texture; increasing shape bias improves accuracy and robustness
arxiv:https://arxiv.org/pdf/1811.12231.pdf
style transfer GAN论文发现了一个结论:CNN训练学习到的实际是纹理特征(texture bias)而不是形状特征,这与人类的认知相反,因而通过gan引入风格化的ImageNet数据集,平衡纹理和形状偏置,提高模型的泛化能力。可以实现数据增强,可以有效减少CNN学习到的纹理偏差。
作者使用了6份数据,正常的猫、灰度图、只包含轮廓的、只包含边缘的、只有纹理没有形状的、猫的形状大象的纹理的,由结果可知,对于正常的图片和灰度图,网络识别率都很高,对于只包含轮廓和边缘的,网络识别率较低,对于只包含纹理的,网络识别率也较高。对于猫的形状大象的纹理的图片,网络误识别为大象的概率较高,因而可以推断网络学习的实际是纹理特征。因而可以通过GAN随机将物体的纹理替换,从而增强网络的学习特征能力。
5.数据分布不平衡
与上面提出的各种方法不同,其他一些Bag of freebies方法致力于解决数据集中的语义分布可能存在偏差的问题。在处理语义分布偏差问题时,一个非常重要的问题是不同类别之间存在数据不平衡的问题。
1)hard negative example mining( two-stage)
hard negative example mining解释为难例挖掘,一般用在two-step网络中。
在目标检测中我们会事先标记好ground_truth,接下来在图片中随机提取一系列sample,与ground_truth重叠率IoU超过一定阈值的(比如0.5),则认为它是positive sample,否则为negative sample,考虑到实际负样本数>>正样本数,我们为了避免network的预测值少数服从多数而向负样本靠拢,取正样本数:负样本数大约为1:3,显而易见,用来训练网络的负样本为提取的负样本的子集,那么,我们当然选择负样本中容易被分错类的困难负样本来进行网络训练啰。
那么负样本中哪些是困难负样本(hard negative)呢?困难负样本是指哪些容易被网络预测为正样本的proposal,即假阳性(false positive),如roi里有二分之一个目标时,虽然它仍是负样本,却容易被判断为正样本,这块roi即为hard negative,训练hard negative对提升网络的分类性能具有极大帮助,因为它相当于一个错题集。
如何判断它为困难负样本呢?也很简单,我们先用初始样本集(即第一帧随机选择的正负样本)去训练网络,再用训练好的网络去预测负样本集中剩余的负样本,选择其中得分最高,即最容易被判断为正样本的负样本为困难样本,加入负样本集中,重新训练网络,循环往复。
参考链接:https://blog.csdn.net/qq_36570733/article/details/83444245
2)online hard example mining( two-stage)
online hard example mining在线难例挖掘也一般用在two-step目标检测网络中。
简单来说就是从ROI中选择hard,而不是简单的采样。
Forward: 全部的ROI通过网络,根据loss排序;
Backward:根据排序,选择B/N个loss值最大的(worst)样本来后向传播更新model的weights.
这里会有一个问题,即位置相近的ROI在map中可能对应的是同一个位置,loss值是相近的,所以针对这个问题,提出的解决方法是:对hard做nms,然后再选择B/N个ROI反向传播,这里nms选择的IoU=0.7。
在后向传播时,直觉想到的方法就是将那些未被选中的ROI的loss直接设置为0即可,但这实际上还是将所有的ROI进行反向传播,时间和空间消耗都很大,所以作者在这里提出了本文的网络框架,用两隔网络,一个只用来前向传播,另一个则根据选择的ROIs进行后向传播,的确增加了空间消耗(1G),但是有效的减少了时间消耗,实际的实验结果也是可以接受的。
详细可以查看参考:https://blog.csdn.net/u013608402/article/details/51275486
3)Focal Loss(one-stage)
Focal loss主要是为了解决one-stage目标检测中正负样本比例严重失衡的问题。该损失函数降低了大量简单负样本在训练中所占的权重,也可理解为一种困难样本挖掘。
主要过程就是将又来的二分类交叉熵损失函数:
其中:gamma>0使得减少易分类样本的损失。使得更关注于困难的、错分的样本。例如gamma为2,对于正类样本而言,预测结果为0.95肯定是简单样本,所以(1-0.95)的gamma次方就会很小,这时损失函数值就变得更小。而预测概率为0.3的样本其损失相对很大。对于负类样本而言同样,预测0.1的结果应当远比预测0.7的样本损失值要小得多。对于预测概率为0.5时,损失只减少了0.25倍,所以更加关注于这种难以区分的样本。这样减少了简单样本的影响,大量预测概率很小的样本叠加起来后的效应才可能比较有效。
此外,加入平衡因子alpha,用来平衡正负样本本身的比例不均:文中alpha取0.25,即正样本要比负样本占比小,这是因为负例易分。
详细可以参考:https://www.cnblogs.com/king-lps/p/9497836.html
6.one-hot类别之间没有关联
另一个非常重要的问题是,不同类别之间关联程度的关系很难用one-hot表示。
1)Label Smoothing
论文:ImageNet-trained cnns are biased towards texture; increasing shape bias improves accuracy and robustness
arxiv:https://arxiv.org/pdf/1512.00567.pdf
思想就是对one-hot的label进行soft操作,比如[0 1]的one-hot编码,经过label smooth变成[0.05 0.95]。label smooth核心就是对label进行soft操作,不要给0或者1的标签,而是有一个偏移,相当于在原label上增加噪声,让模型的预测值不要过度集中于概率较高的类别,把一些概率放在概率较低的类别。
2)知识蒸馏
论文: Label refinement network for coarse-to-fine semantic segmentation
arxiv:https://arxiv.org/pdf/1703.00551.pdf
为了获得更好的软标签,Islam 等人引入了知识蒸馏的概念来设计标签细化网络。
7.边界框(BBox)回归
最后一包Bag of freebies是Bounding Box(BBox)回归的目标函数。
1)Smooth L1 Loss
实际目标检测框回归任务中的损失loss为:
Smooth L1 Loss缺点:
2)IoU_loss
paper:https://arxiv.org/pdf/1608.01471.pdf
考虑了预测BBox区域和地面真实BBox区域的覆盖范围。由于欠条是尺度不变的表示,可以解决传统方法在计算{x, y, w, h}的L1 loss 或者 L2loss时,损失会随着尺度的增大而增大的问题。
IoU Loss,其将4个点构成的box看成一个整体进行回归
IoU_loss的损失函数为:
IoU_loss缺点:
- 当预测框和目标框不相交时,IoU(A,B)=0时,不能反映A,B距离的远近,此时损失函数不可导,IoU Loss 无法优化两个框不相交的情况。
- 假设预测框和目标框的大小都确定,只要两个框的相交值是确定的,其IoU值是相同时,IoU值不能反映两个框是如何相交的。
3)GIoU_loss
paper:https://arxiv.org/abs/1902.09630
github:https://github.com/generalized-iou/g-darknet
GIoU损失是在覆盖区域之外还包括对象的形状和方向。他们提出寻找能够同时覆盖预测的BBox和ground truth BBox的最小面积BBox,并用这个BBox作为分母来代替原来IoU loss中使用的分母。
如上图所示,三种不同相对位置的框拥有相同的IoU=0.33值,但是拥有不同的GIoU=0.33,0.24,-0.1。当框的对齐方向更好一些时GIoU的值会更高一些。
GIoU_loss定义为:
其中:公式中的A c 指的是如图所示的外围蓝色的边界框;u uu指的是预测边界框与真实边界框之间的并集面积。当两个边界框处于同一水平线或者是同一竖直线上时,会退化成IoU
GIoU_loss的损失函数为:
分析:
GIoU_loss缺点:
当目标框完全包裹预测框的时候,IoU和GIoU的值都一样,此时GIoU退化为IoU, 无法区分其相对位置关系
4)DIoU_loss
好的目标框回归损失应该考虑三个重要的几何因素:重叠面积,中心点距离,长宽比。DIoU Loss,相对于GIoU Loss收敛速度更快,该Loss考虑了重叠面积和中心点距离,但没有考虑到长宽比。
DIoU Loss function定义为:
(上图中绿色框为目标框,黑色框为预测框,灰色框为两者的最小外界矩形框,d表示目标框和真实框的中心点距离,c表示最小外界矩形框的距离。)
5)CIoU_loss
paper:https://arxiv.org/pdf/1911.08287.pdf
github:https://github.com/Zzh-tju/DIoU-darknet
同时考虑了重叠面积、中心点之间的距离和长宽比。CIoU可以在BBox回归问题上获得更好的收敛速度和精度。CIou Loss改进了DIOU Loss,把重叠面积,中心点距离,长宽比都考虑进来了。
CIoU Loss function定义为:
其中:
参考链接:
https://blog.csdn.net/weixin_38688399/article/details/106692156
https://www.cnblogs.com/yymn/articles/13672236.html
opencv学堂的文章:想读懂YOLOV4,你需要先了解下列技术(一)
https://zhuanlan.zhihu.com/p/104236411
https://www.bilibili.com/video/BV1yi4y1g7ro?p=4