您的位置:首页 > 移动开发 > Objective-C

特征金字塔特征用于目标检测:Feature Pyramid Networks for Object Detection

2017-07-05 19:20 549 查看
前言:

这篇论文主要使用特征金字塔网络来融合多层特征,改进了CNN特征提取。作者也在流行的Fast&Faster
R-CNN上进行了实验,在COCO数据集上测试的结果现在排名第一,其中隐含的说明了其在小目标检测上取得了很大的进步。其实整体思想比较简单,但是实验部分非常详细和充分。

摘要:

特征金字塔是多尺度目标检测系统中的一个基本组成部分。近年来深度学习目标检测特意回避金字塔特征表示,因为特征金字塔在计算量和内存上很昂贵。所以作者利用了深度卷积神经网络固有的多尺度、多层级的金字塔结构去构建特征金字塔网络。使用一种自上而下的侧边连接,在所有尺度构建了高级语义特征图,这种结构就叫特征金字塔网络(FPN)。其在特征提取上改进明显,把FPN用在Faster
R-CNN上,在COCO数据集上,结果超过了目前所有的单模型(single-model)检测方法,而且在GPU上可以跑到5 FPS。

概述:

多尺度目标检测是计算机视觉领域的一个基础且具挑战性的课题。在图像金字塔基础上构建的特征金字塔(featurized image pyramids ,Figure1(a))是传统解决思路,具有一定意义的尺度不变性。直观上看,这种特性使得模型可以检测大范围尺度的图像。

Featurized image pyramids 主要在人工特征中使用,比如DPM就要用到它产生密集尺度的样本以提升检测水平。目前人工特征式微,深度学习的CNN特征成为主流,CNN特征的鲁棒性很好,刻画能力强。即使如此,仍需要金字塔结构去进一步提升准确性,尤其在多尺度检测上。金字塔结构的优势是其产生的特征每一层都是语义信息加强的,包括高分辨率的低层。

对图像金字塔每一层都处理有很大的局限性,首先运算耗时会增加4倍,训练深度网络的时候太吃显存,几乎没法用,即使用了,也只能在检测的时候。因为这些原因,Fast/Faster R-CNN 都没使用featurized image pyramids 。

图像金字塔并不是多尺度特征表征的唯一方式,CNN计算的时候本身就存在多级特征图(feature map hierarchy),且不同层的特征图尺度就不同,形似金字塔结构(Figure1(b))。结构上虽不错,但是前后层之间由于不同深度(depths)影响,语义信息差距太大,主要是高分辨率的低层特征很难有代表性的检测能力。

SSD方法在借鉴利用featurized image pyramid上很是值得说,为了避免利用太低层的特征,SSD从偏后的conv4_3开始,又往后加了几层,分别抽取每层特征,进行综合利用(Figure1(c))。但是SSD对于高分辨率的底层特征没有再利用,而这些层对于检测小目标很重要。 



这篇论文的特征金字塔网络(Figure1(d))做法很简单,如下图所示。把低分辨率、高语义信息的高层特征和高分辨率、低语义信息的低层特征进行自上而下的侧边连接,使得所有尺度下的特征都有丰富的语义信息。这种结构是在CNN网络中完成的,和前文提到的基于图片的金字塔结构不同,而且完全可以替代它。

本文特征金字塔网络自上而下的结构,和某些论文有一定的相似之处,但二者目的不尽不同。作者做了检测和分割实验,COCO数据集的结果超过了现有水平,具体结果参见实验部分。值得说的是,本方法在训练的时间和显存使用上都是可接受的,检测的时间也没增加。



图1. (a)使用图像金字塔建立特征金字塔,每个独立的图像尺度上计算特征,这计算特别缓慢;(b)最近的检测系统已选择只使用单尺度特征,以便更快的检测;(C)另一种是利用金字塔特征层次计算的ConvNet当作一个特征化的图像金字塔;(d)提出的特征金字塔网络(FPN)如(b)和(c),但更准确。在这个图中,特征图由蓝色轮廓和较粗的轮廓表示更高层次的特征。

特征金字塔网络:

论文的目标是利用CNN的金字塔层次结构特性(具有从低到高级的语义),构建具有高级语义的特征金字塔。得到的特征金字塔网络(FPN)是通用的,但在文中,作者先在RPN网络和Fast R-CNN中使用这一成果,也将其用在instance
segmentation proposals 中。

该方法将任意一张图片作为输入,以全卷积的方式在多个层级输出成比例大小的特征图,这是独立于CNN骨干架构(本文为ResNets)的。具体结构如图Figure 2。 



图2 Top:一个自上而下的架构与skip连接,其预测是在最好的层;Bottom:模型有一个类似的结构,但利用它作为一个特征金字塔,在各级独立作出预测。

自下而上的路径:

