吊打一切:YOLOv4的tricks汇总

来源 | AI算法与图像处理(ID:AI_study)

即便是目标检测在过去几年开始成熟,竞争仍然很激烈。以下所示,YOLOv4声称拥有最早进的精度,同时保持高处理帧速率。它在 MS COCO数据集上,使用Tesla V100以接近65 FPS推理速度得到精度43.5% AP (65.7% AP₅₀)。在目标检测中,高精度再也不是惟一的基准。咱们但愿模型在边缘设备中平稳运行。如何用低成本的硬件对输入视频进行实时处理也变得很是重要。php

https://medium.com/@jonathan_hui/yolov4-c9901eaa8e61git

YOLOv4引用论文汇总:github

连接: https://pan.baidu.com/s/1a2IoSFQnFDE8Q5--5BpqMg 算法

提取码: scei编程

阅读 YOLOv4 过程当中有趣的部分是新技术已经应用来评估、修改并集成到YOLOv4中。并且它还作了一些改变,使检测器更适合在单个GPU上训练。c#

Bag of freebies (Bof) & Bag of specials (BoS)
网络

在训练过程当中能够进行的优化(like data augmentation, class imbalance, cost function, soft labeling etc…),以提升精度。这些改进对推理速度没有影响,被称为“bag of freebies”。而后,还有“bag of specials”,它对推理时间有轻微的影响,在性能上有良好的反馈。这些改善包括增大感觉野,注意力机制的使用,特征整合,如跳跃链接和 FPN,以及后处理,如非最大值抑制。在本文中,咱们将讨论如何设计特性提取器和 neck 以及全部这些 Bof 和 BoS 好东西。架构

Backboneapp

Dense Block & DenseNetdom

为了提升模型的准确性,咱们能够设计一个更深的网络来增大感觉野,增长模型的复杂度。为了减轻训练难度,可使用skip-connections 。咱们能够用密集互联的层来进一步扩展这个概念。

一个Dense Block包含多个卷积层,每层 Hi 由 batch normalization(BN)、ReLU 和卷积组成。Hi 并非只使用最后一层的输出,而是将以前全部层的输出以及原始层的输出做为输入。即x₀x₁,…, xᵢ₋₁。下面的每一个Hi输出4个feature map。所以,在每一层,feature map的数量增长了4 -增加率。

在由卷积和池化组成的transition之间加上多个Dense Block,就能够造成DenseNet 。

下面是网络架构设计的细节

Cross-Stage-Partial-connections (CSP)

CSPNet将DenseBlock输入的feature map分为两部分。第一部分 x₀’ 绕过DenseBlock和成为下一个transition的输入。第二部分x₀”会通过Dense block以下。

这种新的设计经过将输入分红两部分来下降计算复杂度——只有一部分经过Dense Block.。

CSPDarknet53

YOLOv4利用上面的CSP链接,下面的Darknet-53做为提取特征的骨干。

与基于ResNet的设计相比(尽管ResNet模型具备更好的分类性能),CSPDarknet53模型具备更高的目标检测精度。但Mish等技术能够提升CSPDarknet53的分类精度。所以,YOLOv4的最终选择是CSPDarknet53。

Neck

目标检测器由特征提取的backbone和用于目标检测的head(下面最右边的块)组成。为了在不一样尺度上检测物体,在不一样的空间分辨率下经过head探测feature map来生成层次结构。

为了丰富head的信息,在送入head以前,输入通过自底向上和自顶向下的,相邻特征图被按元素顺序添加到一块儿或链接起来(如上图所示)。所以,head的输入将包含自底向上的空间丰富信息和自上而下的语义丰富信息。这部分被称为 neck。让咱们了解它设计的更多细节。

Feature Pyramid Networks (FPN)

YOLOv3采用与FPN相似的方法在不一样尺度级别上进行目标检测预测。

在对某一特定尺度上进行预测时,FPN将以前的自顶向下的上采样(2倍),并将其与自底向上流的相邻层相加(见下图)。将结果传递到一个3×3的卷积中,以减小上采样的伪影,并为head 建立下面的feature map P4。

SPP (spatial pyramid pooling layer)

