YOLO v4结构原理解析

导读

YOLO v1开启了One-Stage目标检测的大门,检测速度直接甩开Two-Stage几条街,虽然精度与Two-Stage尚有差距,但随着YOLO持续不断地更新换代,通过设计性能更加出色的Backbone以及各种Tricks,现在YOLO系列的检测精度已经不输Two-Stage,并且依然保持着超快的检测速度,被业界广泛使用。目前YOLO已经更新到了第五代,但我觉得YOLO v4这篇文章是最适合大家去认真读的,因为它相当于一部目标检测的综述文章,看完之后会对现在目标检测有一个大致的框架。在计算机视觉的演变史上,出现了很多优秀的CNN架构以及各种提升精度的Tricks,甚至Transformer在计算机视觉任务上大放光彩。但是很多网络结构和Tricks都只能在小数据集上使用,或者只能适用于某种特定的任务和场景。
在这里插入图片描述
所以作者在YOLO v4中组合了多种通用技术方法进行网络的搭建与训练调优,并进行了大量的实验来验证这些模块的有效性。作者用到的调优手段包括:跨阶段部分连接(CSP)、加权残差连接(WRC)、跨小批量标准化(CmBN)、自对抗训练(SAT)、Mish激活函数、Mosaic数据增强、DropBlock正则化、CIoU Loss等。在这些手段的加持下,YOLO v4最终能使用Tesla V100在MS CoCo数据集上跑出43.5%的AP和65FPS的速度。
In general,YOLO v4的贡献主要有以下几点:

  1. 开发了一个高效、强大的目标检测模型。它使每个人都可以使用1080 Ti或2080 Ti GPU来训练一个超级快速和准确的目标探测器;
  2. 验证了在检测器训练过程中,最先进的Bag-of-Freebies和Bag-of-Specials 的目标检测方法的影响;
  3. 修改了最先进的方法,使其更有效,更适合于单GPU训练,包括CBN、PAN、SAM等。

YOLO v4结构原理解析

下边从YOLO v4的相关工作框架上对其进行详细分析。
首先作者对现有的目标检测算法进行了总结:

在这里插入图片描述
如图所示,现在大部分目标检测器都遵循这个流程,无论是Two-Stage还是One-Stage,只是改进的侧重点不同。One-Stage更侧重于改进Backbone以及Neck部分,而Two-Stage更多关注Head部分。

  1. Input:输入图像,patches,image pyramid
  2. Backbone:VGG16,ResNet-50,EfficientNet-B0/B7,CSPResNeXt50,CSPDarknet53,SpineNet…
  3. Neck:SPP,FPN,PAN,BiFPN…
  4. Heads:RPN,SSD,YOLO,RetinaNet,CornerNet,CenterNet,Faster R-CNN,Mask R-CNN…

接着,作者在论文中介绍了大量目前在目标检测领域发挥作用的调优手段,分析它们对模型产生的影响,并对其中一些方法做出改进。作者将这些方法分为两部分:Bag of Freebies 和Bag of Specials。

  • Bag of Freebies
    这里边包含了在离线训练阶段为提升精度而采用的调优方法,它们不在推理阶段使用,因此不会增加推理时间。

    • 数据以及样本
      数据增强:Random erase,CutOut,Hide-and-Seek,Grid Mask,MixUp,CutMix,GAN,Mosaic…
      样本分布:Focal Loss,难例挖掘
      特征图:DropOut,DropConnect,DropBlock
      Bounding Box损失函数:MSE,IoU Loss,GIoU Loss,DIoU Loss,CIoU Loss,L1 Loss,L2 Loss
  • Bag of Specials
    这里边包含为了提升精度在推断过程中也参与的方法,会产生一些计算成本,但是跟提升的精度做 Trade-Off 可以接受,因此被广泛使用。

    • 增大感受野/多尺度特征
      SPP,ASPP,RFB
    • 注意力机制
      Squeeze-and-Excitation,Spatial Attention-Module
    • 特征融合
      SFAM,ASFF,BiFPN
    • 激活函数
      ReLU,Leaky-ReLU,Mish
    • 后处理
      Soft-NMS,DIoU NMS

前边说了那么多可以提升目标检测算法的调优手段,无论是Bag of Freebies也好,还是Bag of Special也好,那么作者是怎么搭建YOLO v4的呢?又用了那些手段?做了哪些改进?

  • Backbone
    一个好的分类模型不一定适用于目标检测,因为目标检测想要提升精度需要实现以下几点:
    • 更大的网络输入分辨率,大的输入分辨率有利于检测小目标物体
    • 更深的网络结构,网络层数越深,越能够覆盖更大的感受野
    • 更多的参数,在大数据集上,参数越多,网络表征能力越强,可以检测更多不同的物体

针对以上几点,作者在设计YOLO v4的Backbone的时候,作者对CSPResNext50和CSPDarknet53以及EfficientNet-B3在不同维度上做了对比,最终通过 Trade-off 选择CSPDarknet53作为Backbone。
在这里插入图片描述

  • Neck
    从表格中我们可以看到CSPDarknet53的感受野介于CSPResNext50和EfficientNet-B3之间,参数最多,但是运算速度却最快。为了弥补CSPDarknet53感受野不足的情况,作者在Neck部分添加了SPP-block,并且使用PANet学习多尺度融合特征,提升小目标的检测能力。
    其实SPP当初提出来的时候是为了解决模型固定输入的问题,放置在卷积层与全连接层之间,这样不用因为全连接层的限制而固定输入尺寸,而且因为没有了resize/crop/warp这些步骤,无需在对每个proposal单独进行卷积运算(改变了卷积的顺序,直接先对整张图进行卷积运算),只需要根据下采样率在特征图上找到proposal的相对位置即可,极大的节省了计算量。
    PANet结构是在FPN的结构上做了改进。FPN在结构上是由顶向下的,即顶层的特征图通过上采样操作与底层的特征图进行add/contact,做到多尺度融合的特征,解决小物体语义信息随着网络的加深逐渐消失的问题,还有适应不同尺度的目标。PANet更进一步,在由顶向下的结构基础上添加了由底向上的结构,从而进行更深层次的融合,保证每个特征图中包含所有尺度的语义信息,从而提升检测率,降低漏检率。
  • Bag of Freebies 和 Bag of Specials的选择
    作者使用了CutMix和Mosaic用以数据增强,Drop Block做正则化,以及类标签平滑提升模型的鲁棒性以及容错性。此外还有CIou Loss,余弦退火调度器,Mish激活函数等。这些技巧我们后边单独具体地讲解,因为很多小技巧设计都非常巧妙很有意思。

总结

以上就是YOLO V4的整个结构框架了,可以看到作者做了大量的工作来分析当前目标检测的需求以及痛点,而且详细对比了各种Tricks对目标检测算法性能的影响,最终确定了YOLO V4的结构,以CSPDarkNet53作为Backbone,SPP以及PANet作为Neck,以及YOLO V3的head。同时在各种调优手段的加持下,YOLO V4成功做到了比超越其精度的模型速度快,比超越其速度的模型精度高,完美的Trade-Off。后续会陆续写文章具体分析文章中提到的调优手段以及网络结构,与大家交流分享。

猜你喜欢

转载自blog.csdn.net/Just_do_myself/article/details/118443279