CNN的前馈计算就是自下而上的路径,特征图经过卷积核计算,通常是越变越小的,也有一些特征层的输出和原来大小一样,称为相同网络阶段(same network stage )。对于本文的特征金字塔,作者为每个阶段定义一个金字塔级别, 然后选择每个阶段的最后一层的输出作为特征图的参考集。 这种选择是很自然的,因为每个阶段的最深层应该具有最强的特征。具体来说,对于Res-Nets,作者使用了每个阶段的最后一个残差结构的特征激活输出。将这些残差模块输出表示为{C2,
C3, C4, C5},对应于conv2,conv3,conv4和conv5的输出,并且注意它们相对于输入图像具有{4, 8, 16, 32}像素的步长。考虑到内存占用,没有将conv1包含在金字塔中。

自上而下的路径和横向连接:

自上而下的路径(the top-down pathway )是如何去结合低层高分辨率的特征呢?方法就是把更抽象,语义更强的高层特征图进行上采样,然后把该特征横向连接(lateral connections )至前一层特征,因此高层特征得到加强。值得注意的是,横向连接的两层特征在空间尺寸上要相同。这样做主要是为了利用底层的定位细节信息。

Figure 3显示连接细节。把高层特征做2倍上采样(最邻近上采样法),然后将其和对应的前一层特征结合(前一层要经过1 * 1的卷积核才能用,目的是改变channels,是要和后一层的channels相同),结合方式就是做像素间的加法。重复迭代该过程,直至生成最精细的特征图。迭代开始阶段,作者在C5层后面加了一个1 * 1的卷积核来产生最粗略的特征图,最后作者用3 * 3的卷积核去处理已经融合的特征图(为了消除上采样的混叠效应),以生成最后需要的特征图。{C2,
C3, C4, C5}层对应的融合特征层为{P2, P3, P4, P5},对应的层空间尺寸是相通的。



图3 一个building block,说明横向连接和自上而下的途径,合并的加法

金字塔结构中所有层级共享分类层(回归层),就像featurized image pyramid 中所做的那样。作者固定所有特征图中的维度(通道数,表示为d)。作者在本文中设置d=256,因此所有额外的卷积层(比如P2)具有256通道输出。 这些额外层没有用非线性,而非线性会带来一些影响。

实际应用:

本文方法在理论上早CNN中是通用的,作者将其首先应用到了RPN和Fast R-CNN中,应用中尽量做较小幅度的修改。

Faster R-CNN+Resnet-101

FPN如何应用在RPN和Fast R-CNN (合起来就是Faster R-CNN)?首先要明白Faster
R-CNN+Resnet-101的结构。

直接理解就是把Faster-RCNN中原有的VGG网络换成ResNet-101,ResNet-101结构如下图: 



Faster-RCNN利用conv1到conv4-x的91层为共享卷积层,然后从conv4-x的输出开始分叉,一路经过RPN网络进行区域选择,另一路直接连一个ROI Pooling层,把RPN的结果输入ROI
Pooling层,映射成7 * 7的特征。然后所有输出经过conv5-x的计算,这里conv5-x起到原来全连接层(FC)的作用。最后再经分类器和边框回归得到最终结果。整体框架用下图表示: 



RPN中的特征金字塔网络

RPN是Faster R-CNN中用于区域选择的子网络,具体原理就不详细解释了,可阅读论文和参考博客:faster-rcnn 之 RPN网络的结构解析 。

RPN是在一个13 * 13 * 256的特征图上应用9种不同尺度的anchor,本文另辟蹊径,把特征图弄成多尺度的,然后固定每种特征图对应的anchor尺寸。也就是说,在每一个金字塔层级应用了单尺度的anchor,{P2, P3, P4, P5, P6}分别对应的anchor尺度为{32^2, 64^2, 128^2, 256^2, 512^2 },当然目标不可能都是正方形,本文仍然使用三种比例{1:2,
1:1, 2:1},所以金字塔结构中共有15种anchors。 

训练中,把重叠率(IoU)高于0.7的作为正样本,低于0.3的作为负样本。特征金字塔网络之间有参数共享,其优秀表现使得所有层级具有相似程度的语义信息。具体性能在实验中评估。

Fast R-CNN 中的特征金字塔网络

Fast R-CNN的具体原理也不详解了,参考我的知乎或者开发者头条 ,其中很重要的是ROI
Pooling层,需要对不同层级的金字塔制定不同尺度的ROI。

ROI Pooling层使用region proposal的结果和中间的某一特征图作为输入,得到的结果经过分解后分别用于分类结果和边框回归。

然后作者想的是,不同尺度的ROI使用不同特征层作为ROI pooling层的输入,大尺度ROI就用后面一些的金字塔层,比如P5;小尺度ROI就用前面一点的特征层,比如P4。那怎么判断ROI改用那个层的输出呢?这里作者定义了一个系数Pk,其定义为: 



224是ImageNet的标准输入,k0是基准值,设置为5,代表P5层的输出(原图大小就用P5层),w和h是ROI区域的长和宽,假设ROI是112 * 112的大小,那么k = k0-1 = 5-1 = 4,意味着该ROI应该使用P4的特征层。k值应该会做取整处理,防止结果不是整数。

然后,因为作者把conv5也作为了金字塔结构的一部分,那么从前全连接层的那个作用怎么办呢?这里采取的方法是增加两个1024维的轻量级全连接层,然后再跟上分类器和边框回归,认为这样还能使速度更快一些。

这个是FPN用于目标分割的架构图:



实验结果:









内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: