因为一直没有懂 yolov4,因此这次重新阅读 YOLOv4 并且留下一点点笔记。其实基本是简要翻译 (逃),结果没简要到哪里去建议直接看总结
YOLOv4和其他最先进的检测器对比
封面来源《9nine》

主要工作

  作者在这方面指出了,大多数基于 CNN 的检测器大量部署于推荐系统。提高实时对象检测器的准确度不仅可以用于推荐系统生成提示,还可以用于独立的过程管理和减少人工输入。传统图形处理单元 (GPU) 上的实时目标检测器操作允许以经济实惠的价格大规模使用。最准确的现代神经网络不能实时进行操作,且需要大量的 GPU 进行小批次的训练。
  作者希望能够使得 YOLOv4 易于训练,同时可以使用传统的 GPU 来获得实时的高质量且令人信服的检测效果。
  其工作总结如下:

  1. 开发了一个高效且强大的物体检测模型。使得任何人都可以使用 1080 Ti 或者 2080 Ti GPU 来训练一个超快且准确的物体检测器。
  2. 在训练检测器的时候,验证了最先进的物体检测中的 Bag of Freebies 和 Bag of Specials 方法 (关于这两个词,可以见 Bag of freebiesBag of speicals)
  3. 修改了最先进的方法,使其更高效,更适合单个 GPU 训练,包含了 CBN,PAN,SAM 等

相关工作

物体检测方法

  在此处,作者对现代的一些检测方法进行了简单的介绍。现代的检测器通常由两部分组成。一个在 ImageNet 上经过预训练的骨架 (backbone) 和一个用于预测类和物体边界框的头 (head)。对于那些运行在 GPU 平台上的检测器,其 backbone 可能是 VGG、ResNet、ResNeXt 或者 DenseNet。对于那些运行在 CPU 平台上的检测器,其 backbone 可能是 SqueezeNet,MobileNet 或者 ShuffleNet。对于 head 部分,其通常可以被分类为两种,即 one-stage 的物体检测器和 two-stage 的物体检测器。最具代表性的 two-stage 物体检测器是 R-CNN 系列,包含 fast R-CNN,faster R-CNN,R-FCN 和 Libra R-CNN。也可以使得 two-stage 物体检测器变成一个 anchor-free (无锚框) 的物体检测器,比如 RepPoints。对于 one-stage 检测器,最具代表性的就是 YOLO,SSD 和 RetinaNet。最近几年也有 anchor-free 的 one-stage 检测器,比如 CenterNet,CornerNet,FCOS 等。近年来的物体检测发展中,经常在 head 和 backbone 之间插入一些层,这些层被称为检测器的颈部 (neck)。通常 neck 由几个 bottom-up 路径和几个 top-down 路径组成。使用这种配置的网络包含 Feature Pyramid Network (FPN),Path Aggregation Network (PAN) BiFPN 和 NAS-FPN。除了上述模型,一些研究者还专注于直接搭建一个新的 backbone (DetNet,DetNAS) 或者一个全新的物体检测模型 (SpineNet,HitDetector)。

普通目标检测器的组成部分

  • Input: Image,Patches,Image Pyramid
  • Backbone: VGG16,ResNet,SpineNet,EfficientNet-B0/B7,CSPResNeXt50,CSPDarknet53
  • Neck:
    • Additional block: SPP,ASPP,RFB,SAM
    • **Path-aggregation block:**FPN,BiFPN,ASFF,SFAM
  • Heads:
    • Dense Prediction(one-stage):
      • RPN,SSD,YOLO,RetinaNet(anchor based)
      • CornerNet,CenterNet,MatrixNet,FCOS(anchor free)
    • Sparse Prediction(two-stage):
      • Faster R-CNN,R-FCN,Mask R-CNN(anchor based)
      • RepPoints(anchor free)

