2019年初的目标检测算法综述:Object Detection in 20 Years: A Survey
本文只讲基于深度学习的主要算法。
前言
如图,深度学习算法之后的目标检测算法主要有两个分支,two-stage和one-stage算法。
two-stage算法主要是RCNN系列,包括RCNN, Fast-RCNN,Faster-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的算法火了起来。后来又相继出现了FCOS,FoveaBox等算法。其实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
R-CNN检测时的主要步骤为:
R-CNN的问题:对于ss选取的每个候选框都单独做一次卷积运算,计算量太大;特征向量提取出来后送给SVM分类器进行分类,之后再送入全连接网络进行回归,没有实现端到端的训练。
SPP-Net(Spatial Pyramid Pooling)的改进:
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一同训练。
Faster-RCNN在fast-rcnn的基础上不再使用selective search方法产生候选框,ss方法太耗时间,而是添加了一个RPN(Region Proposal Network)网络用于生成候选框,RPN网络生成proposal的过程使用了Anchor方法,这也是Faster-RCNN最大的贡献。RPN网络接在图像特征提取网络后,共享了特征提取层。
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都是对应于原图的尺寸,可以直接使用标记的候选框和分类结果进行训练。其中:
在训练过程中,bbox经历了4个阶段:
1) 单独训练RPN网络,网络参数由预训练模型载入;
2) 单独训练Fast-RCNN网络,将第一步RPN的输出候选区域作为检测网络的输入。具体而言,RPN输出一个候选框,通过候选框截取原图像,并将截取后的图像通过几次conv-pool,然后再通过roi-pooling和fc再输出两条支路,一条是目标分类softmax,另一条是bbox回归。截止到现在,两个网络并没有共享参数,只是分开训练了;
3) 再次训练RPN,此时固定网络公共部分的参数,只更新RPN独有部分的参数;
4) 那RPN的结果再次微调Fast-RCNN网络,固定网络公共部分的参数,只更新Fast-RCNN独有部分的参数。
特征金字塔较于基础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+横向链接的方法,让每一层都含有丰富的语义信息,同时没有添加太多的计算量和占用内存,每一层进行自己的目标检测。