一个简单且高效的目标检测算法,该算法降低了训练门槛

描述

摘要:

随着深度学习的发展,目前已经出现了很多算法(或者训练技巧,tricks)来提升神经网络的准确率。在实际测试中评价一个算法的好坏优劣主要看两点,一是能否在大规模的数据集中起作用(work),二是是否有理论依据。一些算法仅能在某些特定的模型上或者某类特定的问题上运行,亦或是适用于一些小规模的数据集。然而,还有一些算法,例如batch normalization(BN)或者残差连接(residual-connections)已经被用在了不同的模型,任务以及不同的数据集中,已经被充分的证明了这些算法的普适性,是一个general的算法。我们假设这样的general(or universal)的算法包括Weighted-residual-connection(WRC),cross-stage-partial-connections(SCP),cross mini-batch Normalization(CmBN),self-adversarial-training(SAT)以及mish-activation。此外,我们还加了一些其余的tricks,包括Mosaic data augmentation,DropBlock regularization,CIoU loss,设计了一个YOLO-V4,并且在MS coco数据集中取得了新的state-of-the-art的结果:在Tesla V100显卡能达到43.5% AP(65.7% AP)的精度,且达到~65FPS的速度。目前代码已经开源:

Introduction

Yolo-V4的主要目的在于设计一个能够应用于实际工作环境中的快速目标检测系统,且能够被并行优化,并没有很刻意的去追求理论上的低计算量(BFLOP)。同时,Yolo-V4的作者希望算法能够很轻易的被训练,也就是说拥有一块常规了GTX-2080ti或者Titan-XP GPU就能够训练Yolo-V4, 同时能够得到一个较好的结果(Yolo-V4 结果如上图)。整个introduction可以总结为以下几点:

研究设计了一个简单且高效的目标检测算法,该算法降低了训练门槛,使得普通人员在拥有一块1080TI或者2080TI的情况下就能够训练一个super fast and accurate 的目标检测器

在训练过程中,验证了最新的Bag-of-Freebies和Bag-of-Specials对Yolo-V4的影响

简化以及优化了一些最新提出的算法,包括(CBN,PAN,SAM),从而使Yolo-V4能够在一块GPU上就可以训练起来。

Related work

首先解释一下相关的名词:

Input:算法的输入,包括整个图像,一个patch,或者是image pyramid

Backbone:可以理解为是提取图像特征的部分,由于图像中的浅层特征(low-level)是比较类似的,例如提取边缘,颜色,纹理这些。因此这部分可以很好的借鉴一些设计好并且已经训练好的网络,例如(VGG16,19,ResNet-50, ResNeXt-101, Darknet53), 同时还有一些轻量级的backbone(MobilenetV1,2,3 ShuffleNet1,2)。

Neck:这部分我的理解是特征增强模块,前面的backbone已经提取到了一些相关的浅层特征,由这部分对backbone提取到的浅层特征(low-level feature)进行加工,增强,从而使得模型学到的特征是我想要的特征。这部分典型的有(SPP,ASPP in deeplabV3+,RFB,SAM),还有一些(FPN, PAN, NAS-FPN, BiFPN, ASFF, SFAM)。

Head:检测头。这部分就到了算法最关键的部分,就是来输出你想要的结果,例如想得到一个heatmap,(如在centernet中),那就增加一些反卷积层来一层一层反卷积回去。如果想直接得到bbox,那就可以接conv来输出结果,例如Yolo,ssd这些。亦或是想输出多任务(mask-RCNN)那就输出三个head:classification,regression,segmentation(就是mask那部分)。

因此,一个检测算法可以理解为:

Object Detection = Backbone + Neck + Head

2.1. Bag of freebies

什么叫Bag of freebies?字面上的意思就是免费赠品。在目标检测中是指:用一些比较有用的训练技巧来训练模型,从而使得模型取得更好的准确率但是不增加模型的复杂度,也就不增加推理(inference)是的计算量(cost)。在目标检测中,提到bag of freebies,首先会想到的 就是Data augmentation。

2.1.1 : Data augmentation 的目的在于增加训练样本的多样性,使得检测模型具有高的鲁棒性。常见的不能再常见的数据增强方式包括两个方面:几何增强以及色彩增强。

几何增强包括:随机翻转(水平翻转较多,垂直翻转较少),随机裁剪(crop),拉伸,以及旋转。

色彩增强包括:对比度增强,亮度增强,以及较为关键的HSV空间增强。

上述说的色彩以及几何增强都是pixel-wise 的调整。此外还有一些数据增强方法被用来解决目标遮挡及不足的问题。

在图像中随机裁剪矩形区域,并用0来填充(random erase和CutOut算法)

随机裁剪多个矩形区域(hide-and-seek, grid mask)

上述算法是在图像中裁剪矩形区域并填充0,那么算法在heatmap上裁剪并填充的叫做(DropOut,DropConnect, DropBlock)

此外还有一个重要的data augmentation算法叫做MIX-UP。Mix-up在分类任务中,将两个图像按照不同的比例相加,例如A*0.1+B*0.9=C,那么C的label就是[0.1A, 0.9B]。在目标检测中的做法就是将一些框相加,这些label中就多了一些不同置信度的框。

