【论文笔记】FPN - Feature Pyramid Networks for Object Detection

【概要】
特征金字塔是在多尺寸下目标检测识别系统里的一个基本结构,但是近期深度学习目标检测器都避免金字塔表达,部分原因是它们是计算和内存密集型的。这篇文章里,我们提出了一种内在多尺寸,金字塔层级的深度卷积神经网络来构建特征金字塔。拥有横向连接的自上而下的结构可以生成全部尺寸的高层语义特征图。这种结构,即FPN,在一些应用中作为特征提取器展现了效果上显著的提高。在一个基础的Faster R-CNN系统中使用FPN时,在COCO检测基准上超过了所有单模型的表现,包括COCO2016的胜者。本文提出的FPN可以在一个GPU上以6FPS运行,是一个既实际又精确的多尺度目标检测。

【核心内容】

1.图像金字塔

在很多不同的尺度上做目标识别是困难的,特征图像金字塔组成了一个标准解决方案的基础,如图所示:


image.png

这些金字塔是尺度不变的,因为对象的尺度变化通过在金字塔中移动它的级别来抵消。图像金字塔在手工设计特征时被广泛使用。

2. 卷积特征的单一表达

卷积特征逐步取代人工特征。
优势:更强的语义表达/对尺度变化更鲁棒

两种对比:
尽管卷积特征有自己的优势,但是金字塔结构仍能提供更高的准确度。
图像金字塔的优势:每一层都能产生多尺度特征表达,所有层在语义上都有很强的表达能力。
图像金字塔的劣势:但是相应,使用金字塔时推导时间也会增加,端到端的训练特征金字塔在内存上也不可行。因此,图像金字塔仅在测试时间使用,这会造成训练/测试时间推断之间的不一致。 由于这些原因,Fast and Faster R-CNN 选择在默认设置下不使用图像金字塔。

如果卷积特征能和图像金字塔结合使用,就比较完美了,但是因为图像金字塔的劣势,不可能以这种形式组合使用。于是出现了:金字塔结构的卷积特征表达应用。

3.金字塔层级结构的卷积特征 (Pyramidal feature hierarchy)

图像金字塔不是唯一计算多尺度特征表达的方式,深度卷积网络逐层计算特征层次,并且通过下采样层,特征层次具有固有的多尺度金字塔形状。
这种网络内部的层级特征能够产生不同空间分辨率的特征图。
但也存在自己的问题:引入了由不同深度引起的大语义差距。高分辨率图的低层次特征损害其目标识别的表达能力。

该结构应用:
SSD第一个使用了这种卷积网络特征金字塔,如上图 (c)。SSD中的金字塔完全可以在前向传播时重复用其他层计算的多尺度特征。但是为了避免使用低层次的特征,SSD放弃了重复使用已经计算的层,而是从网络的高层开始构建金字塔,然后添加几个新层。
缺点:因此,它错过了重用特征层次结构的高分辨率图的机会。而这对于检测小目标是很重要的。

SSD已经做出了一个很好的尝试,但是在小目标检测上,由于其对低层特征的不重视,仍然存在缺陷,接下来介绍能够弥补这种缺陷的金字塔结构,也就是本文提出的FPN。

4. 特征金字塔 (Feature Pyramid Network)

本文的目标是建立一个在所有尺度都拥有很强语义的特征金字塔。
思路:我们使用的结构将低分辩率强语义特征和高分辨率弱语义特征通过自上而下,横向连接的方式组合在一起,见上图(d)。
这样的结果就是这个特征金字塔在全部层级都有丰富的语义,并且可以从一个输入图片的尺寸快速建立。我们后面会展示我们提出的这种网络内部金字塔是如何在不损失表达能力,速度,内存的同时替换掉老版本的图像金字塔的。

【相关工作】

  1. 早期的手工设计特征
    如SIFT / HOG都是在在整个图像金字塔上进行密集计算,它们被广泛使用在图片分类,目标检测,人体姿态估计等任务。
  2. 深度神经网络目标检测
    近期像Fast R-CNN和Faster R-CNN提倡使用从单一尺寸计算出的特征,因为它们可以在准确和速度之间达到平衡。但是多尺寸的检测仍然在检测小目标时表现更好。
  3. 使用了多层的方法
    如FCN在多个尺度上对每个类别的部分分数求和,以计算语义分割。SSD [22] 和 MS-CNN [3] 在不结合特征或分数的情况下预测特征层次结构的多层上的对象。