SPP在检测不一样尺度的物体时采用的策略有所不一样。它将最后一个池化层(在最后一个卷积层以后)替换为一个空间金字塔池化层。将feature map在空间上划分为m×m个bin,设m分别为一、二、4。而后对每一个通道的每一个容器应用最大值池化。这造成了固定长度的表示,能够用fc层进一步分析。

许多基于cnn的模型包含fc层,所以只接受特定尺寸的输入图像。相反,SPP接受不一样大小的图像。不过,也有一些技术,好比全卷积网络(FCN),它们不包含fc层,而且接受不一样维度的图像。这种类型的设计对于空间信息重要的图像分割特别有用。所以,对于YOLO来讲,将二维特征映射转换为固定大小的一维矢量不必定是可取的。

YOLO with SPP

在YOLO中,SPP被修改以保留输出空间维度。最大值池化应用于大小为1×一、5×五、9×九、13×13的卷积核。空间维度被保留。而后,未来自不一样内核大小的feature map 链接在一块儿做为输出。

下图演示了如何将SPP集成到YOLO中。

Path Aggregation Network (PAN)

在早期DL中,模型设计相对简单。每一层从前一层获取输入。浅层提取局部纹理和模式信息,创建后续层所需的语义信息。然而,当咱们向右移动时,微调预测结果时所需的局部信息可能会丢失。

在后来的DL发展中,层之间的互相链接变得愈来愈复杂。在DenseNet,它走到了极致。每一层都与以前的全部层相连。

在FPN中,自底向上和自顶向下的流将相邻层的信息组合在一块儿。

层之间的信息流成为模型设计中的另外一个关键决策。

下图是用于目标检测中的Path Aggregation Network(PAN)。增长了自底向上的路径(b),使低层信息更容易传播到顶层。在FPN中,局部空间信息在红色箭头处向上传递。虽然图中没有清楚地显示,但红色的路径通过了大约100多个层。PAN引入了 short-cut 路径(绿色通道),只须要大约10层去顶部的N₅层。这种short-circui的概念使得最上层能够得到精确的局部信息。

做为一个注解,neck设计能够可视化以下:

可是,在YOLOv4中,features maps是链接在一块儿的,而不是相邻的层相加的。

在FPN中,目标是在不一样尺度上分别独立地进行检测的。这可能会产生重复的预测,而不能利用来自其余特征图的信息。PAN首先使用element-wise max操做将全部层的信息融合在一块儿(这里咱们将跳过细节)。

https://arxiv.org/pdf/1803.01534.pdf

Spatial Attention Module (SAM)

注意力机制在 DL 设计中被普遍采用。在SAM中,最大值池化和平均池化分别用于输入feature map,建立两组feature map。结果被输入到一个卷积层,接着是一个 Sigmoid 函数来建立空间注意力。

将空间注意掩模应用于输入特征,输出精细的特征图。

在YOLOv4中,使用修改后的SAM而不该用最大值池化和平均池化。

在YOLOv4中,FPN概念逐渐被实现/替换为通过修改的SPP、PAN和PAN。

Bag of Freebies (BoF) for backbone

YOLOv4中backbone的BoF功能包括:

  • CutMix and Mosaic data augmentation,

  • DropBlock regularization, and

  • Class label smoothing

CutMix data augmentation

Cutout data augmentation 去除图像的一个区域(见下图)。这迫使模型在进行分类时不能对特定的特征过于自信。然而,图像的一部分充满了无用的信息,这是一种浪费。在CutMix中,将图像的一部分剪切并粘贴到另外一个图像上。ground truth标签会根据 patch 的面积按比例进行调整,好比0.6像狗,0.4像猫。

从概念上讲,CutMix对于一个对象能够由什么组成有更广的视野。裁剪区域迫使模型学习不一样特征集的对象分类。这能够避免过分自信(overconfidence)。因为将该区域替换为另外一幅图像,图像中的信息量和训练效率也不会受到显著影响。

Mosaic data augmentation

Mosaic是一种将4张训练图像合并成一张进行训练的数据加强方法(而不是 CutMix 中的2张)。这加强了对正常背景(context)以外的对象的检测。此外,每一个小批包含一个大的变化图像(4倍),所以,减小了估计均值和方差的时须要大mini-batch的要求。

DropBlock regularization

