FPN:Feature Pyramid Networks for Object Detection 这篇文章主要基于 特征金字塔(Feature Pyramids) 解决了 目标检测系统中识别多尺度目标的不足。
尽管特征金字塔是识别任务中实现多尺度目标检测的基本技术之一,但因为其 计算量大、内存占用高 而难以应用在深度学习目标检测中,因此先前的深度学习目标检测网络会直接利用卷积网络计算出的特征,只采用单一尺度的最高层特征进行预测,然而这种方法存在一个固有的弊端:低层特征和高层特征之间的语义信息存在很大差距,这就导致网络在预测时缺少低层语义信息,从而不利于检测小目标。为了处理目标大小差异十分明显的检测问题,经典做法是利用图像金字塔生成多尺度特征图进行预测,但这又会带来极大的计算量,所以这篇文章引入了带有 横向连接和跳跃连接 的特征金字塔,只需增加极少计算量就可以构建多尺度的高级语义特征图 [1]。
识别多尺度目标在计算机视觉领域中是一项基本的挑战,而建立在图像金字塔上的特征金字塔,也就是 特征化图像金字塔,构成了这一挑战的标准解决方案,原因在于 特征金字塔具有尺度不变性,换句话说就是 目标的尺度变化可通过移动其在金字塔中的层级来抵消。因此我们只需令网络同时考虑 目标在图像中的位置 与 其在金字塔中的层级,就可以实现多个不同尺度的目标检测。
随着深度学习的发展,特征金字塔的应用方式也在不断变化,大致经历了以下几个阶段:
在人工特征时代 (如 HOG、SIFT、DPM 等) 大量应用了基于图像金字塔构建特征金字塔的方法,由于在图像金字塔的每一个层级上都进行特征化,最终得到的特征金字塔的每一层都具有较强的语义信息。但这样构建的特征金字塔非常苛刻,以至于类似上述方法的目标检测器需要进行密集尺度采样以获取较好的结果,从而使得模型的速度变慢。
总结来说,特征化图像金字塔的每一层以获取特征金字塔具有如下特点:
优点
缺点
由于特征化图像金字塔的每一层具有上述缺点,曾在识别任务中应用的人工特征逐渐被卷积网络 (如 AlexNet、GoogleNet、VGGNet 等) 计算的特征替代。这种特征 能够表达高级语义信息,且 对尺度变化更加鲁棒,有助于使用单一输入尺度计算的特征进行识别 (如 Over-Feat、R-CNN、SPPNet、Fast/Fatser R-CNN 等)。
尽管利用卷积网络计算特征具有对尺度变化的鲁棒性,但最终用于预测的特征层却缺乏低层语义信息,影响预测的准确性,而特征金字塔的所有层都具有很强的语义信息,因此仍然需要特征金字塔来获取最为准确的结果(如 ResNet 等)。
总结来说,使用单一尺度特征具有以下特点:
优点
缺点
要知道图像金字塔并非计算多尺度特征表示的唯一方式,深度卷积网络逐层计算的结果就是一个 特征层次结构,多尺度金字塔形状是特征层次结构固有的属性。
这种网络内的特征层次结构能够产生具有不同空间分辨率的特征图,但却引入了由不同深度引起的较大语义差距:低层特征图具有高分辨率,但语义信息的表达能力弱,适用于检测小目标;高层特征图具有低分辨率,但语义信息表达能力强,适用于检测大目标。如:
通过上述三个阶段可以发现一个好的特征金字塔应该同时满足 多尺度 和 所有尺度都具有强语义信息。这就是本文的目标。
那么这种特征金字塔该如何实现?在 Hourglass Net、Recombinator Net 等中均采用了一种 top-down融合 的思想,基本思路就是通过 top-down 和 skip/lateral-connection 将将跨分辨率和语义级别的低级特征图关联起来,借此来保证金字塔的每个尺度上都具有强语义信息,但它们的目标是 生成一个高分辨率的单一高级特征图,并在该图上进行预测,如用于分割的 U-Net、Sharp-Mask,用于人脸检测的 RecombinatorNet,用于关键点估计的 Stacked HourglassNet 等。
而本文则利用 top-down融合 与 横向连接(lateral connection) 将低分辨率、强语义信息的特征与高分辨率、弱语义信息的特征相结合,构建了一个在所有层上都具有丰富的语义信息的特征金字塔,并 在该金字塔的每个级别上都独立进行预测。
通过这种方法构建的网络内金字塔特征层级能够代替先前的特征金字塔,不仅 丰富了所有层的语义信息,而且也实现了在不牺牲表达能力、降低速度或增大内存的情况下,从单一输入快速构建金字塔结构的目标。
实验结果表示,仅基于FPN的Faster R-CNN检测器,在COCO检测基准上达到了最先进的单模型结果,此外,FPN 可以在所有尺度下进行端到端训练,并在训练/测试时一致使用,而使用图像金字塔时在内存方面是不可行的。
本文中的特征金字塔是指 基于 (具有从低到高的语义信息的) 卷积网络的金字塔特征层级构建出的一个始终具有高级语义信息的特征金字塔。如何能够让网络的每一层都具有高级特征呢?最直观的想法就是将低层分辨率高但语义信息弱的特征图和高层分辨率低但语义信息强的特征图组合在一起,FPN就是基于这一想法构建得到。
FPN 对于这一通道没有进行特殊的改进或调整,保持了作为主干卷积网络的前馈计算部分 (也就是FPN结构图中最左侧区域)。它能够产生一个包含不同尺度特征图的特征层级,每一级采用step为2的降采样 (步长即输入尺寸和特征图尺寸的比例,以2倍递减)。
在一些网络中通常有一些层会输出相同大小的特征图,这些层被认为处在同一个 阶段(stage),比如 ResNet 中的卷积层 conv2_x、conv3_x
等:
在 FPN 网络中,每个阶段对应了金字塔中的一个级别,选取每个级别中最后一个卷积层的输出构成参考特征图集,经过语义丰富 (也就是后期的融合) 构建出特征金字塔。这种选择是很自然的,因为理论上每个阶段的最深层应该具有该阶段最强的语义特征。
224*224
,对于阶段 conv2, conv3, conv4, conv5
,选用每个阶段中最后一个残差块的输出特征图用于横向连接,简记为 {C2, C3, C4, C5}
,这些特征图的大小分别为 [56x56, 28x28, 14x14, 7x7]
(对应了前面提到的特征图间的步长比例为2)。conv1
原因是其内存占用过大。d=256
,也就是所有输出特征图的通道数都是相同的。C5
执行 1x1 conv
以获得 top-down 中分辨率最低的特征图开始,直到获得分辨率最优的特征图;1x1 conv
,目的是消除前后两者之间的通道不一致性;3x3 conv
生成最终的预测用特征图 {P2, P3, P4, P5}
分别对应先前的 {C2, C3, C4, C5}
(对应下图中的 {M2, M3, M4, M5}
),这里使用 3x3 conv
的目的是消除上采样带来的叠加效应。
以上就是FPN 的构建成分,超级简单,因为作者在文中提到 Simplicity is central to our design,简单是设计的核心,尽管使用更为复杂的残差块能获得稍微好些的结果,但由于 FPN 的本质不在于此,故不需要采用复杂的结构。
通过这一部分我们其实很容易发现,FPN 能够提升对小目标的检测效果是有理由的:不仅利用了 top-down 通道中传递的小目标的上下文信息,同时还为小目标增大了特征图的分辨率。
作为在深层卷积网络中构建特征金字塔的通用解决方式,FPN 可以与很多先进的目标检测模型组合在一起。比如 R-CNN、RPN、Fast R-CNN等。
在 Fast R-CNN 中提出的 RPN 是一种基于滑动窗口的类别未知的目标检测器。原始的 RPN 是在一个单一尺度的卷积特征图上,基于密集的 3 × 3 3\times3 3×3 滑动窗口构建了一个小型子网络(下图左侧),用于执行分类任务(目标/非目标的二分类)和边界框回归任务。实现方式是在滑动窗口产生的锚框上执行一个 3 × 3 × 256 3\times3\times256 3×3×256 的卷积,然后通过两个相同的 1 × 1 × 256 1\times1\times256 1×1×256 的卷积完成分类任务和回归任务。这一部分通常被称为 head。其中分类任务的类别判定标准与回归任务的目标都是相对于一组锚框(下图右侧)定义的,这组锚框是预定义的,具有不同的尺度和宽高比以覆盖不同形状的目标。
我们可以通过用 FPN 替换 RPN 中的单一尺度特征图来调整 RPN。大致流程如下:
[P2,P3,P4,P5,P6]
上分别具有 [32x32,64x64,128x128,256x256,512x512]
个像素的区域,同时在每一层上使用三种宽高比 [2:1, 1:1, 1:2]
(也就是一个位置对应三个锚框)。因此在整个特征金字塔上共有15种锚框。当 head 的参数在金字塔的所有层上都共享时,与参数不共享的情况下性能表现是近似相同的,这表明 金字塔的所有层共享相似的语义信息。这就类似于使用特征化的图像金字塔,实现了每一层都具有强语义信息。之所以强调要保证各层级输出的通道数必须一致,是因为这样才能使用相同的参数,达到共享的目的,从而各层级可共享分类网络(分类器+边框回归器)。
small, medium, large
的目标。800 pixels
,采用 synchronized(同步) SGD 法在 8个GPU
上进行训练,其中每个GPU上的每一个 mini-batch=2
,每幅图像中包括 256个anchors
。设置 weight decay=0.0001,momentum=0.9,lr=0.02(30k mini-batches) & 0.002(next 10k)
。
为实现和原始 RPN 的公平对比,实验中设置了两个 baseline,即分别使用主干网络 ResNet-50 中的单一尺度特征图 C 4 , C 5 C_4,\ C_5 C4, C5,并保证超参数的一致性(即同样设置五个尺度的锚 [32*32, 64*64, 128*128, 256*256, 512*512]
)。
消融实验的目的是为了说明 FPN 的三个组件 lateral connection、top-down path、pyramid representation 的重要性。
模型 ( d ) (d) (d) 中未设置 top-down 通道,直接将1x1的横向连接和3x3的卷积附加在bottom-up金字塔之后,模拟了重用金字塔特征层次结构的效果。其评估结果与 ( a ) (a) (a) 效果相当,但与 ( c ) (c) (c) 相差较大,推测是由于 bottom-up的特征金字塔每一层的语义信息差距较大,尤其是对于较深的ResNets。文中提到了尝试不共享预测部分,但得到的反而是性能下降,表明该问题没办法通过特定于层的预测部分(heads)解决。
模型 ( e ) (e) (e) 中未设置横向连接,只有上采样通道 top-down path。从实验结果可以看出,评估效果并不好。原因在于尽管 top-down 的特征金字塔具有较强的语义特征和高分辨率,但这些特征的位置信息并不精确,因为它们经过了多次上采样和下采样,而 更精确的位置信息可以直接从bottom-up通道中的同级经过横向连接传递至top-down通道。表明了使用横向连接的重要性。
模型 ( f ) (f) (f) 中未利用金字塔特征表示结构,仅将预测部分附加在了具有最高分辨率和最强语义特征的特征图 P 2 P_2 P2 之后,类似于 ( a ) (a) (a) 与 ( b ) (b) (b),需要将 anchors 分配到该特征图中。尽管该模型要优于 ( a ) (a) (a) 与 ( b ) (b) (b) 但却依然不如 FPN,这是因为 RPN 是具有固定窗口大小( 3 × 3 3\times3 3×3) 的滑动窗口检测器,在所有金字塔的层级上进行滑动扫描可以增加其对尺度方差的鲁棒性,提升检测结果。此外,单独使用 P 2 P_2 P2 会导致更多的锚点(750k),这是因为它的空间分辨率很大。这个结果表明,大量的锚本身不足以提高准确性。
Fast R-CNN 常用于单尺度特征图的检测,因此如果将 FPN 应用在 Fast R-CNN 上,则需要将不同尺度的 RoI 分配到特征金字塔的不同层级上。那么如何进行分配呢?(关于 RoI Pooling 的解释可查看这个 [3] Region of interest pooling expalined)
对于输入图像中宽为 w w w,高为 h h h 的 RoI,通过
k = ⌊ k 0 + l o g 2 ( w h / 224 ) ⌋ k = \lfloor{k_0+log_2({\sqrt{wh}/224})}\rfloor k=⌊k0+log2(wh/224)⌋ 进行计算可知,应将 RoI 分配至特征金字塔的第 P k P_k Pk 级别。其中:
基于 ResNet-101 的 Faster R-CNN 结构图:
我对这一分配策略的理解是尺度越大的 RoI,对应着图像中较大的目标,也就对应了应当映射至特征金字塔中处于高层的特征图(比如对于初始RoI大小为 224 × 224 224\times224 224×224,利用上述公式可算得 k = 4 k=4 k=4,也就对应了金字塔中的 P 4 P_4 P4 层级);随着 RoI 尺度的减小,其应当映射到的特征图在特征金字塔中的层级也应该减小(比如对于RoI尺度减半后,大小为 112 × 112 112\times112 112×112,利用上述公式可算得 k = 3 k=3 k=3,也就对应了金字塔中的 P 3 P_3 P3 层级)。
那么如何将FPN 应用在 Fast R-CNN 上呢?论文中也给出了具体思路:
800 pixels
,采用 synchronized(同步) SGD 法在 8个GPU
上进行训练,其中每个GPU上的每一个 mini-batch=2
,每幅图像中包括 512个RoIs
。设置 weight decay=0.0001,momentum=0.9,lr=0.02(60k mini-batches) & 0.002(next 20k)
。每张图像使用 2000 个 RoI 进行训练,1000 个用于测试。 在 COCO 数据集上使用 FPN 训练 Fast R-CNN 大约需要 10 个小时。此处省略一万字…
类似 DeepMask / Mask R-CNN,FPN 也是一个优良的图像分割提取掩码。下图中,应用 5 x 5 5x5 5x5 的滑窗于特征映射,以生成 14 x 14 14x14 14x14 的输出。之后,合并不同尺度的掩码以形成最终的掩码预测。
FPN自身并不是目标检测器,而是一个配合目标检测器使用的特征检测器。它可以有效地将不同尺度下的特征进行融合,构建一个特征金字塔,并实现该金字塔中的每一层都是具有较强语义信息和精确位置信息共存的特征图,改进了对小目标的检测,并在一定程度上解决了多尺度目标检测的问题。
[1] 【论文笔记】FPN —— 特征金字塔
[2] Feature Pyramid Networks for Object Detection 论文笔记
[3] Region of interest pooling expalined
[4] FPN(特征金字塔网络)的直觉、架构和表现简要介绍