YOLO目标检测系列(一):
OD-Model【5】:YOLOv1
YOLO目标检测系列(二):
OD-Model【6】:YOLOv2
YOLO目标检测系列(三):
OD-Model【7】:YOLOv3
YOLO目标检测系列(四):
OD-Model【8】:YOLOv4
YOLO目标检测系列(五):
OD-Model【9】:YOLOv5
YOLOv4是一个单阶段的物体检测模型,它在 YOLOv3 的基础上改进了文献中介绍的技巧和模块。
原论文链接:
YOLOv4: Optimal Speed and Accuracy of Object Detection
有大量的技巧可以提高卷积神经网络(CNN)的精度。需要在大数据集下对这种技巧的组合进行实际测试,并对结果进行理论论证要求。某些技巧仅在某些模型上使用和专门针对某些问题,或只针对小规模的数据集;而一些技巧,如批处理归一化、残差连接等,适用于大多数的模型、任务和数据集。我们假设这种通用的技巧包括 Weighted-Residual-Connection(WRC)、Cross-Stage-Partial-connections(CSP)、跨小型批量连接(CSP)、Cross mini-Batch Normalization(CmBN)、Self-adversarial-trainin(SAT)和 Mish-activation。我们在本文中使用这些新的技巧:WRC、CSP、CmBN、SAT、Mish-activation
Mosaic data augmentation、CmBN、DropBlock正则化和 CIoU损失,以及组合技巧,以达到最好的效果。
本文的主要目标是设计一个应用生产环境快速运行的目标检测器,并且进行并行计算优化,而不是低水平的计算放量理论指标(BFLOP)。我们希望所设计的对象易于训练和使用。例如,任何使用传统GPU训练和测试可以实现实时、高质量、有说服力的目标检测结果。YOLOv4与其余模型的比较如下图所示:
本文的贡献总结如下:
现代目标检测器通常由两部分组成。ImageNet 上预训练的 backbone 和用于预测类和 BBOX 的检测器 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 等。
近年来发展起来的检测器,往往会在 backbone 和 head 之间插入一些层,这些层用于收集不同阶段的特征图。我们可以称它为检测器的 neck。通常情况下 neck 是由几个 bottom-up paths 和多个 top-down paths 组成。Feature Pyramid Network (FPN)、 Path Aggregation(PAN)、BiFPN 和 NAS-FPN 具有这个机制。除上述模型外,有的研究者重新构建backbone(DetNet,DetNAS)或重新构建整个模型(SpineNet,HitDetector)用于目标检测
总结来说:
通常情况下,因此,研究人员总是喜欢利用这一优势,开发更好的训练方法,使物体检测器获得更好的精度,而不增加推理成本。本文将这些只改变训练策略或只增加训练成本的方法称为 bag of freebies。目标检测经常采用的、并符合这个定义的就是数据增强。
数据增强的目的是:数据增强的目的是增加输入图像的可变性,使设计的物体检测模型对来自不同环境的图像具有更高的鲁棒性。
对于那些只增加少量推理成本,但能显著提高物体识别精度的插件模块和后处理方法,我们称之为 Bag of specials。一般来说,这些插件模块是为了增强模型中的某些属性,如扩大感受野、引入注意机制或加强特征整合能力等,而后处理是一种筛选模型预测结果的方法。
在YOLOv3中,特征提取网络使用的是Darknet53,而在YOLOv4中,对Darknet53做了一点改进,借鉴了CSPNet
CSPNet解决了其他大型卷积神经网络框架Backbone中网络优化的梯度信息重复问题,将梯度的变化从头到尾地集成到特征图中,因此减少了模型的参数量和FLOPS数值,既保证了推理速度和准确率,又减小了模型尺寸
能够在一定程度上解决多尺度问题
输出由四部分组成:
YOLOv4 中 Neck 这部分使用 FPN + PAN 的结构:
每个CSP模块前面都是大小为 3 × 3 3 \times 3 3×3 ,步长为2的卷积核,相当于下采样操作。
因此可以看到三个紫色箭头处的特征图为: 76 × 76 76 \times 76 76×76、 38 × 38 38 \times 38 38×38、 19 × 19 19 \times 19 19×19。对应的预测结果特征图的尺寸为: 76 × 76 × 255 76 \times 76 \times 255 76×76×255、 38 × 38 × 255 38 \times 38 \times 255 38×38×255、 19 × 19 × 255 19 \times 19 \times 255 19×19×255。
FPN + PAN 结构的立体图如下图所示
在FPN层的后面还添加了一个自底向上的特征金字塔,其中包含两个PAN结构
这样结合操作,FPN 层自顶向下传达强语义特征,而特征金字塔则自底向上传达强定位特征,两两联手,从不同的主干层对不同的检测层进行参数聚合
需要注意的是:
在原来 YOLOv3 中,关于计算预测的目标中心坐标计算公式是:
b x = σ ( t x ) + c x b y = σ ( t y ) + c y b_x = \sigma(t_x) + c_x \\ b_y = \sigma(t_y) + c_y bx=σ(tx)+cxby=σ(ty)+cy
其中:
但在 YOLOv4的论文中作者认为这样做不太合理,比如当真实目标中心点非常靠近网格的左上角点 ( σ ( t x ) \sigma(t_x) σ(tx) 和 σ ( t y ) \sigma(t_y) σ(ty) 应该趋近于0)或者右下角点( σ ( t x ) \sigma(t_x) σ(tx) 和 σ ( t y ) \sigma(t_y) σ(ty) 应该趋近于1)时。网络的预测值需要负无穷或者正无穷时才能取到,而这种很极端的值网络一般无法达到。
为了解决这个问题,作者引入了一个大于1的缩放系数( s c a l e x y scale_{xy} scalexy):
b x = ( σ ( t x ) ⋅ s c a l e x y − s c a l e x y − 1 2 ) + c x b x = ( σ ( t y ) ⋅ s c a l e x y − s c a l e x y − 1 2 ) + c y b_x = (\sigma(t_x) \cdot scale_{xy} - \frac{scale_{xy} - 1}{2}) + c_x \\ b_x = (\sigma(t_y) \cdot scale_{xy} - \frac{scale_{xy} - 1}{2}) + c_y bx=(σ(tx)⋅scalexy−2scalexy−1)+cxbx=(σ(ty)⋅scalexy−2scalexy−1)+cy
通过引入这个系数,网络的预测值能够很容易达到0或者1。目前主流的实现方法,通常将 s c a l e x y scale_{xy} scalexy 设置为2。绘制对应的 y = σ ( x ) y = \sigma(x) y=σ(x) 的图像和 y = 2 ⋅ σ ( x ) − 0.5 y = 2 \cdot \sigma(x) - 0.5 y=2⋅σ(x)−0.5 的图像如下所示:
很明显通过引入缩放系数 scale 以后, x x x 在同样的区间内, y y y 的取值范围更大,或者说 y y y 对 x x x 更敏感了。并且偏移的范围由原来的 ( 0 , 1 ) (0, 1) (0,1) 调整到了 ( − 0.5 , 1.5 ) (-0.5, 1.5) (−0.5,1.5)。
预测目标高宽的计算公式为:
b w = p w ⋅ e t w b h = p h ⋅ e t h b_w = p_w \cdot e^{t_w} \\ b_h = p_h \cdot e^{t_h} bw=pw⋅etwbh=ph⋅eth
Mosaic data augmentation 的主要思想是将四张图片进行随机裁剪,再拼接到一张图上作为训练数据。这样做的好处是丰富了图片的背景,并且四张图片拼接在一起变相地提高了batch_size,在进行 batch normalization 的时候也会计算四张图片,所以对本身 batch_size 不是很依赖,单块GPU就可以训练 YOLOv4。
几种常见的数据增强方法:
区别:
优点:
YOLOv4 的 Mosaic data augmentation 参考了 CutMix 数据增强方式, 是 CutMix 数据增强方法的改进版。Mosaic 数据增强利用了四张图片,对四张图片进行拼接,每一张图片都有其对应的框,将四张图片拼接之后就获得一张新的图片,同时也获得这张图片对应的框,然后我们将这样一张新的图片传入到神经网络当中去学习,相当于一下子传入四张图片进行学习了。
实现步骤:
在我的另一篇blogOD-Model【7】:YOLOv3中,介绍过 YOLOv3 SPP 的一种匹配准则,大致流程如下所示:
在 YOLOv4 中,通过缩放因子 s c a l e x y scale_{xy} scalexy,网络预测中心点的偏移范围已经从原来的 ( 0 , 1 ) (0, 1) (0,1) 调整到了 ( − 0.5 , 1.5 ) (-0.5, 1.5) (−0.5,1.5)。所以对于同一个GT Boxes可以分配给更多的Anchor,即正样本的数量更多了。如下图所示:
刚刚说了网络预测中心点的偏移范围已经调整到了 ( − 0.5 , 1.5 ) (-0.5, 1.5) (−0.5,1.5),所以按理说只要 Grid Cell 左上角点距离 GT 中心点在 ( − 0.5 , 1.5 ) (-0.5, 1.5) (−0.5,1.5) 范围内它们对应的Anchor都能回归到 GT 的位置处。
上面的例子中, G T x c e n t e r GT_x^{center} GTxcenter, G T y c e n t e r GT_y^{center} GTycenter 它们距离落入的 Grid Cell 左上角距离都小于 0.5,所以该 Grid Cell 上方的 Cell 以及左侧的 Cell 都满足条件,即 Cell 左上角点距离GT中心在 ( − 0.5 , 1.5 ) (-0.5, 1.5) (−0.5,1.5) 范围内。这样会让正样本的数量得到大量的扩充。但需要注意的是,YOLOv4 源码中扩展 Cell 时只会往上、下、左、右四个方向扩展,不会往左上、右上、左下、右下方向扩展。
下面又给出了一些根据 G T x c e n t e r GT_x^{center} GTxcenter, G T y c e n t e r GT_y^{center} GTycenter 的位置扩展的一些Cell,
需要注意的是,当 GT 的中心点刚好落入 Grid Cell 的中心,即 x x x 和 y y y 坐标对 1 取余都等于 0.5 的时候,只会利用当前 Grid Cell 的 Anchor,因为此时 GT 相对于 其他 Grid Cell 的偏移量都达到了极限
针对 512 × 512 512 \times 512 512×512 尺度采用的 anchor 模板是:
目标类型 | Anchors模版 |
---|---|
小尺度 | 12 × 16 12 \times 16 12×16, 19 × 36 19 \times 36 19×36, 40 × 28 40 \times 28 40×28 |
中尺度 | 36 × 75 36 \times 75 36×75, 76 × 55 76 \times 55 76×55, 72 × 146 72 \times 146 72×146 |
大尺度 | 142 × 110 142 \times 110 142×110, 192 × 243 192 \times 243 192×243, 459 × 401 459 \times 401 459×401 |
在我的另一篇blogOD-Model【7】:YOLOv3中
中的第4节里面,我们对 IoU Loss、GIoU Loss、DIoU Loss 以及 CIoU Loss 做了详细对比
CIoU Loss 将目标框回归函数应该考虑三个重要几何因素:重叠面积、中心点距离,长宽比全都考虑进去了
完整的 CIoU 的计算公式为:
C I o U = I o U − R C I o U = I o U − ( ρ 2 ( b , b g t ) c 2 + α υ ) CIoU = IoU - R_{CIoU} = IoU - (\frac{\rho^2(b, b^{gt})}{c^2} + \alpha \upsilon) CIoU=IoU−RCIoU=IoU−(c2ρ2(b,bgt)+αυ)
损失计算:
L C I o U = 1 − C I o U L_{CIoU} = 1 - CIoU LCIoU=1−CIoU
YOLOv4 将近几年关于深度学习领域最新研究的 tricks 移植到 YOLOv4 中做验证测试,将YOLOv3 的精度提高了不少(但相比于 YOLOv3 SPP 的提升有限)。
YOLOv4 主要带来了 3 点新贡献:
翻译参考
Mosaic data augmentation 参考