在全链接的层中,咱们可使用dropoff来迫使模型从各类特征中学习,而不是对少数特征过于自信。可是,这可能对卷积层不起做用。相邻位置高度相关。所以,即便一些像素被删除(下面中间的图),空间信息仍然能够被检测到。DropBlock正则化创建在一个相似的概念上,工做在卷积层。

不是删除单个像素,而是删除大小为 block_size×block_size 像素块 。

Class label smoothing

当你感受绝对正确的时候,你可能就大错特错了。对预测有100%的信心可能代表模型是在记忆数据,而不是在学习。标签平滑调整预测的目标上限为一个较低的值,好比0.9。它将使用这个值而不是1.0来计算损失。这个概念缓解了过分拟合。

p = tf.placeholder(tf.float32, shape=[None, 10])# Use 0.9 instead of 1.0.feed_dict = {  p: [[0, 0, 0, 0.9, 0, 0, 0, 0, 0, 0]] # Image with label "3"}# logits_real_image is the logits calculated by # the discriminator for real images.d_real_loss = tf.nn.sigmoid_cross_entropy_with_logits(                    labels=p, logits=logits_real_image)

Bag of Specials (BoS) for backbone

  • Mish activation,

  • Cross-stage partial connections (CSP), and

  • Multi-input weighted residual connections (MiWRC)

Mish activation

咱们假设激活函数是

对于一元或二元运算符有不一样的候选函数(如余弦函数)。咱们能够根据不一样的任务(如分类)和数据集对这些函数进行随机猜想,并评估相应的模型性能。最后,咱们能够选择一个性能最好的激活函数。

应用强化学习,能够更有效地搜索求解空间。

经过实验使用这种方法,下面新的激活函数Swish比ReLU和许多其余激活函数表现出更好的性能。

(Swish activation function with different values of β)

Mish是另外一个与ReLU和Swish很是类似的激活函数。正如论文所宣称的那样,Mish能够在不一样数据集的许多深度网络中赛过它们。

Mish:https://arxiv.org/pdf/1908.08681.pdf

对CSPDarknet53和检测器使用Mish,能够提升YOLOv4中的精确性。

Multi-input weighted residual connections (MiWRC)

在过去的几年里,研究人员对将哪些feature map 添加到一个层上给予了很大的关注。有时,咱们打破了只使用前一层的传统。

层之间如何链接如今变得更加剧要,特别是对于目标检测器来讲。咱们已经讨论了 FPN 和 PAN 做为例子。下面的图(d)显示了另外一种被称为 BiFPN 的neck设计,根据 BiFPN 的论文,该设计具备更好的准确性和效率权衡。

BiFPN :https://arxiv.org/pdf/1911.09070.pdf

在YOLOv4中,它将其性能与YOLOv4认为的 state-of-the-art 之一的 EfficientDet 进行了比较。咱们来花点时间研究一下。以下图所示,EfficientDet使用EfficientNet做为主干特征提取器,BiFPN做为颈部。

做为参考,下面的图表是 EfficientNet 的架构,它创建在由反向残差块( inverted residual block)组成的MBConv层上。

以下面论文中所述,反向残块由

https://arxiv.org/pdf/1801.04381.pdf

The first layer is called a depthwise convolution, it performs lightweight filtering by applying a single convolutional filter per input channel. The second layer is a 1 × 1 convolution, called a pointwise convolution, which is responsible for building new features through computing linear combinations of the input channels.

第一层称为深度卷积( depthwise convolution),它经过对每一个输入通道应用一个卷积滤波器来进行轻量级滤波。第二层是1×1卷积,称为pointwise convolution,它负责经过计算输入通道的线性组合来构建新的特征。

假设输入的尺寸 hᵢ × wᵢ × dᵢ.。它适用于 dᵢ 个 k × k 卷积过滤器的 ——在每一个通道上一个。而后1×1卷积过滤器用于全部通道产生一个输出 hᵢ × wᵢ × dⱼ.ⱼ。因此总计算复杂度为:

与传统的卷积层相比,其关键优势是计算量小得多。

在不少ML和DL问题中,咱们学习输入的低维表示。咱们经过建立一个“信息” bottleneck来提取数据的核心信息。这迫使咱们发现最重要的信息,这是学习的核心原则。根据这一原则,反向残差块以低维表示做为输入,经过卷积(线性操做)和非线性操做对其进行操做。可是对于像ReLU这样的非线性部件有一个主要的问题。非线性操做会不按比例地拉伸或压缩区域。在这种压缩中,输入能够映射到相同的区域/点。例如,ReLU可能会使这个低维空间中的信道崩溃,从而不可避免地丢失信息。从论文上引用:

