像素级数据增强(亮度、对比度、色彩、饱和度、噪声;随机尺度、裁剪、翻转、旋转)
模拟目标遮挡(Random Erase、Cutout、Hide-and-seek、Grid-mask;Dropout、DropConnect、DropBlock)
使用多张图混合增强(Mixup、CutMix)
样本不平衡问题(困难样本挖掘(HEM、OHEM)、Focalloss)
Onehot类标无法表示各类之间关系(Labelsmooth、Label refinement network)
边框回归损失函数(IoU、GIoU、DIoU、CIoU loss)
增强感受野(SPP、ASPP、RFB)
注意力机制(SE、SAM)
特征融合(SFAM、ASFF、BiFPN)
激活函数(LReLU、PReLU、ReLU6、Scaled Exponential Linear Unit(SELU)、Swish、hard-Swish、Mish)
非极大值抑制(GreedyNMS、softNMS、DIoUNMS)
标准化方法(BN、CGBN、FRN、CBN)
CutMix 的做法是将图像的一部分剪切下来再粘贴到另一张图像上。其基本真值标签会根据补丁的面积比例进行调整,比如狗的部分占 0.6,猫的部分占 0.4。
Mosaic 这种数据增强方法是将4张训练图像组合成一张来进行训练。
为了提升准确度,我们可通过提高网络深度来扩展感受野和增大模型复杂度。同时,为了降低训练难度,还可应用跳过连接。
密集模块(Dense Block)包含多个卷积层,其中每一层 H_i 都由批归一化、ReLU 与之后的卷积构成。H_i 的输入不仅包含前一层的输出,还包含之前所有层的输出以及原始输入,即 x_₀, x_₁, …, x_{i-1}。如下图:
CSPNet 将密集模块的输入特征图分为了两部分。第一部分 x_₀’ 会绕过密集模块,成为下个过渡层的输入的一部分。第二部分 x_₀’’ 则会通过密集模块,如下图所示。
这种新设计通过将输入分为两部分而降低了计算复杂度——此时仅有一部分输入会经过密集模块。
YOLOv4 使用了上面的 CSP 与下面的 Darknet-53 作为特征提取的骨干。
相比于基于 ResNet 的设计,CSPDarknet53 模型的目标检测准确度更高,不过 ResNet 的分类性能更好一些。
早期的深度学习的模型设计相对简单。每一层的输入都来自其上一层。更前面的层会提取局部的纹理和图案信息,并构建出后续层所需的语义信息。但是,随着网络向右侧推进,微调优化预测结果时所需的局部信息可能会丢失。
层之间信息的流动方式变成了模型设计中需要考虑的又一关键事项。
为了检测不同大小的目标,需要使用一种分层结构,使得头部可探测不同空间分辨率的特征图。
YOLOv3 采用了与 FPN 类似的方法来实现不同大小层次的目标检测预测。
补充:常见的特征提取方式,如下
对原图像进行不同的scale,对不同的scale进行不同的提特征:仅采用最后的feature map
对不同层的feature map分别提取
首先解释一下什么是空间金字塔?
以不同大小的块来对图片提取特征,比如下面这张图:
利用三张网格,大小分别为44,22,1*1,将这三张网格放到下面这张特征图上,就可以得到16+4+1=21种不同的分割方式,分别在每一个区域(每个区域会含有多个像素)取最大池化,那么就可以得到21组特征。
那么SPP就是以不同的大小格子的组合方式来池化的过程。具体来说就是把输入的feature map按照不同尺度进行分割,比如图中(4, 4) (2, 2) (1, 1)三种不同的尺度分割,然后会产生不同的bin,比如分成(4, 4)就16个bins,然后在每个bin中使用max pooling,然后就变成固定长度为16的向量。例如下图中,经过SPP层之后可以得到相同长度的向量,之后再输入FC layer。
YOLO 中使用的 SPP 经过修改,以保留输出的空间尺寸大小。而且还在大小为 1×1、5×5、9×9、13×13 等的滑动核(sliding kernel)应用了最大池化。空间尺寸大小得以保留。然后将来自不同核大小的特征图连接起来作为输出。
下图是用于目标检测的路径聚合网络(PAN)。其中,自底向上的路径得到增强,使得低层信息更容易传播到顶部。在 FPN 中,局部空间信息会向上传播,如红色箭头所示。尽管图中可能没有展示清楚,但这条红色路径穿过了大约 100 多层。
PAN 引入了一个捷径路径(绿色路径),其仅需 10 层左右就能抵达顶部的层。这个短回路概念使得顶层也能获取到细粒度的局部信息。
YOLOv4 并没有将邻近层加到一起,而是将特征图连接到一起。
SAM是对特征图进行通道维度的池化压缩(SAM 会为输入特征图分别应用最大池化和平均池化,从而得到两个特征图集合),之后进行一次卷积操作与sigmoid激活函数得到空间权值图,再将该权值图乘回原特征图,就得到了赋有注意力的特征图。通过全局信息抑制无用的区域、加强重点区域,从而提升性能。
YOLOv4 使用了一种修改版的 SAM,其中没有使用最大池化和平均池化。
YOLOv4 使用修改版的 SPP、PAN 和 SAM 逐步实现 / 替换了 FPN 概念。
在全连接层中,我们可通过丢弃一些连接来迫使模型学习不同的特征,而不是过于依赖少量特征。但是,这可能不适用于卷积层。相邻的位置可能高度相关。所以即使丢弃一些像素(如中部的图所示),仍然可以检测出空间信息。DropBlock 正则化基于类似的概念,但适用于卷积层。
每当你觉得自己完全正确时,你可能只是想错了。如果一个预测结果的置信度为 100%,可能只是说明模型记忆了这个数据,而非学习了什么东西。标签平滑化将预测结果的目标上界调整至了一个更低的值,比如 0.9。
然后在计算损失时,模型会以这个值为目标,而不是 1.0。这一方法可缓解过拟合问题。
Swish,其表现优于 ReLU 以及其它许多激活函数。
损失函数能为我们提供如何调整权重以降低成本的信号。所以在预测结果错误时,我们期望其能为我们提供前进的方向。但在使用 IoU 且基本真值框与预测结果不重叠时,这却无法实现。假设有两个预测结果与基本真值都不重叠,则 IoU 损失函数无法确定哪个结果更好——即便其中一个结果可能与基本真值更接近。
(GIoU)通过将该损失优化为以下形式而解决了这一问题:
引入 Complete IoU Loss(CIoU)以便:
· 增大基本真值框与预测框之间的重叠面积;
· 最小化它们的中心点之间的距离;
· 维持框的长宽比的一致性。
其最终定义为:
余弦调度会根据一个余弦函数来调整学习率。首先,较大的学习率会以较慢的速度减小。然后在中途时,学习的减小速度会变快,最后学习率的减小速度又会变得很慢。
这张图展示了学习率衰减的方式(下图中还应用了学习率预热)及其对 mAP 的影响。可能看起来并不明显,这种新的调度方法的进展更为稳定,而不是在停滞一段时间后又取得进展。