还有一类是style-transfer GAN做数据增强,例如在做街景分割和目标检测的时候,将GTA-5的数据做一个style-transfer,扩充一些数据集。不过更多的是用在了Domain Adaptation上。

2.1.2 : 不同于上述说的data augmentation,第二类方法是要解决数据不均衡问题(imbalance problems in object detection),数据不均衡问题在目标检测中是一个特别难的问题,Yolo-V4中没有细说,但是最近的一篇PAMI综述论文,用了30几页详细介绍了这个问题,论文可以见我专栏的第一篇文章。 下面我简单说一下:数据不均衡包括了两种一种是训练的背景和我要识别的物体之间的不均衡,例如在two-stage的方法中,首先在RPN阶段会生成了很多个ROI,这里面有太多的背景了,有用的框会很少。还有一类不均衡是类别之间的不均衡,例如在COCO数据集中一些常见的物体例如人就会很多,不常见的就会比较少,这样类别之间还有不平衡,这就涉及到另外一个问题了,叫做长尾分布(long-tailed Data),也是比较棘手的问题。这里面比较经典的算法就是在two-stage 中使用hard negative example mining or online head example mining (OHEM)。还有一个比较经典的算法就是Focal-loss,来处理数据不均衡的问题。还有一个trick就是关于One-hot编码之后label没有关联,针对这个问题进行label-smooth。

2.1.3: 第三个bag of freebies就是在loss function上进行改动,之前常用的计算bbox的loss 使用MSE,现在改为了计算IOU之间的loss,还有一个叫做GIoU loss。这里面有一个比较经典的算法就是在Mask-RCNN上改动的MASK SCoring RCNN中,这部分的逻辑是这样的:在选择ROI时,如果按照每个ROI的score来排序筛选ROI,会出现一个问题就是,置信度高的ROI并不一定BBOX的位置就准,后来作者尝试了使用IoU来筛选ROI,发现效果要好。

2.2. Bag of specials

什么叫做bag of specials:就是指一些plugin modules(例如特征增强模型,或者一些后处理),这部分增加的计算量(cost)很少,但是能有效地增加物体检测的准确率,我们将这部分称之为Bag of specials。这部分插件模块能够增强网络模型的一些属性,例如增大感受域(ASFF,ASPP,RFB这些模块),引入注意力机制(有两种一种是spatial attention,另外一种是channel attention),增加特征集成能力(FPN,ASFF,BiFPN)。后处理算法是指用一些算法来筛选模型预测出来的结果

2.2.1 增大感受域

SPP:He提出了一个比较经典的算法,当时解决了一个问题就是我在测试的时候,输入尺寸可以与训练的时候 不一样。但是当网络中有FC的时候,尺寸必须是固定的,这时候,SPP作用就体现出来了,按照比例划分pooling,最后输出的结果就是一致的了。

ASPP:我记得是用在了DeepLabV3系列中,与SPP不同前面加了Atrous or dilated ,在Pooling中加入了dilated ratio。

RFB:就是说是在同一个featuremap下引入不同dilated ration的空洞卷积,这样提取到了不同感受野的特征,最后进行融合。

2.2.2 引入注意力机制

Channel Attention:最经典的就是SEnet(Squeeze-and-Excitation),这个算法一开始获得了imagenet分类任务中的冠军,他的原理是这样的,在featuremap层中同时引入一个1X1XC的weights,这样对每个channel上的特征加入不同的权重,这样提高特征学习能力,注意:SE module是在channel 这个维度上进行加入权重。后来又有一篇CVPR用SE module做了分割任务,从侧面证明了SE module很好用。

Spatial Attention Module:从字面意思上来理解,就是在HW维度上加入attention,上述是在Channel维度上加入Attention。

Channel+Spatial:一个featuremap的维度:NCHW,N:batch size,C:channel,H:height,W:weight。Channel attention 和spatial attention 是从两个不同的方法对feature进行增强,接着又有一篇paper对二者进行融合,channel attention+spatial attention

2.2.3 特征融合or特征集成

Skip connection:用在encoder-decoder中比较多,例如最经典的Unet,融入了low-level和high-level的信息,在目标检测中主要用在了类似于pose这一类的检测任务中,例如DLA,Hourglass,以及最近的CenterNet

hyper-column:最经典的就要属于InceptionV1-4结构了,使用不同的kernel-size的convolution来集成特征。

FPN,ASFF,BiFPN:在我看来都属于一类,属于将不同stage下不同scale的特征进行融合,只是连接融合的方式不一样,FPN是最经典的,efficientdet中的BiFPN连接的最密集。

2.2.4 激活函数

一个好的激活函数能够使得梯度传播的更高效,并且不会占用额外的计算资源。常见的激活函数有以下:(由于我对激活函数没有研究过,所以这边就不画蛇添足了,直接把论文中的摘录下来)

ReLU

LRelu, PReLU, SELU,ReLu6, Swish, hard-Swish Mish

2.2.5 后处理

经典的后处理包含了NMS,soft NMS,DIoU NMS

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分