Bag-of-freebies

  通常,一个常规的物体检测器是离线训练的。因此研究者经常利用这一优势,使用更好的训练方法,在不增加推理成本的情况下获得更好的准确率。我们将这种只改变了训练策略或者只增加了训练成本的方法称为”Bag of freebies“。物体检测常用的且符合以上定义的方法是数据增强。数据增强的目的是增加输入图像的多样性,从而使得模型在不同的环境下有着高鲁棒性。比如,photometric distoitions 和 geometric distortions 是用来数据增强方法的两个常用的手段。在处理 photometric distortion 中,我们会调整图像的亮度,对比度,色调,饱和度以及噪声。对于 geometric distortion,我们会随机增加尺度变化,裁剪,翻转以及旋转。
  上述提到的数据增强都是像素级别的调整,他保留了调整区域的所有原始像素的信息。一些学者在数据增强方面专注于模拟物体被遮挡。他们在图像分类和物体检测上有好的效果。比如,random erase 和 CutOut 可以随机选择矩形区域融合或者零填充。对于 hide-and-seek 和 grid mask,它们随机或者均匀的选择多个矩形区域,并以零替换。如果将相似的概念用来特征图中,则有 DropOut, DropConnect 和 DropBlock 方法。此外,一些研究者还提出使用多张图片进行数据增强。比如,MixUp 使用两张图片相乘并以不同的系数进行重叠,并调整标签。对于 CutMix,它将裁剪的图片覆盖到其他图片的矩形区域,然后根据混合区域的大小调整标签。除了以上方法,style transfer GAN 也可以用于数据增强。这种用法可以有效地减少 CNN 所学习的纹理偏差。
  与上述提到的各种方法不同,其他一些 bag of freebies 用于解决数据集中的语义分布可能存在偏差的问题,处理语义分布存在偏差问题,一个非常重要的问题就是不同类别直接的数据不平衡,这个问题在 two-stage 物体检测器中通过困难负样本挖掘或者在线困难样本挖掘解决。但是样本挖掘不适合于 one-stage 检测器,因为这类检测器属于 dense prediction architecture 结构。因此 Lin 等人提出 focal loss 来解决不同类别数据不均衡问题,另外一个非常重要的问题就是 one-hot 编码很难描述不同类别之间的关联度关系。label smoothing 提出在训练时将硬标签转换为软标签,使得模型更具有鲁棒性。为了获得更好的软标签,Islam 等人提出了知识蒸馏的概念来设计标签细化网络。
  最后一个 bag of freebies 是设计边界框回归的目标函数。传统物体检测器通常使用 MSE 对边框的中心坐标、高、宽 {xcenter,ycenter,w,h}\{x_{center},y_{center},w,h\} 或者左上角和右下角两个坐标点 {xtop_left,ytop_left,xbottom_left,ybottom_right}\{x_{top\_left},y_{top\_left},x_{bottom\_left},y_{bottom\_right}\}。使用 anchor-based 方法,其调整为预测偏差 offset{xcenter_offset,ycenter_offset,woffset,hoffset}\{x_{center\_offset},y_{center\_offset},w_{offset},h_{offset}\} {xtop_left_offset,ytop_right_offset,xbottom_left_offset,ybottom_right_offset}\{x_{top\_left\_offset},y_{top\_right\_offset},x_{bottom\_left\_offset},y_{bottom\_right\_offset}\} 但是,直接估计 bbox 的每个点坐标值是将这些点作为独立的变量,没有考虑将目标物体当成一个整体进行预测。为了更好的解决这个问题,一些学者提出了 IoU 函数,将 BBox 区域和 ground true 的 BBox 区域作为整体。IoU loss 需要计算 BBox 四个坐标点以及 ground truth 的 IoU。因为 IoU 具有尺度不变性,它可以解决传统算法比如计算 {x,y,w,h}\{x,y,w,h\}l1l_1, l2l_2的损失函数时存在的问题,这个损失函数会随着尺度的变化而发生变化。一些学者继续提升 IoU loss 函数,比如,GIoU loss 包含了目标物体的形状和坐标,他们提出找到同时包含预测区域 BBox 和 ground true BBox 的最小区域,然后用这个 BBox 替代 IoU loss 原来的分母。DIoU loss 额外考虑了目标物体的中心距离,CIoU 另一方面同时将覆盖区域,中心点距离和纵横比考虑在内。CIoU 在 BBox 回归问题上可以获得最好的收敛速度和准确率。DIoU loss 额外考虑了物体中心距离。另一方面,CIoU 同时将覆盖区域,中心点距离和纵横比考虑在内。CIoU 在 BBox 回归问题上可以获得最好的收敛速度和准确率。

Bag-of-specials

  对于那些稍微增加了推理成本,但是可以极大地提升目标检测的准确率的插件模块和后处理方法,我们称之为 “bag of specials”。一般来说,这些插件模块用来提高一个模型中特定的属性,比如增加感受野,引入注意力机制或者提高特征整合的能力等,后处理方式是用来抑制模型预测结果的一种方法。
