简介:
笔者原本计划接着解读一篇有关NAS的文章的,奈何今天YOLOv4突然闪亮登场,经不住诱惑,那篇有关NAS的文章就只能后面再写了。好了,废话不多说,进入正题。
前言:
YOLO系列的网络都有一个共同的特点,即追求网络精度也追求网络速度,YOLOv4在此基础上又多了一个追求,那就是降低硬件要求。换句话说,作者希望只有一个GPU的“穷人”也能玩转YOLO,而不是像Google那样的“土豪”才能玩。那作者是如何做到的呢?简单来说就是通过大量实验对大量tricks带来的效果进行逐层分析、比对,最终得到一组最佳的trick组合。
文章概括:
现在很多网络要么是精度高、实时性差,要么是精度低、实时性高。而YOLOv4设计的理念是:鱼和熊掌我都要。
主要贡献:
1、 设计了一个高精度、高实时性的网络,并且该网络只需要一个GPU就可以快速训练;
2、 验证了Bag-of-Freebies和Bag-of-Specials对目标检测的影响很大(现在不知道Bag-of-Freebies和Bag-of-Specials是什么意思也没关系,后面会做解释);
3、 优化了一些tricks,使其可以在单GPU上进行训练。
YOLOv4性能曲线:
从下图可以看到,YOLOv4将网络精度和网络实时性之间的balance做的非常好。
上文说的都是YOLOv4的优点,但是个人觉得YOLOv4也不是完美的,因为它并不care网络的算力,所以YOLOv4对于要求低算力移动端来说可能并不友好(论文刚出,暂未看代码,也未实测算力,纯属个人感觉)。
Tricks介绍:
所谓tricks,就是我们平时设计、训练、测试网络的技巧。本文引用的trick非常非常多,我在这里做个简单的总结,相信大家一定用得到。
文章将tricks分为两大类:
一、 Bag-of-Freebies:这类tricks是指在网络训练时使用到的trick,只增加训练的时长,但是不影响推理的时长。
Bag-of-Freebies又细分为几类:
- 数据增强
Random erase
CutOut
Hide-and-seek
Grid mask
DropOut
DropConnect
DropBlock
MixUp
CutMix
GAN - 样本均衡
Hard negative example mining
Online hard example mining
Focal loss - 软标签
Label smooth
Label Refinement - Bbox的回归
IOU loss
GIOU loss
DIOU/CIOU loss
二、 Bag-of-Specials:这类tricks是指网络设计或者后处理时使用的tricks,它们可以在增加较少的推理时间的同时,较大的提升网络精度。
Bag-of-Freebies又细分为几类:
- 感受野
SPP
ASPP
RFB - 注意力机制
SE block
SAM - 特征融合
Skip connection
Hyper-column
SFAM
ASFF
BiFPN(NAS搜索出来的FPN结构) - 激活函数
ReLU
LReLU
PReLU
ReLU6
SELU
Swish
Hard-Swish
Mish - NMS(非极大值抑制)
Soft-NMS
DIoU NMS
为了方便大家查找tricks,已经将各个trick的链接都附在文章中了,不同的trick有不同的作用,作用相同的tricks之间也有着不同的区别。本文的重点是讲解YOLOv4,就不一一介绍上述众多tricks的功能和区别了,有兴趣的朋友可以点文中链接去详细了解。
YOLOv4设计:
目标检测网络,无论是one-stage还是two-stages、无论是anchor based还是anchor free、无论是在GPU上运行还是在CPU上运行,网络结构无外乎是由三个部分组成:backbone、neck、heads(做个小广告,如果大家想知道如何用NAS同时搜索这三个部分,可以看我的另一篇博客Hit-Detector,哈哈哈)。
那么YOLOv4是如何设计backbone、neck和heads的呢?
1、 backbone的选择:为了使网络速度更快、优化并行计算,作者在卷积层使用group(1-8)比较小的卷积,并将ResNeXt50、Darknet53分别与Cross-Stage-Partial-connections(CSP)结合,组成了CSPResNeXt50和CSPDarknet53。由于实验证明CSPResNeXt50更适合于分类网络,CSPDarknet53更适合于检测网络,因此YOLOv4的backbone选择CSPDarknet53。
2、 neck的选择:这部分主要是考虑如何扩大感受野以及如何更好的进行特征融合。对于检测网络来说,主要有三个要求:
- 提高网络输入的分辨率,可以提升检测小目标的性能;
- 更多的网络层,可以扩大网络的感受野,以便网络可以hold大分辨率的输入;
- 更多的网络参数,可以让网络更好的检测图像中不同尺寸的目标
经过一系列的实验,最终选择SPP module和PANet中的path-aggregation neck作为YOLOv4的neck。
3、head的选择:沿用YOLOv3的head。
将YOLOv4的主体网络结构设计完以后,作者就开始设计YOLOv4的tricks了,要使用哪些tricks可以使YOLOv4延续YOLO家族的辉煌呢?
作者通过一些先验知识和大量实验,最终选择了如下tricks组合:
- Bag of Freebies (BoF) for backbone:
1)CutMix and Mosaic data augmentation(本文创新的数据增强)
2)DropBlock regularization
3)Class label smoothing - Bag of Specials (BoS) for backbone:
1)Mish activation
2)Cross-stage partial connections (CSP)
3)Multiinput weighted residual connections (MiWRC) - Bag of Freebies (BoF) for detector:
1)CIoU-loss
2)CmBN
3)DropBlock regularization
4)Mosaic data augmentation
5)Self-Adversarial Training(本文创新的训练方式)
6)Eliminate grid sensitivity
7)Using multiple anchors for a single ground truth
8)Cosine annealing scheduler
9)Optimal hyperparameters
10)Random training shapes - Bag of Specials (BoS) for detector:
1)Mish activation
2)SPP-block
3)SAM-block(本文优化,提高训练和推理速度)
4)PAN path-aggregation block(本文优化,提高训练和推理速度)
5)DIoU-NMS
YOLOv4使用的如此众多tricks着实挺让人吃惊的,YOLOv4也用实力证明了“tricks大法好”。接下来简单介绍一下,本文在tricks中的创新点:
本文提出的Mosaic数据增强的方法,是将4张训练图片混合在一起然后输入网络,这样一来四张图片的信息会有融合(感觉就是CutMix的升级版)。
本文提出的SAT也是一种数据增强的方法,分成两阶段完成:
在第一阶段,神经网络会更改原始图像,而不是网络权重。以这种方式,神经网络对其自身执行对抗攻击,从而改变原始图像,以便造成一种图像上没有我们想要关注的目标的假象(说的这么绕,其实就是在增加样本的训练难度)。
在第二阶段,训练神经网络以正常方式检测此修改图像上的物体。
本文分别对SAM、PAN和BN做了优化,分别如Figure4、Figure5和Figure6所示:
通过Figure4、Figure5和Figure6很容易能get到作者是如何进行优化的,在此,我就不费口舌了。
除此之外,YOLOv4还通过遗传算法对超参进行了优化,NAS就是擅长做这种超参搜索、网络搜索的事情哦,快来关注我,一起学NAS啦,哈哈哈!
实验结果:
前面说了那么多,终于到了可以看实验结果的时候了,废话不多说,直接上图:
Table8:
Table9:
Table10:
其他:
除了上述介绍内容,本文还做了大量的实验去验证各个tricks的有效性,并且均给出了实验结果。YOLO家族从诞生那天起,就在不断地给我们带来各种惊喜,希望YOLOv4不是YOLO家族的最后一代网络,期待见到v5,v6……
若文中有不足之处,还请各位大佬们指正!
原创码字不易,若转载,请注明出处!
欢迎各位关注我的公众号,一个专注于NAS的公众号,我会持续跟进学术界NAS领域的最新进展,每周更新一篇新Paper,公众号刚刚起步,希望各位多多支持!