文章目录
- 整体概况
- 数据增强
- Mosaic数据增强
- 基于CSPNet网络思想的架构改进
- Mish激活函数
- CSPNet
- CSPNet 3 大优势
- Partial Transition 层
- CSPDarkNet (yolo v4 中的CSPDarkNet53)
- Neck
- SPPNet
- PAN-FPN 结构
- 正负样本匹配
- 损失函数
- IOU 损失函数
- IOU的2个问题:
- GIOU Loss示意图如下:
- GIOU 问题如下:
- DIOU 的提出
整体概况
YOLOv4主要涉及的改进内容如下:
- 输入端改进:Mosaic数据增强
- 主干网络:CSPDarkNet53(涨点最优价值,对后续框架影响最大的一点)
- Neck:SPP、PANet
- 损失函数:CIOU损失
- 激活函数:Mish激活函数
- 样本匹配:增加了匹配样本的数量
数据增强
Mosaic数据增强
利用了4张图片,对4张图片进行拼接,每一张图片都有其对应的框框,将4张图片拼接之后就获得一张新的图片,同时也获得这张图片对应的框,然后将这样一张新的图片传入到神经网络当中去学习,这极大丰富了检测物体的背景,
Mosaic数据增强的具体步骤如下:
- 首先随机取4张图片
- 分别对4张图片进行数据增广操作,并分别粘贴至与最终输出图像大小相等掩模的对应位置。
- 进行图片的组合和框的组合
注意:数据增广包括:翻转、缩放以及色域变化(明亮度、饱和度、色调)等操作。
使用 Mosaic 数据增强主要有2个优点:
- 丰富数据集:随机使用 4 张图像,随机缩放,再随机分布进行拼接,大大丰富了目标检测的数据集,特别是随机缩放增加了很多小目标,让网络模型对于小目标的稳健性变得更好。
- 减少 GPU 的使用:Mosaic 增强训练时,可以在单图像尺度的情况下直接计算 4 张图像的数据,使得 Mini-batch Size 并不需要很大,即使用 1 个 GPU 就可以达到比较好的收敛效果。
基于CSPNet网络思想的架构改进
Mish激活函数
Mish 激活函数是一种自带正则的非单调激活函数,平滑的激活函数能够让模型获得更好的非线性;从而得到更好的准确性和泛化,Mish 激活函数的数学表达式为:
如图所示,首先,Mish 函数和 ReLU 一样都是无正向边界的,可以避免梯度饱和。其次,Mish 函数是光滑的,并且在绝对值较小的负值区域允许一些负值。
注意,Mish 激活函数的计算复杂度比 ReLU 要高,在计算资源不足的情况下,可以考虑使用 LeakyReLU激活函数代替 Mish 激活函数。
CSPNet
涨点最优价值,对后续框架影响最大的一点。
主要目的是使该架构能够实现更丰富的梯度组合,同时减少计算量。这个目的是通过将基础层的特征图分割成两部分,然后通过提出的跨阶段分层(cross-stage hierarchy)结构进行合并来实现的。
主要概念是通过分割梯度流,使梯度流在不同路径中传播。通过这种方式传播的梯度信息更加丰富。此外,CSPNet可以大大减少计算量,提高推理速度以及精度。
CSPNet 3 大优势
基于CSPNet的目标检测器主要有以下3个优势:
- 增强学习能力: 现有的CNN在轻量化后,其精度大大降低,因此作者希望加强CNN的学习能力,使其在轻量化的同时保持足够的准确性。
- 移除计算瓶颈:过高的计算瓶颈会需要更多的计算周期来完成推理过程,或者一些算力单元经常闲置。因此,作者希望能够均匀分配CNN中各层的计算量,这样可以有效提升各计算单元的利用率,从而减少不必要的能耗。
- 降低内存消耗:内存晶圆制造成本非常昂贵,而且还占用了大量的空间。CSPNet能有效降低存储的成本,进而大大降低硬件的成本。
Partial Transition 层
设计Partial Transition 层的目的是使梯度组合的差异最大。Partial Transition 层是一种层次化的特征融合机制,它利用梯度流的聚合策略来防止不同的层学习重复的梯度信息。
在这里CSPNet论文中设计了2个 CSPDenseNet 变体来展示这种梯度流截断是如何影响网络的学习能力的。
Transition 层的含义和 DenseNet 类似,是一个 1×1 的卷积层(没有再使用Average pool)。图中Transition 层的位置决定了梯度的结构方式,并且各有优势:
© Fusion First 方式,先将2个部分进行 Concat,然后再进行输入到 Transion 层中,采用这种做法会使得大量梯度信息被重用,有利于网络学习;
(d) Fusion Last 的方式,先将部分特征输入 Transition层,然后再进行Concat,这样梯度信息将被截断,损失了部分的梯度重用,但是由于 Transition 的输入维度比©图少,相对来说也可以减少计算复杂度。
(b) 图中的结构是论文 CSPNet 所采用的,其结合了 ©、(d) 的特点,提升了学习能力的同时也提高了一些计算复杂度。
CSPNet作者在论文中给出其使用不同 Partial Transition 层的实验结果,如图所示为PeleeNet改进前后的性能对比。
如果在实际项目中想使用CSPNet来改进自己的模型,作者的建议是:具体使用哪种结构可以根据实际的项目条件和使用场景进行调整。
CSPDarkNet (yolo v4 中的CSPDarkNet53)
CSPDarkNet结合了Fusion First与Fusion Last的设计思想,设计了 CSPResBlock,并用于 CSPDarkNet 的构建。
如图所示,CSPResBlock 的基本组件是 Conv+BN+Mish 的形式,其中也包含了从 ResNet吸取的残差结构的思想。但是为了降低重复的梯度学习,设计者又使用了另一个 Shortcut和 Conv+BN+Mish 结合的形式,对特征进行了一次提取,以增加梯度的丰富性。
由于跨越的卷积层数比较多,大大降低了梯度学习的重复性。同时,在 Block 的最后使用了 Concat 进行特征的融合,也大大增加了特征的鲁棒性,从而在很大程度上提升了模型的性能。
CSPDarkNet53依然使用的是类似 ResNet 的层次结构设计的思想,以及这里CSPDarkNet53对于每个 Stage的配置同DarkNet53一样,分别是 1、2、8、8、4,依次对应的下采样倍数为:2、4、8、16、32。
Neck
SPPNet
SPP模块的特点如下:
- 由于对输入图像的不同纵横比和不同尺寸,SPP同样可以处理,所以提高了图像的尺度不变和降低了过拟合;
- 实验表明训练图像尺寸的多样性比单一尺寸的训练图像更容易使得网络收敛;
- SPP 对于特定的CNN网络设计和结构是独立的。(也就是说,只要把SPP放在最后一层卷积层后面,对网络的结构是没有影响的, 它只是替换了原来的pooling层)
- 不仅可以用于图像分类而且可以用来目标检测;
因此,YOLOv4借鉴了SPP的思想,在Backbone尾部使用了SPP结构实现了局部特征和全局特征的融合,扩大了感受野,丰富最终特征图的表达能力,进而提高 mAP。
PAN-FPN 结构
FPN 是 Facebook 于 2017 年提出的用于目标检测的模块化结构,但 FPN 在很多计算机视觉任务中都有使用,比如姿态估计、语义分割等领域。
FPN 通过构造一种独特的特征金字塔来避免图像金字塔中计算量过高的问题,同时能够较好地处理目标检测中的多尺度变化问题。如图所示的 FPN 结构,对于 Backbone的特征进行 1×1 卷积来改变特征图的通道数,同时最底层的特征进行向上采样,然后将2个特征进行融合,得到更高分辨率、更强语义的特征,这样也有利于小目标的检测。
可以看到 FPN 是自顶向下将高层的强语义特征传递下来,对整个特征金字塔进行增强,不过 FPN 结构只增强了特征的语义信息,对特征的定位信息没有得到很好的传递,因此在YOLOv4中还添加了 PAN 结构,来增强定位信息的传递。
FPN+PAN 借鉴的是PANet,当时主要应用于图像分割领域,如图所示,FPN 是自顶向下,将高层的强语义特征传递下来,而 FPN+PAN 针对这一点,在 FPN 的后面添加一个自底向上的金字塔,这样的操作是对 FPN 的补充,将底层的强定位特征传递上去,这也YOLOv4的Neck不仅能增强高级语义信息,又能增强特征的定位信息。
正负样本匹配
YOLOv4采用了不同于YOLOv3的multi anchor策略,即只要大于IoU阈值的anchor box,都统统视作正样本,换言之,那些原本在YOLOv3中会被忽略掉的样本,在YOLOv4中则统统成为了正样本,不难看出,YOLOv4的正样本会略微多于YOLOv3,对性能的提升也自然会有一些帮助。
GT需要利用max iou原则分配到不同的预测层yolo-head上去,然后在每个层上单独计算正负样本和忽略样本。
损失函数
MSE Loss主要问题就是导数变化不稳定,尤其是在早期阶段(损失越大,导数越大),随着导数越来越小, 训练速度变得越来越慢。也因此有学者提出了IOU一系列的损失函数。
IOU损失函数演变的过程如下:IOU => GIOU => DIOU =>CIOU损失函数,每一种损失函数都较上一种损失函数有所提升。
IOU 损失函数
IOU的表达式如下所示:
IOU的2个问题:
问题1:即情况1的情况,当预测框和目标框不相交时,IOU=0,无法反应两个框距离的远近,此时损失函数不可导,IOU_Loss无法优化两个框不相交的情况。
问题2:即情况2和情况3的情况,当2个预测框大小相同,2个IOU也相同,IOU_Loss无法区分两者相交情况的不同。
GIOU Loss示意图如下:
图中最大外接矩形为C,红色区域为差集A(C-并集),那么给出GIOU Loss的表达式如下:
可以看到GIOU Loss中,增加了相交尺度的衡量方式,缓解了单纯IOU Loss时的问题。
如下图所示的两个案例,他们的IOU均为0.33,而他们的GIOU分别为0.33和0.24.
GIOU 问题如下:
可以看出,下面 3 种情况差集均相等,这个时候 GIOU Loss就退化为了IOU Loss,GIOU Loss 也无法反映 3 种情况的好坏。
DIOU 的提出
为了解决GIOU遇到的问题,DIOU就诞生了。
DIOU作者认为好的目标框回归函数应该考虑3个重要几何因素:重叠面积、中心点距离,长宽比。
针对 IOU 和 GIOU 存在的问题,DIOU作者从两个方面进行考虑
1. 如何最小化预测框和目标框之间的归一化距离?
2. 如何在预测框和目标框重叠时,回归的更准确?
针对第一个问题,提出了 DIOU Loss(Distance IOU Loss),DIOU Loss 考虑了重叠面积和中心点距离,当目标框包裹预测框的时候,直接度量 2 个框的距离,因此 DIOU Loss 收敛的更快。
DIOU 的问题:
如下图所示的3种状态预测框和真实目标框的中心点距离是相同的,DIOU Loss 也退化成了 IOU Loss。如上面提到的目标检测回归函数需要考虑到的3种因素,DIOU Loss 没有引入长宽比的衡量。针对这个问题,CIOU Loss 被提出来。
YOLOv4 采用 CIoU Loss 做 Bounding Box 的回归损失函数,而分类损失和目标损失都使用的是交叉熵损失。
对于回归损失,其数学表达式如下:
式中,d,c 分别表示预测结果与标注结果中心点的欧氏距离和框的对角线距离,w和h表示预测框的宽高。
这样CIOU Loss 将目标框回归函数应该考虑的 3 个重要几何因素都考虑进去了:重叠面积、中心点距离、长宽比。
对于分类损失和目标损失,其数学表达式如下:
不损失精度,提升计算速度的操作?
要降低计算量?
要增加计算效率?