目标检测入门之再读YOLOv4(二)

1 引言

在上一节中我们重点介绍了YOLOv4的网络结构和相关图示说明,本节我们来介绍YOLOv4相关的优化技巧策略.

YOLOv4的论文链接: 戳我

闲话少述,我们直接开始

2 BOF and BOS

Bag-of-Freebies是指在网络训练时所用到的技巧,不影响推理预测的时间
Bag-of-Specials是指在网络设计或处理时所用到的技巧,轻微增加推理预测时间,但可以提升较大的精度

在对BOF和BOS进行详细展开之前,我们先来看一下YOLOv4所采用的完整方法有哪些:

接着我们对其中的每一项分别进行展开说明.

3 BoF for Backbone

3.1 CutMix

CutMix是2019年提出的数据增强的方式,论文链接.

其核心思想是将一部分区域cut掉但不填充0像素而是随机填充训练集中的其他数据的区域像素值,分类结果按一定的比例分配.

从下图中可以看出CutMix的Image以及Label是由两张不同的照片组合而成的,此外,数据增强还有另外两个方式: Mixup以及Cutout

  • Mixup: 将随机的两张样本按比例混合,分类的结果按比例分配
  • Cutout: 随机的将样本中的部分区域Cut掉,并且填充0像素值,分类的结果不变

3.2 Mosaic data augmentation

Mosaic 是作者新创的数据增强方法,采用随机缩放,裁剪的方式混合拼接4中图像进行训练,可以说是CutMix的加强版.

采用这种方法可以丰富检测数据集,并且因为随机缩放增加了很多小目标,让模型的稳健性更好.

此外,作者考虑到可能需要只使用单个GPU的计算也能达到好的效果,因此使用Mosaic训练时,可以直接计算4张图片的数据,使得Mini-batch的大小不需要很大.

3.3 DropBlock regularizaton

DropBlock与Dropout功能类似,也是避免overfitting的一种正则化方法,于2018年提出.

论文链接: 戳我

上图中,图b是使用Dropout的方法,会随机删除神经元的数量,但网络仍然可以从相邻的激活单元中学习到相同信息.

图c是使用DropBlock的方法,随机将整个局部区域进行删减,网络就会去注重学习某些特征以实现正确分类而得到更好的泛化效果.

3.4 Class Label smoothing

Label Smoothing 是图像分类经常会用到的一种正则化方法.

论文链接: 戳我

在分类任务中,通常会将输出用softmax进行归一化处理,再使用one-hot label去计算cross-entropy function来训练模型.但是使用one-hot向量表示容易导致网络overfitting的问题,因此Label Smoothing就是将one-hot label 变得更加soft, 使得计算loss时可以有效抑制overfitting的现象,提高模型的泛化能力.

具体作法如下图所示,降低正确类别的权重,另一方面提高错误类别的权重.

其中,K为类别数,为超参,在 [公式] 为正确类别时为1,错误类别时为0

4 BoS for Backbone

4.1 Mish activation

Mish是连续可微的非单调激活函数,跟ReLU相比,Mish的梯度更加平滑,并且在负值时允许有较小的负梯度,可以稳定网络的梯度流,具有更好的泛化能力.

论文链接: 戳我

公式定义如下:

YOLOv4作者使用CSPDarknet53网络在ImageNet数据集上做图像分类任务,发现使用了Mish激活函数的TOP-1和TOP-5的精度比没有使用时都略高一些.

因为YOLOv4的Backbone中都使用了Mish激活函数,而后面的网络层则还是使用leaky relu函数

4.2 Multiinput weighted residual connections (MiWRC)

YOLOv4参考了EfficientDet的架构以及方式,使用了多输入加权的残差链接(MiWRC)作为backbone的BOS.

  • EfficientDet的backbone使用EfficientNet, Neck为BiFPN

  • 由下图可以看出EfficientNet-B0的架构通过多个MBConv Block构成,MBConv Block就是指MobileNet V2的Inverted Residual Block.
  • MBConv的主要架构如下右图所示,其设计是先升维再降维,与residual block先降维在升维的操作不同,而这样的涉及可以让MobileNet v2能够更好的利用残差连接以提升准确率.
  • BiFPN是由PANet进行进化,删除贡献程度小的节点,并提出跨尺度融合的优化方法,在输入与输出结点中间加入connection.
  • MiWRC的思想源自于BiFPN,在FPN中每一层取得的feature都视为平等的,而MiWRC则认为不同层的feature理应有不同的重要性,需针对不同尺度的特征给予不同的权重比例.

