目标检测算法综述,包括two-stage,one-stage,anchor-free等(未完)

2019年初的目标检测算法综述:Object Detection in 20 Years: A Survey

本文只讲基于深度学习的主要算法。

目标检测算法综述,包括two-stage,one-stage,anchor-free等(未完)_第1张图片

前言

如图,深度学习算法之后的目标检测算法主要有两个分支,two-stage和one-stage算法。

two-stage算法主要是RCNN系列,包括RCNN, Fast-RCNNFaster-RCNN,其中RCNN和Fast-RCNN之间过渡了一个SPPNet。之后在Faster-RCNN框架的基础上,又出现了更好的backbone网络Pyramid Networks。之后的Mask-RCNN融合了Faster-RCNN架构、ResNet和FPN(Feature Pyramid Networks)backbone,以及FCN里的segmentation方法,在多完成了segmention的同时也提高了detection的AP。

one-stage算法最早是YOLO(后面又更新了YOLO2,YOLO3),该算法速度极快,AP也极低。之后出现了速度和AP兼具的SSD(在SSD基础上又出现了DSSD,RefineNet,RFB-SSD,FSSD等改进网络)。还有解决了one-stage算法里正负样本极不平衡问题的Retina-Net

two-stage算法和one-stage算法的区别在于,two-stage算法会先使用一个网络生成proposal,如selective search和RPN网络,前者是基于一些人造特征来的,RPN是一个也需要进行训练的网络,RPN出现后,ss方法基本就被摒弃。RPN网络接在图像特征提取网络backbone后(和之后的fast-RCNN网络架构共用特征提取层),会设置RPN loss(bbox regression loss+classification loss)对RPN网络进行训练,RPN生成的proposal再送到后面的网络中进行更精细的bbox regression和classification。One-stage追求速度舍弃了two-stage架构,即不再设置单独网络生成proposal,而是直接在feature map上进行密集抽样,产生大量的先验框,如YOLO的网格方法和SSD沿用Faster-RCNN的Anchor方法。这些先验框没有经过两步处理,且框的尺寸往往是人为规定,精度肯定会比较低,而且Retina-Net论文中提到,one-stage产生的先验框正负样本比例严重失衡(背景样本占多数),会引起训练上的问题(Focal Loss正是为了解决这个问题)。

在Faster-RCNN首次引入Anchor后,后面很多网络不论是two-stage还是one-stage算法大都使用了该方法,如Mask-RCNN,SSD,RetinaNet等,YOLO虽然没用但是升级版YOLO2使用了。不过在2018年CornerNet问世后,Anchor-Free的算法火了起来。后来又相继出现了FCOSFoveaBox等算法。其实Anchor-Free的算法在2015年的DenseNet中就被提出,YOLO第一版也是Anchor-Free的,该类方法的架构比基于Anchor的算法更简单和易于理解,不过Anchor-Free类算法能达到Anchor-Based算法的精度,也是建立在前人的成果上的,主要是FPN和Focal Loss等。

值得一提的是,大神Kaiming He参与或主导了Faster-RCNN,FPN,Mask-RCNN,R-FCN,RetinaNet(Focal Loss)等state-of-the-art的网络,甚至目前在3D object detection领域,state-of-the-art的网络也是Kaiming He的VoteNet(截至2019年5月),是时候打印一张大神的照片挂墙上了。

Two-stage

Faster-RCNN

该架构是two-stage的基础,建议将论文和官方代码都仔细读一遍,论文详解出门左拐:一文读懂Faster RCNN

R-CNN检测时的主要步骤为:

  1. 使用Selective Search算法从待检测图像中提取2000个左右的区域候选框,这些候选框可能包含要检测的目标。
  2. 把所有侯选框缩放成固定大小(原文采用227×227)。
  3. 用DCNN提取每个候选框的特征,得到固定长度的特征向量。
  4. 把特征向量送入SVM进行分类得到类别信息,送入全连接网络进行回归得到对应位置坐标信息。

R-CNN的问题:对于ss选取的每个候选框都单独做一次卷积运算,计算量太大;特征向量提取出来后送给SVM分类器进行分类,之后再送入全连接网络进行回归,没有实现端到端的训练。

SPP-Net(Spatial Pyramid Pooling)的改进

  1. 只对原图进行一次卷积运算,然后将在原图上用selective search选取的候选框按位置映射到获得的特征图上(conv5),获得conv5上的候选框。
  2. 由于直接在特征图上进行ss,得到的候选框尺寸不一样,为了统一尺寸输入到后面的网络中,采用了如下图的网络,即Spatial Pyramid Pooling Layer。不同的候选框都采取3种不同尺寸(16,4,1)的pooling,尺寸16即将候选框划分成16个格子,每个格子内部进行max-pooling,尺寸1就是全局的max-pooling,之后再将3中尺寸的结果直接concat在一起,形成21x256的特征图,输入到之后的全连接网络中。

                                    目标检测算法综述,包括two-stage,one-stage,anchor-free等(未完)_第2张图片

