1 概述

  • 到目前为止。我们介绍过的各种目标检测模型中使用的增强网络多尺度检测性能的方式有两种:①第一种是将输入图像变换出不同的分辨率,使网络获得多尺度检测能力;②第二种是从不同层次的feature maps上预测目标的bounding boxes,从而达到多尺度检测的目标,这种方法以SSD为代表。
  • 对输入图像变换分辨率是使网络获得多尺度检测性能的有效方法,但其缺点也同样明显:要花费大量的时间训练网络,需要使用的内存空间也非常多
  • SSD所使用的使用不同层级的feature maps的方法非常直观且有效。SSD并没有使用浅层的feature maps(尺寸较大的feature maps),这是因为浅层的feature maps包含的特征中大部分是图像的边缘、纹理、角点等特征,基本不包含高层语义特征,因此无法直接用于预测bounding boxes。与此同时,SSD的缺点也在这里:浅层的feature maps中包含的特征是有助于识别小目标的,SSD没有采用浅层的feature maps,也就放弃了这一部分可以提高检测小目标能力的机会。
  • 也就是说,浅层的feature maps包含了可提高小目标检测性能的信息,但是由于这些信息不具有高层语义特性,因此没法直接使用。那要如何对这些浅层feature maps进行处理以使其可以应用于预测目标位置呢?以这个为出发点,FPN(Feature Pyramid Networks)网络被提出。换句话说,FPN网络实际上是对SSD网络的改进。

2 FPN网络结构

  • 在正式介绍FPN网络之前,我们先介绍目标检测中几种常见的确定目标位置的方法:①第一种方法将输入图像变换出不同的尺寸,分别送入网络得到各自最终的feature maps,用它们分别预测bbox,再选出最好的那个;②第二种方法是最朴素的方式,将单一图片送入网络,使用最终的feature maps完成目标bbox的预测;③第三种方法以SSD为代表,不同层次的feature maps都被用来预测目标的bounding box;④最后一种方法就是我们将要介绍的FPN网络使用的方法。

目标检测 重叠_特征金字塔

  • 首先明确一下FPN网络的目标:神经网络得到的feature maps中浅层的feature maps包含的高层语义信息较少,如何对这些浅层的feature maps进行改造以使其包含高层语义信息? 分为如下两个步骤:
  • 首先是正常生成feature maps的过程 (论文称为Bottom-up pathway,直译为“自底向上过程”)。以ResNet为例。ResNet网络的卷积层可分为5个block,每个block内部包含若干个卷积层(ResNet18、ResNet34、ResNet50、ResNet101、ResNet152中每个block包含的卷积层数量各不相同,但都有5个block),同一个block内的不同卷积层输出的feature maps形状是相同的(channel数量可能有差异)。由于每个block内部生成的feature maps形状都相同,FPN网络将一个block称为一个stage,对每个stage,只使用最后一层卷积层生成的feature maps。这4个feature maps的尺寸逐个减半。下图是ResNet不同版本的网络结构图。 不采用第一个block中的feature maps的原因是其尺寸太大,太占用内存资源。

目标检测 重叠_特征金字塔_02

  • 对上一步得到的4个尺寸逐个减半的feature maps,进行如下处理 (论文称为Top-down pathway and lateral connections,直译为“自顶向下和侧向连接”) :对尺寸最小的feature maps,进行两倍上采样(放大两倍),采样方法为 nearest neighbor upsampling ,将采样得到的feature maps与原始的相同尺寸的经过1x1卷积的feature maps进行逐点相加操作,生成一个新的feature maps。再对尺寸次小的feature maps同样进行上述处理,得到新的4个feature maps(尺寸最小的那个feature maps直接进行1x1的卷积得到相同尺寸的新的feature maps)。示意图如下(图中只画了三层):

目标检测 重叠_特征金字塔_03

  • 考虑到上采样对feature maps带来的噪声,论文又对这4个feature maps分别进行了3x3的卷积操作以试图消除上采样带来的噪声的影响(并不改变feature maps的大小)。显然,最后得到的这四个feature maps的尺寸与原始前向传播得到的feature maps的尺寸是相同的。
  • 得到这4个feature maps后,再使用SSD中anchor及anchor boxes那一套东西,生成最终的bounding box。为了方便权值共享,论文将每个feature maps的channel都固定为256。(对不同feature maps的anchor,都使用同一组卷积核完成分类和边框回归的任务
  • 到这里,FPN网络的核心贡献就讲完了,看似是一点小小的改变,会令目标检测性能提高吗,我们往下看

3 实验验证

3.1 RPN网络中使用FPN

补充理解

  • 先回忆下RPN网络的结构和实现流程:RPN网络
  • 该论文使用的RPN网络基于ResNet。如上所述,可生成特征金字塔{P2, P3, P4, P5},这里再添加一层feature maps {P6}(P5下采样得到)。由于这种特征金字塔的形式本身就包含了多尺度信息,以此在特征金字塔的每一层只设置一个anchor的尺寸,分别为{322,642,1282,2562,5122},每层的anchor ratio分别为{1:2, 1:1, 2:1}。也就是说,这5个feature maps共会在原图像上生成15种不同尺寸和形状的anchor boxes。之后整个RPN网络的训练方式并未发生改变。需要注意的是,再最后使用1x1的卷积对每个anchor完成分类和边框回归时,采用权值共享,也即对每个anchor使用两组卷积核,一组卷积核完成分类,一组卷积核完成回归。
  • 下面是实验结果

目标检测 重叠_特征金字塔_04

3.2 Fast RCNN网络中使用FPN

  • 先回忆下Fast RCNN的网络结构和检测流程:Fast RCNN
  • Fast RCNN只对输入图像产生的一个feature maps进行处理,而FPN结构会产生好几个feature maps,要怎么在Fast RCNN中应用FPN结构呢?作者定义了这样一个公式:

目标检测 重叠_object detection_05

  • 这个公式的作用是依据proposal的长(w)和宽(h)确定该proposal由FPN结构产生的feature maps中的哪一个进行RoI pooling。其中k0=4。举例:对一个112x112的proposal,计算出的k值为3,因此,这个proposal由编号为k=3的feature maps的对应区域进行处理(k=1时feature maps的尺寸最大,k=4时feature maps的尺寸最小)
  • 实验结果如下:

目标检测 重叠_目标检测 重叠_06

实验结果的解读这里就不详细讲了,一来很简单,二来要打的字很多。这里还有很多细节我没有涉及到,因此若想详细了解FPN网络,仍旧需要阅读原论文,这篇博文可以作为一个辅助。

4 总结

  • 一点小小的改进就可以带来如此大的性能提升,这是令我非常诧异的,对我的启示是:不要整天尽想着发明个多厉害的网络,从现有的技术出发,分析其不足,做出一些小小的改进,可能就会带来很好的效果。
  • FPN网络的缺点是检测速度太慢了,只有5FPS,这是由于多个feature maps都生成了anchor boxes,换取话说就是用检测速度的下降换取了检测精度的提升,因此,只能停留在理论分析刷检测精度的阶段,并不能在真实生产环境下落地。