FPN

特征金字塔是多尺度目标检测中的一个基本组成部分,但是由于特征金字塔计算量大,所以多数方法为了检测速度而尽可能的避免使用特征金字塔,而是只使用高层的特征来进行预测。高层的特征虽然包含了丰富的语义信息,但是由于低分辨率,很难准确地保存物体的位置信息。与之相反,低层的特征虽然语义信息较少,但是由于分辨率高,就可以准确地包含物体位置信息。所以如果可以将低层的特征和高层的特征融合起来,就能得到一个识别和定位都准确的目标检测系统。

本文结合网络资源对 FPN 进行整理。

特征金字塔网络

1 动机

特征金字塔是多尺度目标检测中的一个基本组成部分,但是由于特征金字塔计算量大,所以多数方法为了检测速度而尽可能的避免使用特征金字塔,而是只使用高层的特征来进行预测。高层的特征虽然包含了丰富的语义信息,但是由于低分辨率,很难准确地保存物体的位置信息。与之相反,低层的特征虽然语义信息较少,但是由于分辨率高,就可以准确地包含物体位置信息。所以如果可以将低层的特征和高层的特征融合起来,就能得到一个识别和定位都准确的目标检测系统。

2 结构

图-1 常用的目标检测结构
  • (a) Featurized image pyramid:先把图片拓展或压缩为不同尺寸,对每种尺寸的图片提取不同尺度的特征,再对每个尺度的特征都进行单独的预测。
    • 优点:不同尺度的特征都可以包含很丰富的语义信息。
    • 缺点:时间成本太高。
  • (b) Single feature map:这是在 SPPnet,Fast R-CNN,Faster R-CNN 中使用的,在网络的最后一层的特征图上进行预测。
    • 优点:计算速度比较快。
    • 缺点:最后一层的特征图分辨率低,不能准确的包含物体的位置信息。
  • © Pyramid feature hierarchy:这是 SSD 采用的多尺度融合的方法,从网络不同层抽取不同尺度的特征,然后在这不同尺度的特征上分别进行预测。
    • 优点:不需要额外的计算量。
    • 缺点:有些尺度的特征语义信息不是很丰富,此外,SSD 没有用到足够低层的特征,而 FPN 的作者认为低层的特征对于小物体检测是非常有帮助的。

所以,为了使得不同尺度的特征都包含丰富的语义信息,同时又不使得计算成本过高,FPN 采用 Top-down 和 Lateral connection 的方式,让低层高分辨率低语义的特征和高层低分辨率高语义的特征融合在一起,使得最终得到的不同尺度的特征图都有丰富的语义信息,如图 (d)。

3 FPN(Feature Pyramid Network)

特征金字塔网络的结构主要包括三部分,如图-2,上半部分自左至右为 Bottom-upTop-down,下半部分为 Lateral connection

图-2 FPN的结构

3.1 Bottom-up

Bottom-up 是将图片输入到 backbone ConvNet 中提取特征的过程。backbone 输出的 feature map 的尺寸有的是不变的,有的是成 2 倍的减小。对于那些输出的尺寸不变的层,把它们归为一个 stage,每个 stage 的最后一层输出的特征则被抽取出来。以 ResNet 为例,将卷积块 conv2, conv3, conv4, conv5 的输出定义为 {C2,C3,C4,C5}\{C_2,C_3,C_4,C_5 \},这些都是每个 stage 中最后一个残差块的输出,这些输出分别是原图的 {1/4,1/8,1/16,1/32}\{1/4,1/8,1/16,1/32\} 倍。

3.2 Top-down

Top-down 是将高层得到的 feature map 进行上采样然后往下传递。因为高层的特征包含丰富的语义信息,经过 Top-down 的传播能使这些语义信息传播到低层特征上,使低层特征也包含丰富的语义信息。FPN 中,采样方法是最近邻上采样,使得特征图扩大 2 倍。上采样的目的就是放大图片,在原有图像像素的基础上在像素点之间采用合适的插值算法插入新的像素。

  • 最近邻上采样:最简单的一种插值方法,在待求像素的四个邻近像素中,将距离待求像素最近的邻近像素值赋给待求像素。设待求像素的坐标为 (i+u,j+v)(i+u,j+v)i,ji,j 为正整数,u,vu,v 为大于 0 小于 1 的小数,则待求像素灰度的值 f(i+u,j+v)f(i+u,j+v) 的计算方式如下图所示:

    图-3 最近邻插值

    如果 (i+u,j+v)(i+u,j+v) 落在 A 区域内,即 u<0.5,v<0.5u<0.5,v<0.5,则将 a 点的像素值赋给待求像素,其他三种情况同理。最邻近法计算量较小,但可能会造成插值生成的图像灰度上的不连续,在灰度变化的地方可能出现明显的锯齿状。