Fast-RCNN沿用了SPP-Net将候选框映射到特征图上的方法,不过使用了spp layer的缩减版ROI Pooling Layer,即只有一个尺寸的spp Layer。将不同尺寸的输入pooling成单一尺寸的特征图,从而输入图片可以是任意尺寸,变形过程通常是缩小,所以称为pooling。假设变形前的尺寸为h、w,要求变形后统一输出尺寸H、W,则将变形前区域分成单位为h/H和w/W的网格(网格个数为H*W个),再对每个网格进行max pooling即可。(这种方法会有非整数出现,此时用的实际上是最近邻插值,会带来精度上的问题. MASK-RCNN使用双线性插值解决了这个问题)。另外,Fast-RCNN去掉了之前使用的SVM分类器,而是用softmax完成分类,同时分支做bbox回归,结合两种loss一同训练。

RPN网络

Faster-RCNN在fast-rcnn的基础上不再使用selective search方法产生候选框,ss方法太耗时间,而是添加了一个RPN(Region Proposal Network)网络用于生成候选框,RPN网络生成proposal的过程使用了Anchor方法,这也是Faster-RCNN最大的贡献。RPN网络接在图像特征提取网络后,共享了特征提取层。

Anchor:

RPN网络的卷积后,对每个像素点,可以上采样映射到原始图像一个区域(CNN网络的感受野,映射方法和ROI Pooling正好相反,见https://zhuanlan.zhihu.com/p/24780433) ,找到这个感受野的中心位置,然后基于这个中心位置按规则选取9种anchor box(论文中三种面积,3个aspect ratio( {1:1,1:2,2:1} )),即对特征图的每个像素都设置9个候选区域(anchor)。这些anchor box都是对应于原图的尺寸,可以直接使用标记的候选框和分类结果进行训练。其中:

  • 把每个标定的ground-truth box与其重叠最大的anchor box记为前景样本。(保证每个ground-truth box至少对应一个正样本anchor)
  • 剩余的anchor box与某个ground-truth box重叠大余0.7的记为前景样本。(每个ground-truth box可能会对应多个正样本anchor。但每个正样本anchor 只可能对应一个grand-truth box)
  • 与任意一个标记ground-truth box重叠小于0.3的anchor box记为背景样本。
  • 其余的舍弃。

在训练过程中,bbox经历了4个阶段:

  1. 特征图Anchor,对于一个1000x600的图像,anchor的数量在20000个。
  2. 训练时,去掉超过图像边界的anchor,还剩下6000个。
  3. 由于有些anchor直接重叠部分过多,使用NMS算法去除重叠部分,剩下2000个proposal regions。论文里NMS算法的IoU设置为0.7。
  4. 最后从NMS之后的候选框中选top-K来进行后续的detection。

训练方法:四步训练法

1) 单独训练RPN网络,网络参数由预训练模型载入;

2) 单独训练Fast-RCNN网络,将第一步RPN的输出候选区域作为检测网络的输入。具体而言,RPN输出一个候选框,通过候选框截取原图像,并将截取后的图像通过几次conv-pool,然后再通过roi-pooling和fc再输出两条支路,一条是目标分类softmax,另一条是bbox回归。截止到现在,两个网络并没有共享参数,只是分开训练了;

3) 再次训练RPN,此时固定网络公共部分的参数,只更新RPN独有部分的参数;

4) 那RPN的结果再次微调Fast-RCNN网络,固定网络公共部分的参数,只更新Fast-RCNN独有部分的参数。

FPN:Feature Pyramid Networks for Object Detection(注意和前面的RPN不是同一个东西,RPN里的P是proposal,FPN里的P是Pyramid)

 特征金字塔较于基础backbone网络(如VGG,ResNet,DenseNet等),有种attention相较于RNN的感觉(当然Transformer里的self-attention除外),FPN是ResNet的一个组件,而不是重新创建了一个新的backbone。在信息的传导上,FPN就更有种attention的感觉了,虽然当前特征层的信息经过卷积会传到下一层,但是还是会选择性地丢掉很多信息,所以不如结合多个特征层的信息一起作用于后面的分类和回归,虽然计算量变大,但是精度会提高(attention正是给上个RNN层每一个RNN单元都添加了权重,相当于利用了每个单元的信息,而不再只是最后一个单元的信息)。

实际上,在图像的卷积网络里,低层分辨率高,语义特征没有捕捉很充分,不适合做分类但是很适合做分割任务,实际上不同分辨率的特征也适合不同尺寸的目标检测,分辨率高的更有利于小物体的检测。而FPN最大的好处就是提供了多尺度的特征表达,这个好处可以给很多任务带来质变。

为了应对multi-scale的问题,其实最简单的方法就是设置多种尺度的图像,每种尺度单独训练一个网络用于检测,如下图a所示。但这种方法效率不达标,会使inference的时间大大增加,在端到端地训练网络时内存需求也是极大的,这导致了FPN没有在Faster-RCNN里使用。图b是我们熟知的检测,应对多尺度检测性能有限。图c在之前的基础上在多个特征图上进行了预测(SSD中使用了这种方法)。论文里使用的是图d的网络构造,使用了top-down+横向链接的方法,让每一层都含有丰富的语义信息同时没有添加太多的计算量和占用内存,每一层进行自己的目标检测。

目标检测算法综述,包括two-stage,one-stage,anchor-free等(未完)_第3张图片

 

Mask-RCNN

One-Stage

YOLO

SSD

RetinaNet

Anchor-Free

DenseBox

CornerNet

你可能感兴趣的:(目标检测,视觉,深度学习,算法)