常用的提升感受野的方法是 SPP,ASPP 和 RFB。SPP 模型来源于空间金字塔匹配 (SPM),SPM 原本的方法是将特征图划分成 d×d 个相等的块,其中 d 可以是 {1,2,3,…},因此可以形成空间金字塔,然后提取 bag-of-word 的特征。SPP 将 SPM 应用在 CNN 中,然后使用 max-pooling 代替 bag-of-word 运算。因为 SPP 输出的是一维特征向量,所以其不能运用在全卷积网络 (FCN) 中。因此,在 YOLOv3 中,Redmon 和 Farhadi 改进了 SPP 模块,将 max-pooling 的输出和内核为 k×k 连接,k 为 {1,5,9,13},strike 为 1。
  ASPP 模块和改进 SPP 模块的区别主要在于原始的 k×k 的内核大小,max-pooling 的最大步长为 1 到 3×3 内核,膨胀比为 k,拓展卷积运算步长为 1。RFB 模块使用一些 ×k 的内核,膨胀比为 k,步长为 1 的拓展卷积,它比 ASPP 获得了更全面的空间覆盖率。(这段一直没懂)
物体检测上常用的 attention 模型主要分成 channel-wise attention 模块和 point-wise attention 模块,两个模块的代表性模型是 Squeeze-and-Excitation (SE) 和 Spatial Attention Module (SAM)。SE 模块虽然在 ImageNet 上仅仅增加了 2% 的计算量和 1% 的 top-1 准确率,但是在 GPU 上提高了 10% 的推理时间,因此 SE 更适合在移动设备运行。而对于 SAM,在 ImageNet 分类任务中,它只需要 0.1% 的额外计算就能提升 ResNet50-SE 0.5% 的 top-1 的准确率,它在 GPU 上没有有效地影响推理速度。
  关于特征融合,早期实验使用 skip connection 或者 hyper-column 来将低层物理特征和高层语义特征融合。因为多尺度预测方法比如 FPN 变的流行,因此许多将不同将特征金字塔融合的轻量级模型被提出。这些模型包含了 SFAM,ASFF 和 BiFPN。SFAM 的主要思想是在多尺度连接特征图上使用 channel-wise 级别的调整。对于 ASFF,它使用 softmax 作为 point-wise 级别的调整,然后将不同尺度的特征图加在一起。在 BiFPN 中,提出使用多输入权重残差连接去执行 scale-wise 级别的调整,然后将不同尺度的特征图加在一起。
  在最近的一些研究中,一些研究者将注意力放在了寻找优秀的激活函数。一个好的激活函数可以将梯度更有效的进行传播,同时不会增加额外的计算量。在 2010 年,Nair 和 Hinton 提出了 ReLU 来解决梯度消失问题,这个问题在传统的 tanh 和 sigmod 激活函数中经常会遇到。随后,LReLu,PReLU,ReLU6,Scaled Exponential Linear Unit (SELU),Swish,hard-Swish 和 Mish 等激活函数被提出,他们用于解决梯度消失问题。LReLU 和 PReLU 主要用来解决当输出小于零的时候,ReLU 的梯度为零的问题。ReLU6 和 hard-Swish 主要为量化网络而设计。对于神经网络的自归一化,提出 SELU 激活函数去实现这个目的。需要注意的是 Swish 和 Mish 都是连续可导的激活函数。
  基于深度学习的物体检测中常用的后处理方法是 NMS,可以过滤掉效果不好的 BBox,保留效果较好的 BBox。NMS 尝试改进的方法和优化目标方程的方法类似。NMS 提出的最初的方法并没有将上下文信息考虑在内,因此 Girshick 等人在 R-CNN 中添加了分类置信度作为参考,然后根据置信度得分的顺序,由高到低执行 greedy NMS,DIoU NMS 的开发者将重心坐标的距离信息添加到 Bbox 的筛选处理中了。值得一提的是,上面提到的后处理方法中都不直接引用捕获的图像特征,后续的 anchor-free 方法开发中不再需要后处理。

YOLOv4 网络结构、BoF、BoS 选择

  经过大量的实验验证,作者使用 CSPDarknet53 作为骨架,利用 SPP 提高其感受野,PANet 作为 Neck,YOLOv3 作为 head。对于训练激活函数,因为 PReLU 和 SELU 难以训练,并且 ReLU6 是专门为量化网络设计的,我们因此不考虑这这三个激活函数。正则化方面,选择了 DropBlock,因为它比其他正则化方法效果好。因为只关注在一块 GPU 上训练,因此不考虑 CGBN、SyncBN。
  此外,作者还提出了以下额外的改进

  • 新的数据增强方法:Mosaic 和 Self-Adversarial Training (SAT)
  • 使用遗传算法选择最优超参数
  • 改进现有算法,使其更适合 YOLOv4 高效训练和检测:改进了 SAM、PAN 和 Cross mini-Batch Normalization (CmBN)