3.3 Lateral Connection

Lateral connection 主要包括三个步骤:

图-4 Lateral Connection
  • (1)对于每个 stage 输出的 feature map CnC_n,都先进行 1×11\times1 的卷积降低维度。

  • (2)将得到的特征和上一层采样得到特征图 Pn+1P_{n+1} 进行融合,即直接相加,element-wise addition。因为每个 stage 输出的特征图之间是 2 倍的关系,所以上一层上采样得到的特征图的大小和本层的大小一样。

  • (3)相加完之后进行 3×33\times3 的卷积得到本层的特征输出 PnP_n。使用 3×33\times3 卷积的目的是消除上采样产生的混叠效应,就是指前面提到的插值生成的图像灰度不连续,在灰度变化的地方可能出现明显的锯齿状

图-5 FPN的具体结构

具体来说,C5C_5 层先经过 1×11\times1 卷积,得到 M5M_5 特征。M5M_5 通过上采样,再融合 C4C_4 经过 1×11\times1 卷积后的特征图,得到 M4M_4。这个过程再做两次,分别得到 M3M_3M2M_2MM 层特征图再经过 3×33\times3 卷积,得到最终的 {P2,P3,P4,P5}\{ P_2,P_3,P_4,P_5 \} 层特征,然后 PP 层特征图上分别做分类回归。

4 应用

4.1 Feature Pyramid Network for RPN

图-6 为 Faster R-CNN 中 RPN 的网络结构,接收单尺度的特征输入,然后经过 3×33\times3 的卷积,并在 feature map 上的每个点处生成 9 个 anchor(3 个尺寸,每种尺寸对应 3 个宽高比),之后再在两个分支并行的进行 1×11\times1 卷积,分别用于对 anchor 进行分类和回归。

图-6 RPN网络结构

将 FPN 和 RPN 结合起来,RPN 的输入变成多尺度的 feature map,就需要在金字塔的每一层后边都接一个 RPN head(一个 3×33\times3 卷积,两个 1×11\times1 卷积),如图-7 所示,其中 P6P_6 是通过 P5P_5 下采样得到。

图-7 在RPN中加入FPN

在生成 anchor 时,因为输入多尺度特征,因此不需要再对每层都使用 3 种不同尺度的 anchor,只为每层设定一种尺寸的 anchor,图中绿色数字就代表每层 anchor 的尺寸,但是每种尺寸仍然对应 3 种宽高比。因此,共有 15 种 anchor。anchor 的 ground truth label 和 Faster R-CNN 中的定义相同,即如果某个 anchor 和 ground-truth box 有最大的 IoU,或者 IoU 大于 0.7,那这个 anchor就是正样本,如果 IoU 小于0.3,那就是负样本。每层 RPN head 的参数是共享的。

4.2 Feature Pyramid Network for Fast R-CNN

在 Fast R-CNN 中有一个 RoI Pooling 层,其使用 region proposal 的结果和特征图作为输入,得到每个 proposal 对应的特征后进行池化,之后再分别用于分类结果和边框回归。

之前 Fast R-CNN 使用的是单尺度的特征图,但是现在使用不同尺度的特征图,那么 RoI 需要在哪一个尺度的特征图上提取对应的特征呢? FPN 的作者认为,不同尺度的 RoI 应该使用不同特征层作为 RoI pooling 层的输入,大尺度 RoI 就用后面一些的金字塔层,比如 P5P_5;小尺度 RoI 就用前面一点的特征层,比如 P4P_4。对于如何判断 RoI 该用哪个层的输出,这里定义了一个计算公式:

k=k0+log2wh224k=\lfloor k_0 + \log_2 \frac{\sqrt{wh}}{224} \rfloor

其中,输出的 kk 代表特征图的层数编号。k0(=5)k_0(=5) 是基准值,代表第 5 层特征图 P5P_5wwhh 为 RoI 的宽和高,224 是 ImageNet 的标准输入。假设 RoI 的 wwhh112×122112\times122,那么 k0=k1k_0 = k - 1,即为 4,选择第 4 层特征图。

4.3 Faster R-CNN with FPN

图-8 在Faster R-CNN中加入FPN

和普通的 Faster R-CNN 相同,为每个 RoI 提取特征之后,经过 RoI pooling 层将 RoI 的特征 resize 为相同大小,此处 resize 为 7×77\times7 的,之后连接两个 1024-d 的 FC layer,然后并行的输入到两个 FC layer 中分别进行分类和回归,得到最终结果。

参考

源码