【网络结构】
我们希望利用卷积网络金字塔特征的层级结构,具有低层级到高层级的语义,构建一个从始至终具有高级语义的特征金字塔,于是我们提出了FPN。
FPN将任意大小的单尺寸图片作为输入,以完全卷积的方式输出多个层级相应的特征图。这个过程与卷积网络的结构是独立的,本文中我们呈现的结果对应使用的网络为ResNet。我们的金字塔的结构涉及到从下而上的路径,从上而下的路径,和横向连接,接下来会介绍。

  1. 自下而上的路径
    自下而上的路径是卷积网络的前向反馈,得到一个包含了几个尺寸对应的特征图的层级特征。通常由多个层输出同一个尺寸的特征图,我们可以认为这些层处于同一网络阶段。在我们的特征金字塔里,我们为每一个阶段定义一个金字塔级别。每个阶段最后一层的输出作为特征图集。这样的选择很自然因为每个阶段最深的层应该有最强的特征。
    对于ResNet,我们使用每个阶段最后一个残差块激活函数的输出。我们标记这些输出为{C2, C3, C4, C5},相对于输入图像它们步长为{4,8,16,32},我们不使用第一层因为需要的内存过大。

  2. 自上而下的路径和横向连接
    自上而下的路径通过上采样金字塔高层级的空间更粗糙(分辨率低)但是语义更高级的特征来生成高分辨率的特征图。这些特征将通过横向连接加入从下而上路径产生的特征。每一个横向连接将同样空间尺寸的从上而下的特征和从下而上的特征合并起来,从下而上的特征具有较低的语义,但是它能更准确地定位,因为它下采样次数更少。


    image.png

构建自上而下特征图的结构如图所示,对一个低分辨率的特征图进行上采样(为简单起见使用最近邻上采样)得到高分辨率的特征图。然后与对应的自下而上的特征图(经过1*1的卷积层以减少通道数)逐个元素相加。

【FPN在RPN的应用】

  1. 金字塔的每一层都接一个head (33和2个11)
  2. 每一层级分配单一尺度的anchor,但是保留不同形状,{1:2,1:1,2:1}
  3. {P2,P3,P4,P5,P6}的锚点对应原图{32^2, 64^2, 128^2, 256^2, 512^2}的区域
  4. 不同层级head参数共享;实验发现不共享参数时准确度差不多;猜测源于金字塔每一层都有相似的很强的语义,和图像金字塔的优势类似
image.png

【FPN在Fast RCNN的应用】
RoI pooling层的输入从FPN金字塔的某一层获取。那么如何确定从哪层取?


image.png

K0代表输入图片大小为224*224时RoI输出对应从哪一层取的特征输出,如ResNet为backbone的Fast R-CNN使用的是C4的特征图,则K0为4


image.png

举例:


image.png

image.png

上图生成的几个不同颜色的box分别需要在金字塔的第几层提取特征?

image.png

【映射特点】
特点:大尺度box用金字塔上层特征,小尺度box用金字塔底层信息
原因:
1.上层特征位置信息有损失,但是语义相比较下层更强
2.下层特征虽然语义可能没有上层特征强,但是位置信息比较完整,适合小目标用。
3.大尺度目标感受野更大,相对来说不需要高分辨率特征,并且底层特征尺寸更大,计算量大,不适合大目标用。

【共享分类层参数】
RPN的head和RoI pooling后面的分类层,无论使用金字塔的哪层特征,参数都是共享的。


image.png

【总结】
如何将卷积网络和金字塔结构的优势结合在一起?图像金字塔不能直接搬进来用,因为计算内存消耗严重,SSD尝试直接将卷积特征的金字塔结构生成的每一层的特征拿来用,但是对比图像金字塔,金字塔结构的卷积网络的缺点是不同金字塔层语义强度不一样,因此SSD放弃了底层的特征,也因此在小目标检测不是很好。如果金字塔底层特征也有很强的语义,那么在使用时是不是既不会影响识别能力,又对小目标检测友好?于是本文想到的方式是用上层的强语义特征加强底层的语义特征,通过上采样和横向连接生成新的强语义高分辨率的底层特征,即FPN。

你可能感兴趣的:(【论文笔记】FPN - Feature Pyramid Networks for Object Detection)