It is important to remove non-linearities in the narrow layersin order to maintain representational power.

为了保持表明性,在狭窄的层中消除非线性是很重要的。

为了解决这个问题,咱们能够暂时扩展这个维度(通道的数量)。但愿咱们如今有大量的通道,通过非线性操做后,仍然能够在一些通道中保留信息。下面是反向残块的细节:

如图所示,低维表示首先扩展到 tk 通道。而后采用3×3的轻量级depthwise convolution。随后,在模块的末尾,特征被还原为低维的。当它仍然存在于高维空间时,非线性运算被加入。

从模块的开始到结束添加一个残差链接。图中左侧为传统残差块,右侧为所述反向残差块。

理解 EfficientDet 的关键概念是很好的。但EfficientDet对YOLOv4的主要贡献是多输入权重残差链接。在 EfficientDet 论文中,观察到不一样的输入特征在不一样的分辨率下对输出特征的贡献是不相等的。但在前面的讨论中,咱们统一添加了这些特性。在EfficientDet中,输入特征的权重不一样,组成输出为:

其中 wᵢ 将训练和学习像其余可训练的参数。

Bag of Freebies (BoF) for detector

YOLOv4检测器的BoF特性包括:

  • CIoU-loss,

  • CmBN,

  • DropBlock regularization,

  • Mosaic data augmentation,

  • Self-Adversarial Training,

  • Eliminate grid sensitivity,

  • Using multiple anchors for a single ground truth,

  • Cosine annealing scheduler,

  • Optimal hyperparameters, and

  • Random training shapes

CIoU-loss

损失函数给出了如何调整权重以下降loss的信号。因此在咱们作出错误预测的状况下,咱们指望它能给咱们指明前进的方向。但若是使用IoU和ground truth box而且预测没有重叠,就不会发生这种状况。考虑两个预测都不与ground truth 重叠,IoU损失函数不能告诉哪个是更好的,甚至一个可能比另外一个更接近ground truth。

Generalized IoU (GIoU) 经过将损失细化为:

可是这个损失函数倾向于首先扩展预测的边界框,直到它与 ground truth重叠。而后它收缩增长IoU。这个过程须要比理论上更多的迭代。

首先,引入 Distance-IoU Loss (DIoU) 以下:

它引入了一个新的目标来减小两个框之间的中心点分离。

最后,引入Complete IoU Loss (CIoU) :

  • 增长ground truth框与预测框的重叠区域,

  • 使它们的中心点距离最小

  • 保持框的高宽比的一致性。

这是最后的定义:

CmBN

原始的 Batch normalization 收集一个 mini-batch 内样本的均值和方差,以白化(whiten)做为层输入。然而,若是小批量尺寸是小的,这些估计将是有噪声的。一个解决方案是在许多小批量中估算它们。然而,随着权重在每次迭代中变化,在这些权重下收集的统计信息在新的权重下可能会变得不许确。一个简单的平均数将是错误的。幸运的是,权重是逐渐变化的。在交叉迭代批处理归一化(Cross-Iteration Batch Normalization,CBM)中,它经过下面的调整从前k次迭代中估计这些统计信息。

CmBN是一个修改后的选项,它只收集单个batch内mini-batch之间的统计信息。

Self-Adversarial Training (SAT)

SAT是一种数据加强技术。首先,它对一个训练样本执行前向传递。在传统的反向传播中,咱们经过调整模型权重来改进检测器对图像中目标的检测。这里是相反的方向。它改变了图像,使它能够下降检测器的性能。也就是说,它建立了一个针对当前模型的对抗性攻击,即便新图像在视觉上看起来是同样的。接下来,用带有原始边界框和类标签的新图像对模型进行训练。这有助于推广模型和减小过拟合。

Eliminate grid sensitivity

边界框b计算为:

对于 bₓ = cₓ 和 bₓ = cₓ+1, 咱们须要 tₓ 产生大量的正值和负值,分别。可是咱们能够用一个比例因子(>1.0)来使这个过程更简单。这里是源代码的变化:

Multiple anchors for a single ground truth

若是IoU(ground truth, anchor) > IoU阈值,为一个ground truth使用多个anchor。(注意,在肯定它在YOLOv4中的角色方面,我尚未足够的信息。)

Cosine annealing scheduler

cosine schedule根据余弦函数调整学习率。它开始缓慢地下降大的学习率。而后它在中途迅速下降了学习率,最终在下降学习率方面出现了一个小斜坡。

该图显示了学习速率是如何衰减的(下面的图中也应用了学习率warmup)以及它对 mAP 的影响。这可能不是很明显,新的方案有更加平稳的前进,而不是停滞了很长一段时间才再次取得进展。

Hyperparameter selection using genetic algorithms (Evolutionary Algorithms)

Evolutionary Algorithms 是一种有根据的猜想方法。它遵循的是适者生存的概念。例如,咱们随机选择100组超参数。而后,咱们用它们来训练100个模型。以后,咱们选择了前10个执行模型。对于每一个选择的模型,咱们根据其原始建立10个微小差别的超参数。咱们用新的超参数从新训练模型,并再次选择最佳模型。当咱们保持迭代时,咱们应该找到最佳的超参数集。或者,咱们能够从默认的超参数开始,而后开始突变。从论文上引用,

https://arxiv.org/pdf/2004.10934.pdf

Genetic algorithm used YOLOv3-SPP to train with GIoU loss and search 300 epochs for min-val 5k sets. We adopt searched learning rate 0.00261, momentum 0.949, IoU threshold for assigning ground truth 0.213, and loss normalizer 0.07 for genetic algorithm experiments.

遗传算法采用YOLOv3-SPP算法进行GIoU缺失训练,最小5k集搜索300个epoch。遗传算法实验采用搜索学习率0.00261,动量0.949,IoU阈值分配ground truth 0.213, loss normalizer 0.07。

Random Training Shapes

许多单阶段目标检测器是在固定的输入图像形状下训练的。为了提升泛化效果,咱们能够对不一样图像大小的模型进行训练。(在YOLO中进行多尺度训练)

Bag of Specials (BoS) for detector

针对YOLOv4检测器的BoS特性包括:

  • Mish activation,

  • modified SPP-block,

  • modified SAM-block,

  • modified PAN path-aggregation block &

  • DIoU-NMS

DIoU-NMS

NMS过滤掉预测相同对象的其余边界框,并保留具备最高可信度的边界框。

DIoU(前面讨论过的) 被用做非最大值抑制(NMS)的一个因素。该方法在抑制冗余框的同时,采用IoU和两个边界盒中心点之间的距离。这使得它在有遮挡的状况下更加健壮。

Technology evaluated

虽然本文介绍了在YOLOv4中集成了哪些技术,但YOLOv4在评估其余技术方面花费了大量精力。为告终束本文,下面的图表列出了YOLOv4考虑的技术。

Credits & References

1YOLOv4: Optimal Speed and Accuracy of Object Detection
 2Github for YOLOv4:https://github.com/AlexeyAB/darknet
 3Densely Connected Convolutional Networks
 4CSPNet: A New Backbone that can Enhance Learning Capability of CNN
 5Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
 6Path Aggregation Network for Instance Segmentation
 7Mish: A Self Regularized Non-Monotonic Neural Activation Function
 8Searching for Activation Functions (Swish)
 9DC-SPP-YOLO: Dense Connection and Spatial Pyramid Pooling Based YOLO for Object Detection
10Path Aggregation Network for Instance Segmentation
11CBAM: Convolutional Block Attention Module (SAM)
12Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression
13Cross-Iteration Batch Normalization
14CutMix: Regularization Strategy to Train Strong
15DropBlock: A regularization method for convolutional networks
16Rethinking the Inception Architecture for Computer Vision (Class label smoothing)
17Distance-IoU Loss: Faster and better learning for bounding box regression
18SGDR: Stochastic gradient descent with warm restarts (Cosine annealing scheduler)
19Bag of Freebies for Training Object Detection Neural Networks
20EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks
21EfficientDet: Scalable and Efficient Object Detection
22MobileNetV2: Inverted Residuals and Linear Bottlenecks

推荐阅读
你点的每一个“在看”,我都认真当成了AI