5 BoF for detector

5.1 CIOU-loss

在介绍CIOU-loss之前,先说明IOU loss的缺点以及各个IOU loss的演进过程, 框回归loss进化过程如下:

Smooth L1 Loss -> IOU Loss(2016) -> GIOU Loss(2019) -> DIOU Loss(2020) -> CIoU Loss(2020)

接下来对上述loss进行展开说明.

IOU Loss

使用IOU Loss会有两个问题:

  • 当预测框和目标框不相交时,IOU为0,无法反映两个框之间的远近,此时损失函数不可导,也就是说无法计算梯度,因此无法优化两个框不相交的情况
  • IOU无法反映预测框与目标框的重合大小,如下图所示,这三种情况拥有相同的IOU值,但是重合度不同

之后的GIoU,DIoU,CIoU都是基于IOU loss增加一个惩罚项:

GIOU Loss (Generalized IOU Loss)

GIOU 为了解决预测框与目标框不重叠的问题,因此在IOU loss的基础上增加一个惩罚项,比IOU 更能反映两个框的接近程度.

由上图可以看到C为目标框Ground Truth与预测框Predict的最小包围框

由上图可以得知,当两个框距离越远,GIOU loss越大,因此GIOU 相比IOU更能反映两个框的接近程度.

虽然GIOU解决了IOU的梯度问题,但是仍存在一些缺点...

  • 在训练过程中,GIOU会倾向于先增大predict bounding box的大小,使它能够与gt有所重叠,如此一来才能计算IOU loss.这个操作会导致消耗大量的时间,影响模型收敛速度.
  • 由下图可以看到predict bounding box的变化过程,绿色框为目标框的gt,黑色框为anchor box,蓝色框为预测框predict bounding box.
  • 若预测框刚好在目标框内部时,此时GIOU loss 与 IOU loss的值一样,无法区分相对位置,如下图所示:
  • 当两个框平行或者垂直时,会导致GIOU loss的值一样
DIOU Loss (Distance IOU Loss)

基于IOU与GIOU存在的问题,作者提出了两个问题:

  • 直接最小化预测框与目标框之间归一化距离是否可行,以达到更快的收敛速度
  • 如何在预测框与目标框有重叠时,回归地更准确

DIOU考虑了重叠面积与中心点的距离,增加了一个惩罚项用于最小化两个框的中心点距离

DIOU loss的优点为:

  • DIOU 能够直接优化两个框之间的距离,而GIOU趋向减少最小包围框的面积,因此比GIOU loss收敛速度更快.如下图所示:
  • 当预测框在目标框内部时,GIOU loss 与IOU loss的值相同,此时GIOU退化成IOU而无法区分其相对位置,DIOU可以更好地优化此类问题.如下所示:
  • 可以将DIOU替换IOU用于计算NMS算法中,即论文中提出的DIOU-NMS
CIOU Loss (Complete IOU Loss)
一个好的目标框损失损失函数应考虑三个因素:重叠面积,中心点距离,长宽比,
DIOU loss考虑了重叠面积与中心点距离,但没有考虑长宽比,
因此作者提出了CIOU loss将三个因素都考虑到,并且模型的收敛精度更高.

CIOU在DIOU的基础上多增加了一个惩罚项,考虑了长宽比的因素.公式如下:

CIOU loss的梯度类似于DIOU loss,但是要考虑v的梯度,以下是v的梯度计算公式:

5.2 CmBN (Cross mini-Batch Normalization)

下图表示三种不同的BN方式:

  • BN是对当前mini-batch进行归一化,但往往batch size都很小,可能会发生抽样不均匀而导致归一化会有问题,因此有很多对于小batch size的 BN方法.
  • CBN的想法就是将之前mini-batch一起计算,但不保留太多个mini-btach,作法是对当前及当前3个mini-batch的结果进行归一化
  • YOLOv4新创的CmBN是基于CBN去做修改,在mini-batch之间不做更新计算,而是在一个batch做完后才去更新网络参数.

5.3 SAT (self-Adversarial Training)

SAT是作者创新的一种数据增强的方法,分成两个阶段完成

  • 首先,先对训练样本进行前向传播,然后进行反向传播时修改图片像素(不修改网络权重),降低模型检测性能,通过这种方式让神经网络对自身执行对抗式学习,制造出图片没有检测对象的错觉.这一阶段其实就是在在增加样本的训练难度.
  • 第二阶段,就是使用这些修改过的图片对模型进行训练

上述训练方式有助于推广模型和降低模型过拟合问题.

5.4 Eliminate grid sensitivity

作者在观测一段物体检测的影片中发现,因为检测物体的中心点多位于接近Grid中心,而导致在Grid边缘时较难检测,但实际状况物体移动的路线是连续的,所以其中心位置应该也是连续的,也就是说物体可能会出现在Grid边缘.

作者认为之所以有检测物体的中心点多位于接近Grid中心点的问题存在,是因为Sigmoid函数的梯度,由下图可以看到Sigmoid在Grid边缘时倒数接近0,容易发生梯度消失,导致中心点在Grid边缘时很难学习到准确的结果.

因此作者在Sigmoid函数做了些改变,将Sigmoid乘以一个大于1的值,并且考虑到不同的Grid Size对于边界效应的敏感度,采用 [公式]

5.5 Cosine annealing scheduler

Cosine annelaling 是利用预弦函数来调整学习率,一开始会先缓慢的降低学习率,然后中途在加速下降,最后再次缓慢下降.

Pytorch提供了两个版本的Cosine annealing

 torch.optim.lr_scheduler.CosineAnnealingLR (optimizer, T_max, eta_min=0, last_epoch=-1, verbose=False)
  • optimizere 指优化器
  • T_max是指最大的迭代次数,表示cos周期的1/4
  • eta_min是指最小学习率
  • last_epoch是指最后一个epoch的index,默认为1表示从头开始训练
  • verbose表示是否要印出更新的消息

公式如下:

torch.optim.lr_scheduler.CosineAnnealingWarmRestarts (optimizer, T_0, T_mult=1, eta_min=0, last_epoch=-1, verbose=False)

它与CosinAnnealingLR()参数有两个不一样的地方:

  • T_0是指初始restart的epoch书目
  • T_mult是指restart后增加迭代次数的乘法因子,可以想成T_0 = T_0 * T_mult

公式如下:

5.6 Optimal hyperparameters

使用基因算法Genetic Algorithms来选择超参数.作法是先随机组合超参数去做训练,然后挑选出最好的10%超参数再去随机组合并训练,最后选择最佳的模型.

6 BoS for detector

6.1 SAM-block

SAM源自于论文CBAM(Convolutional Block Attention Module)的论文,提出了两种注意力机制的技巧.

论文链接: 戳我

  • 先来介绍以下CBAM,如下图所示,输入一个特征F,先进行Channel attention module后得到权重系数和原来的特征F相乘,然后在进行Spatial attention module后得到权重系数和原来的特征F相乘,最后就可以得到缩放后的新特征.
  • 接着我们来介绍Channel attention module(通道注意力模块),该模块就是将输入的特征F分别进行全局的Maxpooling与Averagepooling,接着将这两个输入到一个权重共享的MLP,再将这两个进行element-wise summation操作后经过Sigmoid函数会得到权重系数Mc,再将这个权重系数与原来的特征F相乘,就可以得到缩放后的新特征.
  • Spatial attention module(空间注意力模块), 首先对不同的feature map上相同位置的像素值进行全局的Maxpooling与Average pooling,接着将这两个spatial attention map 进行concat, 再利用一个7X7的卷积后经过Sigmoid函数会得到权重系数Ms,在将这个权重系数与原来的特征F相乘,就可以得到缩放后的新特征,如下所示:
  • YOLOv4将SAM修改为pointwise attention,由下图可以看到它不做Maxpooling 与Average pooling的操作,而是直接接一个7X7的卷积层,如下:

6.2 DIOU-NMS

在经典的NMS中,置信度最高的检测框和其他检测框会逐一算出对应的IOU值,并将值超过阈值的检测框过滤掉.但是在实际情况下,当两个不同的物体靠的很近时,由于IOU值比较大,在经过NMS算法后,往往只剩下一个检测框,这样容易导致有漏检的状况发生.

DIOU-NMS不仅考虑IOU的值,还考虑两个框的中心点的距离.如果两个框之间的IOU比较大,但是他们中心点之间的距离比较远,则会被认为是不同物体的检测框而不会被过滤掉.

以下是DIOU-NMS的公式:

解释:

  • 得分最高的预测框M和其他框 [公式] 的DIOU值比IOU值大时, [公式] 的置信度仍可以保持;反之,就将 [公式] 的置信度设置为0

7 总结

上述方法就是YOLOv4所做改进的部分!

作者做了很多近几年的各种技巧的实验,以及一些创新改进的方法.

仔细研读YOLOv4的论文可以学习到不少的知识.