Mosaic

  Mosaic 是一种新型的数据增广的算法,它混合了四张训练图片。因此有四种不同的上下文进行融合,然而 CutMix 仅仅将两张图片进行融合。此外,batch normalization 在每个网络层中计算四张不同图片的激活统计。这极大减少了一个大的 mini-batch 尺寸的需求。
mosaic

SAT

  自适应对抗训练 (SAT) 也表示了一个新的数据增广的技巧,它在前后两阶段上进行操作。在第一阶段,神经网络代替原始的图片而非网络的权重。用这种方式,神经网络自己进行对抗训练,代替原始的图片去创建图片中此处没有期望物体的描述。在第二阶段,神经网络使用常规的方法进行训练,在修改之后的图片上进检测物体。

CmBN

  CmBN(Cross mini-Batch Normalization)代表 CBN 改进的版本。它只收集了一个批次中的 mini-batches 之间的统计数据。
CmBN

SAM,PAN

  我们将 SAM 的 spatial-wise 注意力变成了 point-wise 注意力机制,然后将 PAN 中的 shortcut 连接变成了 concatenation 连接,正如下图所表示的那样。
SAM
PAN

YOLOv4 细节

网络结构 采用模块 BoF BoS
Backbone CSPDarknet53 CutMix,Mosaic data augmentation,DropBlock regularization,Class label smoothing Mish activation,Cross-stage partial connections(CSP),Multi-input weight residual connections(MiWRC)
Neck SPP,PAN
Head YOLOv3 CIoU-loss,CmBN,DropBlock regulariztion,Mosaic data augementation,Self-Adversarial Training,Eliminate grid sensitivity,Using multiple anchors for a single ground truth, Cosine annealing scheduler, Optimal hyperparameters, Random training shapes Mish activation, SPP-block, SAM-block, PAN path-aggregation block, DIoU-NMS

总结

  YOLOv4 这一论文,先是讲述了一些现代目标检测算法的发展,讲述了 backbone、Neck、Head 的组成和作用,讲述了目标检测器的组成部分,见普通目标检测器的组成部分
  随后讲解了 Bag of freebies,其基本只改变训练策略。而 Bag of specials 基本为模块和后处理方法,提升了检测准确度。BoF,BoS 的总结可以见下。这里部分可以看作是目标检测领域的发展了,也可以了解到各种方法的优缺点和原理。在之后的内容中作者对各种结构进行了实验并挑选网络结构,还自行提出了一定的创新,如 Mosaic 数据增强,自适应对抗训练 (SAT),利用遗传算法选择最优超参数,改进了 CmBN、SAM 和 PAN。最终的 YOLOv4 使用的内容可以见 YOLOv4 细节
  YOLOv4 这篇内容讲了许多技术内容,如果能弄懂这些名词的话也相当于是弄懂了物体检测的入门知识了。
  最后放一张 YOLOv4 结构图,出处 Windows 版 YOLOv4 目标检测:原理与源码解析
structure

bag of freebies

  • bag of freebies
    • 数据增强
      • 像素级别
        • photometric distortions
        • geometric distortions
      • 物体遮挡
        • random erase
        • CutOut
        • hide and seek
        • grid mask
        • DropOut
        • DropConnect
        • DropBlock
      • 图片融合
        • MixUP
        • CutMix
        • style transfer GAN
    • 样本不均衡
      • two-stage
        • hard negative example mining
        • online hard example mining
      • one-stage
        • focal loss
    • 类别关联度难以描述
      • label smoothing
    • 边界框回归目标函数
      • MSE
      • GIoU
      • DIoU
      • CIoU

Bag of specials

  • bag of specials
    • plugins modules
      • 提高感受野
        • SPP
        • ASPP
        • RFB
      • attention 模块
        • channel-wise
          • Squeeze-and-Excitation(SE)
        • point-wise
          • Spatial Attention Module(SAM)
      • 特征融合
        • skip connection
        • hyper-column
        • FPN
        • SFAM
        • ASFF
        • BiFPN
      • 激活函数
        • tanh
        • sigmod
        • ReLU
        • LReLU
        • PReLU
        • ReLU6
        • SELU
        • Swish
        • hard-Swish
        • Mish
    • 后处理方法
      • NMS
      • greedy NMS
      • DIoU NMS

吐槽

  后面的实验结果就不再翻译了。先吐糟一下自己,本来是想写写概要的结果变成了简要翻译,而且也没有简要到哪里去,尴尬。

参考

[1]Bochkovskiy A, Wang C Y, Liao H Y M. Yolov4: Optimal speed and accuracy of object detection[J]. arXiv preprint arXiv:2004.10934, 2020.
YOLOv4 原文翻译 - v4 它终于来了!
Windows 版 YOLOv4 目标检测:原理与源码解析