目录

 

0、写在前面

1、动机

2、FPN结构

3、写在后面


0、写在前面

在目标检测时,若要检测具有不同尺度的目标,通常都是用特征金字塔的方法。但是,由于该方法属于计算密集型和内存密集型,所以近期的深度学习目标检测都没有采用。本文作者利用了卷积网络自身固有的多尺度特性以及金字塔层级结构,构造了一种特征金字塔结构,且只增加了一点微小的计算代价。这种结构称作Feature Pyramid Network (FPN),是一种自顶向下带有侧向连接的网络结构。经过作者的实验验证,基于FPN的Faster RCNN达到了SOTA。

FPN同SPP一样,都使用了视觉领域的一个经典结构:图像金字塔。金字塔结构天生对多尺度友好,因此也极大地影响了后续的研究。FPN在经典一阶段目标检测网络YOLOv3中也被广泛使用,并在各类任务中都能看到其身影,也方便集成到各类网络结构中。

下面主要就FPN的结构及其思想进行介绍。

1、动机

fast rcnn目标检测 目标检测 fpn_FPN

标准的图像金字塔如图1(a)所示,在原始图像上,进行不同尺度的缩放,可以得到一系列分辨率的图像,然后分别提取特征,就得到了特征金字塔。这种结构在手工设计特征的时代被大量使用,但现在手工特征已被ConvNets所替代。ConvNets通过逐级提取高级语义特征,然后使用最后的卷积层输出用于后续任务,如图1(b)所示。在ConvNets时代,同样需要图像金字塔来提升性能,比如各种比赛中使用的多尺度训练和多尺度测试。但这种用法比较占用计算资源,且推理时间较长,不适合实时任务。

但图像金字塔并不是唯一的金字塔结构,还有一种是特征金字塔结构。比如,在ConvNets的结构中,通常包含多个layers,每个layer进行一次下采样,这样一来,对于整个ConvNets结构,其本身就是一个金字塔结构。SSD是第一次尝试利用这种金字塔结构的网络,其方式如图1(c)所示。但是SSD这种方式有个弊端,就是低层级layer输出的feature maps中包含的语义信息不够丰富,所以,通常都会从较高层级的layer(如VGG的conv4-3)开始使用,并增加几个新的layers。因此,这就错失了利用低层级高分辨率空间信息的机会,而这些空间信息又对小目标检测非常有用。

基于以上考虑,本文提出了FPN,利用ConvNets本身的金字塔结构, 并使得从低到高每个层级都产生包含强语义的feature maps,结构如图1(d)所示。

类似的方法也有研究,如图2上半部分的结构,但是其目标是构造一个单一的输出结果,FPN与之不同之处仅仅在于对每一层都独立输出一个结果。如图2下半部分。

fast rcnn目标检测 目标检测 fpn_特征金字塔_02

2、FPN结构

关于FPN的结构,已经在图1(d)和图2下半部分中有所展示,其结构无非就是对ConvNets的每一层feature maps进行自顶向下的特征融合,从而使得每层输出都具有了高级语义信息。至于不同分辨率的layer如何转化,以及同分辨率的layer如何融合,可以参考图3:

fast rcnn目标检测 目标检测 fpn_目标检测_03

从图3可以看出:低分辨率的feature maps通过2倍上采样得到与低一级feature maps相同的分辨率,然后对低级feature maps使用1*1卷积进行通道降维,最后将两者相加(addition),就完成了该层的特征融合。

总体而言,FPN包含了一个自底向上的路径、一个自顶向下的路径,还有一些侧向(同级)连接:

  • 自底向上的路径:就是backbone中ConvNets的forward过程,该过程通常包含了不同分辨率的层级,如VGGs、ResNets,对于每个层级都可以定义为一个金字塔层级;
  • 自顶向下的路径:这一条路径也就是将低分辨率-高语义信息的高级feature maps一步步上采样到高分辨率的过程,同时保持了其高语义信息;
  • 侧向连接:也即将backbone中的layer和自定向下路径中的同分辨率的layer连接在一起,连接方式如图3所示。

我们可以体会下这个过程:

一张图片作为输入,其经过backbone中的卷积层,一层一层进行特征抽象,得到的feature maps分辨率越来越低,但其中的语义信息越来越抽象越来越高级;

然后,我们从分辨率最低、但语义信息抽象的顶层feature maps开始,先进行上采样(注意:单纯的上采样,虽然使其分辨率变大,但空间信息并没有变多),然后和backbone中同分辨率的feature map相融合,那么得到的feature maps一定是在保留了高级语义信息的同时,也在空间信息上更加丰富了;

就这样,经过一层一层的上采样+addition融合,我们就可以得到多层的feature maps输出,且每一层都具有高级语义信息;

那么,对每一层都有了高级语义信息,又有什么用呢?答案很显而易见,就是用于检测具有不同尺度的目标:最上层分辨率最低,每个特征在原图的感受野最大,所以用于检测大目标;中间层用于检测中等目标,最下层分辨率最高,相应的其感受野也最小,因此适合检测小目标

PS:其实,YOLOv3就是用的这种方式。此外,这个结构是不是很像Encoder-Decoder结构?就像图2的上半部分那样,在语义分割的网络设计中,经常看见其影子。可见,各种视觉任务中的方法很多都是异曲同工,都可以互相借鉴,这也提示我们多了解各种任务中的方法,从而在需要的时候,能够想到一些额外的解决方案。

3、写在后面

FPN结构是不同于图像金字塔的另一种金字塔结构,其利用了ConvNets本身的特点,在特征的层面上建立了金字塔,并通过上采样+addition的方式将每一层都赋予了高级语义特征,从而在每个层级都可以输出预测结果。这种方式,对不同尺度的对象都具有一定的检测效果,从而整体提升了目标检测的性能。此外,这种结构已经广泛的应用到了各种任务中,如语义分割等。学习并利用好FPN的特性,必定能够对我们的工作带来一定帮助。