FPN:Feature Pyramid Networks for Object Detection——用于目标检测的特征金字塔网络

FPN是一种经典的特征提取结构,用于在深度卷积神经网络(ConvNets)中构建特征金字塔,以提高多尺度目标检测的性能。主要内容包括:

  1. 背景与动机

    • 特征金字塔是识别系统中用于检测不同尺度目标的基本组件,但传统的特征化图像金字塔计算和内存密集。

    • 深度学习目标检测器通常避免使用金字塔表示,因为它们计算和内存密集。

  2. 方法

    • 利用深度卷积网络固有的多尺度、金字塔层次结构,以边际的额外成本构建特征金字塔。

    • 开发了一种自上而下的架构,通过横向连接来构建所有尺度的高级语义特征图。

    • 这种架构称为特征金字塔网络(FPN),在多个应用中作为通用特征提取器显示出显著的改进。

  3. 应用

    • 在区域提议网络(RPN)和Fast R-CNN中应用FPN,显著提高了目标检测的准确性。

    • 在COCO检测基准上,使用FPN的单模型结果超越了所有现有的单模型参赛作品,包括COCO 2016挑战赛的获胜者。

  4. 实验与结果

    • 在RPN中,FPN显著提高了平均召回率(AR)。

    • 在Fast R-CNN中,FPN提高了COCO风格的平均精度(AP)和PASCAL风格的AP。

    • 在Faster R-CNN中,FPN在没有增加测试时间的情况下提高了准确性。

  5. 扩展

    • 将FPN应用于分割提议生成,显著提高了实例分割的准确性和速度。

  6. 结论

    • FPN是一种简洁且高效的解决方案,适用于多尺度目标检测和其他应用。

    • 该方法展示了在不需要计算图像金字塔的情况下,如何利用网络内的特征金字塔来提高检测性能。

FPN显著提高了目标检测和分割的性能,同时保持了计算效率。这里主要是对经典论文的回顾学习,记录论文的阅读记录,感兴趣的话可以参考一下,如果需要阅读原文的话可以来这里,如下所示:

摘要

特征金字塔是识别系统中用于检测不同尺度目标的基本组件。但最近的深度学习目标检测器已经避免了金字塔表示,部分原因是它们计算和内存密集。在本文中,我们利用深度卷积网络固有的多尺度、金字塔层次结构,以边际的额外成本构建特征金字塔。我们开发了一种自上而下的架构,通过横向连接来构建所有尺度的高级语义特征图。这种架构称为特征金字塔网络(FPN),在多个应用中作为通用特征提取器显示出显著的改进。在基本的Faster R-CNN系统中使用FPN,我们的方法在COCO检测基准上实现了最先进的单模型结果,无需额外操作,超越了所有现有的单模型参赛作品,包括COCO 2016挑战赛的获胜者。此外,我们的方法可以在GPU上以6 FPS的速度运行,因此是多尺度目标检测的实用且准确的解决方案。代码将公开发布。

1 引言

在计算机视觉中,识别不同尺度的目标是基本的挑战。基于图像金字塔构建的特征金字塔(简称为特征化图像金字塔)构成了标准解决方案的基础[1](图1(a))。这些金字塔在尺度不变的意义上,目标的尺度变化通过在金字塔中的层次偏移来抵消。直观地说,这种属性使得模型能够通过在位置和金字塔层次上扫描模型来检测大范围内的目标。

图1. (a) 使用图像金字塔构建特征金字塔。特征在每个图像尺度上独立计算,这种方法速度慢。(b) 最近的目标检测系统选择仅使用单一尺度的特征进行更快的检测。(c) 另一种方法是重用ConvNet计算的金字塔特征层次结构,将其视为特征化图像金字塔。(d) 我们提出的特征金字塔网络(FPN)速度快,类似于(b)和(c),但更准确。在图中,特征图用蓝色轮廓表示,较粗的轮廓表示语义上更强的特征。

在手工设计特征的时代,特征化图像金字塔被广泛使用[5, 25]。它们在对象检测器如DPM[7]中非常关键,需要密集的尺度采样以获得良好的结果(例如,每倍频程10个尺度)。对于识别任务,手工设计的特征在很大程度上已被深度卷积网络(ConvNets)计算的特征所取代[19, 20]。除了能够表示更高层次的语义外,ConvNets对尺度变化也更加鲁棒,因此有助于从单一输入尺度计算的特征中进行识别[15, 11, 29](图1(b))。但即使有这种鲁棒性,金字塔仍然需要获得最准确的结果。所有最近的ImageNet[33]和COCO[21]检测挑战的顶级参赛作品都使用多尺度测试在特征化图像金字塔上进行(例如,[16, 35])。图像金字塔每个层次的特征化产生多尺度特征表示,其中所有层次在语义上都很强,包括高分辨率层次。

然而,图像金字塔每个层次的特征化有明显的局限性。推理时间显著增加(例如,增加四倍[11]),使得这种方法在实际应用中不切实际。此外,在图像金字塔上训练深度网络在内存方面是不可行的,因此,如果使用,图像金字塔仅在测试时使用[15, 11, 16, 35],这导致了训练/测试时推理的不一致性。由于这些原因,Fast和Faster R-CNN[11, 29]在默认设置下选择不使用特征化图像金字塔。

然而,图像金字塔并不是计算多尺度特征表示的唯一方法。深度ConvNet逐层计算特征层次结构,并通过子采样层,特征层次结构具有固有的多尺度、金字塔形状。这种网络内特征层次结构产生不同空间分辨率的特征图,但引入了由不同深度引起的大的语义差距。高分辨率图具有低级特征,这损害了其目标识别的表示能力。

单次检测器(SSD)[22]是尝试将ConvNet的金字塔特征层次结构用作特征化图像金字塔的首次尝试之一(图1(c))。理想情况下,SSD风格的金字塔将重用在正向传递中计算的不同层的特征图,因此成本为零。但为了避免使用低级特征,SSD放弃了重用已经计算的层,而是从网络的高层开始构建金字塔(例如,VGG网络的conv4_3[36]),然后通过添加新层来构建。因此,它错过了重用特征层次结构的高分辨率图的机会。我们表明,这些对于检测小目标很重要。

本文的目标是自然地利用ConvNet特征层次结构的金字塔形状,同时创建一个在所有尺度上都具有强语义的特征金字塔。为了实现这一目标,我们依赖于一种架构,通过自上而下的路径和横向连接,将低分辨率、语义强的特征与高分辨率、语义弱的特征结合起来(图1(d))。结果是一个在所有层次上都具有丰富语义的特征金字塔,并且从单一输入图像尺度快速构建。换句话说,我们展示了如何创建网络内特征金字塔,可以用来替代特征化图像金字塔,而不会牺牲表示能力、速度或内存。

采用自上而下和跳跃连接的类似架构在最近的研究中很流行[28, 17, 8, 26]。它们的目标是在精细分辨率的单个高层次特征图上生成预测(图2顶部)。相反,我们的方法利用该架构作为特征金字塔,在每个层次上独立进行预测(例如,目标检测)(图2底部)。我们的模型类似于特征化图像金字塔,这在这些工作中未被探索。

我们评估了我们的方法,称为特征金字塔网络(FPN),在各种检测和分割系统中[11, 29, 27]。无需额外操作,我们仅基于FPN和基本的Faster R-CNN检测器[29],在具有挑战性的COCO检测基准[21]上报告了最先进的单模型结果,超越了所有现有的经过大量工程设计的单模型参赛作品,包括竞赛获胜者。在消融实验中,我们发现对于边界框提案,FPN显著提高了平均召回率(AR)8.0个百分点;对于目标检测,它在COCO风格的平均精度(AP)上提高了2.3个百分点,在PASCAL风格的AP上提高了3.8个百分点,超过了基于ResNet的Faster R-CNN的强单尺度基线[16]。我们的方法也很容易扩展到掩码提案,并在依赖图像金字塔的最先进方法上提高了实例分割AR和速度。

图2. 顶部:一种带有跳跃连接的自上而下架构,预测在最佳层次上进行(例如,[28])。底部:我们的模型具有类似的结构,但将其作为特征金字塔利用,在所有层次上独立进行预测。

此外,我们的金字塔结构可以端到端训练所有尺度,并在训练/测试时一致使用,这在使用图像金字塔时是内存不可行的。因此,FPN能够实现比所有现有最先进方法更高的准确性。此外,这种改进在没有增加单尺度基线测试时间的情况下实现。我们相信这些进展将促进未来的研究和应用。我们的代码将公开发布。

2 相关工作

手工设计特征和早期神经网络。 SIFT特征[25]最初在尺度空间极值处提取,用于特征点匹配。HOG特征[5],以及后来的SIFT特征,在整个图像金字塔上密集计算。这些HOG和SIFT金字塔已在许多工作中用于图像分类、目标检测、人体姿态估计等。快速计算特征化图像金字塔也有显著的兴趣。Dollar等人[6]通过首先计算稀疏采样(在尺度上)的金字塔,然后插值缺失的层次,展示了快速金字塔计算。在HOG和SIFT之前,早期使用ConvNets进行人脸检测的工作[38, 32]在图像金字塔上计算浅层网络以跨尺度检测人脸。

深度ConvNet目标检测器。 随着现代深度ConvNets[19]的发展,目标检测器如OverFeat[34]和R-CNN[12]在准确性上取得了显著的改进。OverFeat采用了类似于早期神经网络人脸检测器的策略,通过在图像金字塔上应用ConvNet作为滑动窗口检测器。R-CNN采用了基于区域提议的策略[37],在用ConvNet分类之前,每个提议都进行了尺度归一化。SPPnet[15]表明,这种基于区域的检测器可以更高效地在单个图像尺度上提取的特征图上应用。最近更准确的目标检测方法如Fast R-CNN[11]和Faster R-CNN[29]主张使用从单个尺度计算的特征,因为它在准确性和速度之间提供了良好的权衡。然而,多尺度检测仍然表现更好,尤其是对于小目标。

使用多层的方法。 最近的一些方法通过使用ConvNet中的不同层来改进检测和分割。FCN[24]在多个尺度上对每个类别的部分分数求和以计算语义分割。Hypercolumns[13]对目标实例分割使用类似的方法。其他一些方法(HyperNet[18]、ParseNet[23]和ION[2])在计算预测之前连接多层的特征,这相当于对变换后的特征求和。SSD[22]和MS-CNN[3]在特征层次结构的多个层上预测目标,而不结合特征或分数。

最近有一些方法利用横向/跳跃连接来关联不同分辨率和语义层次的特征图,包括用于分割的U-Net[31]和SharpMask[28],用于人脸检测的Recombinator网络[17],以及用于关键点估计的堆叠沙漏网络[26]。Ghiasi等人[8]提出了用于FCN的拉普拉斯金字塔表示,以逐步细化分割。尽管这些方法采用了金字塔形状的架构,但它们与特征化图像金字塔[5, 7, 34]不同,其中预测在所有层次上独立进行,见图2。事实上,对于图2(顶部)中的金字塔架构,图像金字塔仍然需要跨多尺度识别目标[28]。

3 特征金字塔网络

我们的目标是利用ConvNet的金字塔特征层次结构,该层次结构从低到高具有语义,并构建一个在所有尺度上都具有高级语义的特征金字塔。由此产生的特征金字塔网络是通用的,在本文中我们专注于滑动窗口提议者(区域提议网络,简称RPN[29])和基于区域的目标检测器(Fast R-CNN[11])。我们还在第6节中将FPN推广到实例分割提议。

图3. 一个构建块,展示了横向连接和自上而下的路径,通过加法合并。

我们的方法以任意大小的单尺度图像作为输入,并以全卷积的方式输出多层次的成比例大小的特征图。此过程独立于主干卷积架构(例如,[19, 36, 16]),在本文中我们使用ResNet[16]展示结果。我们金字塔的构建涉及自下而上的路径、自上而下的路径和横向连接,如下所述。

自下而上的路径。 自下而上的路径是主干ConvNet的前馈计算,它计算由多个尺度的特征图组成的特征层次结构,缩放步长为2。通常有许多层产生相同大小的输出图,我们说这些层处于同一网络阶段。对于我们的特征金字塔,我们为每个阶段定义一个金字塔级别。我们选择每个阶段的最后一层的输出作为我们的特征图参考集,我们将丰富这些特征图以创建我们的金字塔。这种选择很自然,因为每个阶段的最深层应具有最强的特征。

具体来说,对于ResNet[16],我们使用每个阶段的最后一个残差块的输出特征激活。我们将这些最后残差块的输出表示为{C2, C3, C4, C5},对应于conv2、conv3、conv4和conv5的输出,并注意它们相对于输入图像的步长为{4, 8, 16, 32}像素。由于其内存占用较大,我们不将conv1包含在金字塔中。

自上而下的路径和横向连接。 自上而下的路径通过从更高的金字塔层次上采样空间上更粗糙但语义上更强的特征图来幻觉高分辨率特征。这些特征随后通过横向连接与自下而上的路径中的特征相结合。每个横向连接合并自下而上的路径和自上而下的路径中相同空间大小的特征图。自下而上的特征图具有较低层次的语义,但其激活更准确地定位,因为它被下采样的次数更少。

图3显示了构建我们的自上而下特征图的构建块。使用较粗糙分辨率的特征图,我们通过因子2对其进行上采样(为了简单起见,使用最近邻上采样)。然后通过逐元素加法将上采样的地图与相应的自下而上的地图合并(自下而上的地图经过1×1卷积层以减少通道维度)。此过程迭代进行,直到生成最佳分辨率的特征图。为了开始迭代,我们简单地在C5上附加一个1×1卷积层以生成最粗糙分辨率的特征图。最后,我们在每个合并的地图上附加一个3×3卷积以生成最终的特征图,这是为了减少上采样的混叠效应。最终的特征图集称为{P2, P3, P4, P5},对应于{C2, C3, C4, C5},分别具有相同的空间大小。

由于金字塔的所有层次都使用共享分类器/回归器,如传统的特征化图像金字塔,我们在所有特征图中固定特征维度(通道数,表示为d)。我们在本文中设置d=256,因此在所有附加层中都有256通道输出。在这些附加层中没有非线性,我们通过经验发现这对结果影响很小。

简洁性是我们设计的核心,我们发现我们的模型对许多设计选择都很鲁棒。我们已经尝试了更复杂的块(例如,使用多层残差块[16]作为连接),并观察到略微更好的结果。设计更好的连接模块不是本文的重点,因此我们选择了上述简单的架构。

4 应用

我们的方法是在深度ConvNets内部构建特征金字塔的通用解决方案。在以下内容中,我们在RPN[29]中采用我们的方法进行边界框提议生成,并在Fast R-CNN[11]中采用我们的方法进行目标检测。为了证明我们方法的简洁性和有效性,我们在将[29, 11]的原始系统适应我们的特征金字塔时进行了最小的修改。

用于RPN的特征金字塔网络

RPN[29]是一个滑动窗口类不可知的目标检测器。在原始的RPN设计中,在单尺度卷积特征图上密集评估一个小型子网络,执行目标/非目标二分类和边界框回归。这是通过一个3×3卷积层和两个并列的1×1卷积层来实现的,我们称之为网络头。目标/非目标标准和边界框回归目标是相对于一组称为锚点的参考框定义的[29]。锚点具有多个预定义的尺度和宽高比,以覆盖不同形状的目标。

我们通过将单尺度特征图替换为我们的FPN来适应RPN。我们在我们的特征金字塔的每个层次上附加一个相同设计的头(3×3 conv和两个并列的1×1 convs)。因为头在所有金字塔层次的所有位置上密集滑动,所以在特定层次上不需要多尺度锚点。相反,我们将单一尺度的锚点分配给每个层次。正式地,我们将锚点定义为在{P2, P3, P4, P5, P6}上分别具有{322, 642, 1282, 2562, 5122}像素的面积。1 与[29]一样,我们在每个层次上使用多个宽高比{1:2, 1:1, 2:1}的锚点。因此,金字塔上总共有15个锚点。

Footnote 1: 这里我们引入P6仅用于覆盖更大的锚点尺度5122。P6只是P5的两倍下采样。P5在下一节的Fast R-CNN检测器中不被使用。

我们根据锚点与真实边界框的交并比(IoU)比率为其分配训练标签,如[29]。正式地,如果锚点对于给定的真实框具有最高的IoU或与任何真实框的IoU超过0.7,则分配一个正标签;如果与所有真实框的IoU低于0.3,则分配一个负标签。请注意,真实框的尺度不明确用于将其分配给金字塔的层次;相反,真实框与锚点关联,锚点已被分配给金字塔层次。因此,我们除了[29]中的规则外,没有引入额外的规则。

我们注意到头的参数在所有特征金字塔层次上共享;我们还评估了不共享参数的替代方案,并观察到类似的准确性。共享参数的良好性能表明,我们金字塔的所有层次共享相似的语义层次。这种优势类似于使用特征化图像金字塔的优势,其中常见的头部分类器可以应用于在任何图像尺度上计算的特征。

通过上述适应,RPN可以自然地使用我们的FPN进行训练和测试,方式与[29]中相同。我们在实验中详细说明了实现细节。

用于Fast R-CNN的特征金字塔网络

Fast R-CNN[11]是一个基于区域的目标检测器,其中使用感兴趣区域(RoI)池化来提取特征。Fast R-CNN最常在单尺度特征图上执行。为了将其与我们的FPN一起使用,我们需要将不同尺度的RoI分配给金字塔层次。

我们将我们的特征金字塔视为从图像金字塔生成的。因此,我们可以适应基于区域的检测器[15, 11]在图像金字塔上运行时的分配策略。正式地,我们通过以下方式将宽度为w和高度为h(在网络的输入图像上)的RoI分配给我们的特征金字塔的层次Pk:

这里224是ImageNet预训练的标准大小,k0是RoI的w×h=2242时应映射到的目标层次。类似于基于ResNet的Faster R-CNN系统[16]使用C4作为单尺度特征图,我们将k0设置为4。直观地说,方程(1)意味着如果RoI的尺度变小(例如,224的1/2),它应该映射到更精细分辨率的层次(例如,k=3)。

我们在所有RoI的所有层次上附加预测器头(在Fast R-CNN中,头是特定类别的分类器和边界框回归器)。所有头共享参数,无论其层次如何。在[16]中,ResNet的conv5层(一个9层深的子网络)被采用为C4特征上的头,但我们的方法已经利用conv5来构建特征金字塔。因此,与[16]不同,我们简单地采用RoI池化来提取7×7特征,并在最终分类和边界框回归层之前附加两个隐藏的1024维全连接(fc)层(每个层后跟ReLU)。这些层是随机初始化的,因为ResNets中没有预训练的fc层可用。请注意,与标准的conv5头相比,我们的2-fc MLP头更轻量且更快。

基于这些适应,我们可以在特征金字塔上训练和测试Fast R-CNN。实现细节在实验部分给出。

5 目标检测实验

我们在80类COCO检测数据集[21]上进行实验。我们使用80k训练图像和35k验证图像子集(trainval35k[2])的联合进行训练,并在5k验证图像子集(minival)上报告消融实验。我们还报告了标准测试集(test-std)[21]的最终结果,该测试集没有公开标签。

按照常见做法[12],所有主干网络都在ImageNet1k分类数据集[33]上预训练,然后在检测数据集上进行微调。我们使用公开可用的预训练ResNet-50和ResNet-101模型。2 我们的代码是使用Caffe2重新实现的py-faster-rcnn。3

Footnote 2: https://github.com/kaiminghe/deep-residual-networks

Footnote 3: https://github.com/rbgirshick/py-faster-rcnn

使用RPN进行区域提议

我们按照[21]中的定义评估COCO风格的平均召回率(AR)和AR在小、中和大目标上的表现(ARs、ARm和ARl)。我们报告每张图像100和1000个提议的结果(AR100和AR1k)。

实现细节。 表1中的所有架构都是端到端训练的。输入图像被调整大小,使其较短边有800像素。我们采用8个GPU上的同步SGD训练。每个小批量涉及每个GPU上的2张图像和每张图像上的256个锚点。我们使用0.0001的权重衰减和0.9的动量。学习率在前30k小批量中为0.02,在接下来的10k小批量中为0.002。对于所有RPN实验(包括基线),我们在训练中包括图像外的锚点,这与[29]不同,[29]忽略了这些锚点。其他实现细节如[29]。在COCO上使用FPN训练RPN大约需要8小时。

表1. 使用RPN [29]的边界框提议结果,在COCO minival集上评估。所有模型都在trainval35k上训练。列“lateral”和“top-down”分别表示横向和自上而下连接的存在。列“feature”表示头附加的特征图。所有结果基于ResNet-50,并共享相同的超参数。

表2. 使用Fast R-CNN [11]在固定提议集(RPN, {Pk}, 表1(c))上的目标检测结果,在COCO minival集上评估。模型在trainval35k集上训练。所有结果基于ResNet-50,并共享相同的超参数。

表3. 使用Faster R-CNN [29]在COCO minival集上评估的目标检测结果。RPN的主干网络与Fast R-CNN一致。模型在trainval35k集上训练,并使用ResNet-50。† 由[16]的作者提供。

5.1.1 消融实验

与基线的比较。 为了与原始RPN进行公平比较,我们使用C4(与[16]相同)或C5的单尺度图运行两个基线(表1(a, b)),两者都使用与我们相同的超参数,包括使用5个尺度的锚点{322, 642, 1282, 2562, 5122}。表1(b)显示没有优于(a),表明单个更高层次的特征图是不够的,因为在较粗的分辨率和较强的语义之间存在权衡。

在RPN中放置FPN将AR1k提高到56.3(表1(c)),比单尺度RPN基线(表1(a))提高了8.0个百分点。此外,小目标的性能(AR1ks)大幅提升了12.9个百分点。我们的金字塔表示大大提高了RPN对目标尺度变化的鲁棒性。

自上而下的丰富有多重要? 表1(d)显示了我们特征金字塔在没有自上而下路径的情况下的结果。通过这种修改,1×1横向连接和3×3卷积被附加到自下而上的金字塔上。这种架构模拟了重用金字塔特征层次结构的效果(图1(b))。

表1(d)中的结果与RPN基线相当,并且远远落后于我们的结果。我们推测这是因为自下而上的金字塔(图1(b))在不同层次之间存在较大的语义差距,尤其是对于非常深的ResNets。我们还评估了表1(d)的一个变体,不共享头的参数,但观察到类似的性能下降。这个问题不能简单地通过特定层次的头来解决。

横向连接有多重要? 表1(e)显示了没有1×1横向连接的自上而下特征金字塔的消融结果。这个自上而下的金字塔具有强的语义特征和精细的分辨率。但我们认为这些特征的位置并不精确,因为这些地图已经被下采样和上采样多次。更精确的特征位置可以通过横向连接直接从自下而上的地图的更精细层次传递到自上而下的地图。因此,FPN的AR1k分数比表1(e)高10个百分点。

金字塔表示有多重要? 不采用金字塔表示,一种方法是将头附加到P2的最高分辨率、强语义特征图上(即我们金字塔中最精细的层次)。类似于单尺度基线,我们将所有锚点分配给P2特征图。这种变体(表1(f))优于基线,但不如我们的方法。RPN是一个具有固定窗口大小的滑动窗口检测器,因此在金字塔层次上扫描可以增加其对尺度变化的鲁棒性。

此外,我们注意到使用P2本身会导致更多的锚点(750k,表1(f)),这是由于其较大的空间分辨率造成的。这一结果表明,大量的锚点本身不足以提高准确性。

使用Fast/Faster R-CNN进行目标检测

接下来,我们研究基于区域(非滑动窗口)的检测器。我们通过COCO风格的平均精度(AP)和PASCAL风格的AP(在单个IoU阈值0.5处)评估目标检测。我们还按照[21]中的定义报告小、中和大目标的COCO AP(即APs、APm和APl)。

表4. COCO检测基准上单模型结果的比较。一些结果在test-std集上不可用,因此我们还包括了test-dev结果(以及Multipath [40]在minival上的结果)。†: http://image-net.org/challenges/talks/2016/GRMI-COCO-slidedeck.pdf。‡http://mscoco.org/dataset/#detections-leaderboard。§: 此AttractioNet [10]条目采用VGG-16进行提议,Wide ResNet [39]进行目标检测,因此不是严格意义上的单模型结果。

实现细节。 输入图像被调整大小,使其较短边有800像素。在8个GPU上使用同步SGD进行模型训练。每个小批量涉及每个GPU上的2张图像和每张图像上的512个RoI。我们使用0.0001的权重衰减和0.9的动量。学习率在前60k小批量中为0.02,在接下来的20k小批量中为0.002。我们使用每张图像2000个RoI进行训练,1000个用于测试。使用FPN训练Fast R-CNN在COCO数据集上大约需要10小时。

5.2.1 Fast R-CNN(在固定提议上)

为了更好地研究FPN对基于区域的检测器的影响,我们在一组固定的提议上进行Fast R-CNN的消融实验。我们选择冻结RPN在FPN上计算的提议(表1(c)),因为它在小型目标上具有良好的性能,这些目标是检测器要识别的目标。为了简单起见,我们不在Fast R-CNN和RPN之间共享特征,除非指定。

作为基于ResNet的Fast R-CNN基线,按照[16],我们采用输出大小为14×14的RoI池化,并附加所有conv5层作为头的隐藏层。这给出了表2(a)中的31.9 AP。表2(b)是一个采用2个隐藏fc层的MLP头的基线,类似于我们架构中的头。它获得了28.8 AP,表明2-fc头没有给我们任何相对于表2(a)中基线的正交优势。

表2(c)显示了我们在Fast R-CNN中的FPN结果。与表2(a)中的基线相比,我们的方法将AP提高了2.0个百分点,小目标AP提高了2.1个百分点。与也采用2-fc头的基线相比(表2(b)),我们的方法将AP提高了5.1个百分点。5 这些比较表明,对于基于区域的目标检测器,我们的特征金字塔优于单尺度特征。

Footnote 5: 我们期望更强的头架构[30]将进一步改进我们的结果,但这不是本文的重点。

表2(d)和(e)显示了在没有自上而下连接或没有横向连接的情况下的消融结果,类似于我们在RPN小节中观察到的,分别去除自上而下连接或去除横向连接会导致较差的结果。这表明Fast R-CNN在使用高分辨率地图时也遭受使用低级特征的困扰。

在表2(f)中,我们采用Fast R-CNN在单一最佳尺度特征图P2上。它的结果(33.4 AP)略低于使用所有金字塔层次的结果(33.9 AP,表2(c))。我们推测这是因为RoI池化是一种扭曲类操作,对区域尺度不那么敏感。尽管这一变体具有良好的准确性,但它基于{Pk}的RPN提议,并且已经从金字塔表示中受益。

5.2.2 Faster R-CNN(在一致提议上)

在上文中,我们使用固定的一组提议来研究检测器。但在Faster R-CNN系统[29]中,RPN和Fast R-CNN必须使用相同的骨干网络,以便进行特征共享。表3显示了与两个基线的比较,所有这些基线都使用一致的骨干网络架构进行RPN和Fast R-CNN。表3(a)显示了我们重新实现的Faster R-CNN基线系统,如[16]中所述。在受控设置下,我们的FPN(表3(c))比这个强基线好2.3个AP点和3.8个AP@0.5点。

表5. 使用Faster R-CNN和我们的FPNs进行更多目标检测结果,在minival上评估。共享特征使训练时间增加1.5倍(使用4步训练[29]),但减少测试时间。

请注意,表3(a)和(b)是比He等人提供的基线更强的基线。我们发现以下实现有助于缩小差距:(i)我们使用800像素的图像尺度,而不是[11, 16]中的600像素;(ii)我们训练每张图像512个RoI,加速收敛,而[11, 16]中每张图像64个RoI;(iii)我们使用5个尺度的锚点,而不是[16]中的4个(添加322);(iv)在测试时,我们使用每张图像1000个提议,而不是[16]中的300个。因此,与He等人的ResNet-50 Faster R-CNN基线在表3(*)中相比,我们的方法将AP提高了7.6个点,AP@0.5提高了9.6个点。

共享特征。 在上文中,为了简单起见,我们不共享RPN和Fast R-CNN之间的特征。在表5中,我们按照[29]中描述的4步训练评估共享特征。与[29]类似,我们发现共享特征略微提高了准确性。特征共享还减少了测试时间。

运行时间。 通过特征共享,我们的基于FPN的Faster R-CNN系统在单个NVIDIA M40 GPU上对ResNet-50的推理时间为每张图像0.148秒,对ResNet-101的推理时间为0.172秒。6 作为比较,表3(a)中的单尺度ResNet-50基线运行时间为每张图像0.32秒。我们的方法通过FPN中的额外层引入了较小的额外成本,但具有更轻量级的头。总体而言,我们的系统比基于ResNet的Faster R-CNN对应系统更快。我们相信我们方法的效率和简洁性将有利于未来的研究和应用。

Footnote 6: 这些运行时间是从本文早期版本中更新的。

5.2.3 与COCO竞赛获胜者的比较

我们发现表5中的ResNet-101模型在默认学习率计划下没有得到充分训练。因此,我们在训练Fast R-CNN步骤时将每个学习率的小批量数增加2倍。这将在minival上将AP增加到35.6。这个模型是我们提交给COCO检测排行榜的模型,如表4所示。由于时间有限,我们没有评估其特征共享版本,这应该略好一些,如表5所示。

图4. 用于目标分割提议的FPN。特征金字塔的构建结构与目标检测相同。我们在5×5窗口上应用一个小型MLP,生成输出维度为14×14的密集目标分割。橙色显示了每个金字塔层次上掩码对应的图像区域大小(此处显示了P3−5层次)。对应的图像区域大小(浅橙色)和规范目标大小(深橙色)均显示。半倍频程由7×7窗口上的MLP处理(7 ≈ 5√2),此处未显示。详细信息在附录中。

表4将我们的方法与COCO竞赛获胜者的单模型结果进行了比较,包括2016年获胜者G-RMI和2015年获胜者Faster R-CNN+++。我们的单模型条目在没有添加额外操作的情况下,超越了这些强大的、经过大量工程设计的竞争对手。

在test-dev集上,我们的方法比现有最佳结果提高了0.5个AP点(36.2 vs. 35.7)和3.4个AP@0.5点(59.1 vs. 55.7)。值得注意的是,我们的方法不依赖图像金字塔,只使用单一输入图像尺度,但在小尺度目标上仍然具有出色的AP。这只能通过高分辨率图像输入实现以前的方法。

此外,我们的方法不利用许多流行的改进,如迭代回归[9]、硬负样本挖掘[35]、上下文建模[16]、更强的数据增强[22]等。这些改进是对FPN的补充,应该会进一步提高准确性。

最近,FPN在COCO竞赛的所有赛道中都实现了新的最佳结果,包括检测、实例分割和关键点估计。详情请参见[14]。

6 扩展:分割提议

我们的方法是一种通用的金字塔表示,可以用于目标检测以外的应用。在本节中,我们使用FPNs生成分割提议,采用DeepMask/SharpMask框架[27, 28]。

DeepMask/SharpMask在图像裁剪上进行训练,以预测实例分割和目标/非目标分数。在推理时,这些模型以卷积方式运行,以在图像上生成密集的提议。为了在多尺度上生成分割,图像金字塔是必要的[27, 28]。

表6. 在COCO val图像的前5k张上评估的实例分割提议。所有模型都在训练集上训练。DeepMask、SharpMask和FPN使用ResNet-50,而InstanceFCN使用VGG-16。DeepMask和SharpMask的性能使用从https://github.com/facebookresearch/deepmask获得的模型计算(两者都是“zoom”变体)。†运行时间在NVIDIA M40 GPU上测量,除了InstanceFCN的计时基于较慢的K40。

很容易适应FPN生成掩码提议。我们为训练和推理使用全卷积设置。我们按照第5.1节中的描述构建特征金字塔,并设置d=128。在特征金字塔的每个层次上,我们应用一个小型5×5 MLP,以全卷积的方式预测14×14掩码和目标分数,见图4。此外,受[27, 28]中每倍频程使用2个尺度的图像金字塔的启发,我们使用第二个输入大小为7×7的MLP来处理半倍频程。这两个MLP在RPN中扮演类似锚点的角色。该架构是端到端训练的;完整的实现细节在附录中给出。

分割提议结果

结果如表6所示。我们报告了1000个提议的分割AR和分割AR在小、中和大目标上的表现。我们的单个5×5 MLP基线FPN模型实现了43.4 AR。切换到稍大的7×7 MLP,准确性基本保持不变。同时使用两个MLP将准确性提高到45.7 AR。将掩码输出大小从14×14增加到28×28,AR再增加1个点(更大尺寸开始降低准确性)。最后,将训练迭代次数增加一倍,AR增加到48.1。

我们还报告了与DeepMask[27]、SharpMask[28]和InstanceFCN[4]的比较,这些是以前最先进的掩码提议生成方法。我们在准确性上比这些方法提高了8.3个AR点。特别是,我们在小目标上的准确性几乎翻了一番。

现有的掩码提议方法[27, 28, 4]基于密集采样的图像金字塔(例如,[27, 28]中按2{-2:0.5:1}缩放),使其计算成本高昂。我们的基于FPN的方法显著更快(我们的模型在6到7 FPS之间运行)。这些结果表明,我们的模型是一种通用的特征提取器,可以替代图像金字塔用于其他多尺度检测问题。

7 结论

我们提出了一种简洁且简单的框架,用于在ConvNets内部构建特征金字塔。我们的方法显示出比几个强基线和竞赛获胜者显著的改进。因此,它为特征金字塔的研究和应用提供了一个实用的解决方案,无需计算图像金字塔。最后,我们的研究表明,尽管深度ConvNets具有强大的表示能力和对尺度变化的隐式鲁棒性,但使用金字塔表示显式解决多尺度问题仍然是关键的。

附录A 分割提议的实现

我们使用特征金字塔网络高效地生成目标分割提议,采用图像中心训练策略,这在目标检测中很流行[11, 29]。我们的FPN掩码生成模型继承了DeepMask/SharpMask[27, 28]的许多思想和动机。然而,与这些模型不同,这些模型在图像裁剪上进行训练,并在推理时使用密集采样的图像金字塔,我们进行全卷积训练,以在特征金字塔上进行掩码预测。虽然这需要改变许多具体细节,但我们的实现仍然与DeepMask的精神相似。具体来说,为了定义每个滑动窗口的掩码实例标签,我们将此窗口视为输入图像的裁剪,使我们能够继承DeepMask的正/负定义。我们给出更多细节,见图4的可视化。

我们使用P2-6构建特征金字塔,使用与第5.1节中描述的相同架构。我们设置d=128。我们金字塔的每个层次用于预测不同尺度的掩码。与DeepMask一样,我们将掩码的尺度定义为其宽度和高度的最大值。具有{32, 64, 128, 256, 512}像素尺度的掩码分别映射到{P2, P3, P4, P5, P6},并由5×5 MLP处理。由于DeepMask使用每倍频程2个尺度的金字塔,我们使用第二个稍大的7×7 MLP(7≈5√2)来处理半倍频程(例如,128√2尺度的掩码由P4上的7×7 MLP预测)。中间尺度的目标映射到对数空间中最接近的尺度。

由于MLP必须在每个金字塔层次上预测一系列尺度的目标(特别是半倍频程范围),因此必须在规范目标大小周围进行一些填充。我们使用25%的填充。这意味着掩码输出在{P2, P3, P4, P5, P6}上分别映射到{40, 80, 160, 320, 640}大小的图像区域(对于7×7 MLP,对应大小为√2倍)。

特征图中的每个空间位置用于预测不同位置的掩码。具体来说,在尺度Pk上,特征图中的每个空间位置用于预测掩码,其中心落在该位置的2k像素内(对应于特征图中的±1单元偏移)。如果没有目标中心落在此范围内,则该位置被视为负样本,并且如在DeepMask中一样,仅用于训练分数分支,而不用于掩码分支。

我们用于预测掩码和分数的MLP相当简单。我们应用一个5×5核,输出512个通道,然后是并列的全连接层,以预测14×14掩码(142个输出)和目标分数(1个输出)。该模型以全卷积方式实现(使用1×1卷积代替全连接层)。处理半倍频程尺度的7×7 MLP与5×5 MLP相同,只是其输入区域更大。

在训练期间,我们每个小批量随机采样2048个样本(每张图像128个样本,来自16张图像),正/负采样比为1:3。掩码损失的权重是分数损失的10倍。该模型在8个GPU上使用同步SGD进行端到端训练(每个GPU2张图像)。我们从0.03的学习率开始,训练80k小批量,在60k小批量后将学习率除以10。图像尺度在训练和测试时设置为800像素(我们不使用尺度抖动)。在推理时,我们的全卷积模型在所有位置和尺度上预测分数,并在得分最高的1000个位置上预测掩码。我们不进行非最大抑制或后处理。

### FPN 特征金字塔网络代码实现 #### 使用 PyTorch 实现 FPN 的主要部分如下: ```python import torch import torch.nn as nn import torch.nn.functional as F class FPN(nn.Module): def __init__(in_channels_list, out_channels): super(FPN, self).__init__() # 定义卷积层来调整通道数至统一的out_channels self.lateral_convs = nn.ModuleList() self.fpn_convs = nn.ModuleList() for i in range(len(in_channels_list)): lateral_conv = nn.Conv2d(in_channels_list[i], out_channels, kernel_size=1) fpn_conv = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1) self.lateral_convs.append(lateral_conv) self.fpn_convs.append(fpn_conv) def forward(self, inputs): assert len(inputs) == len(self.lateral_convs), "输入数量应等于横向卷积的数量" # 获取最顶层特征图并处理 last_inner = self.lateral_convs[-1]) results = [] results.append(self.fpn_convs[-1](last_inner)) # 自顶向下路径构建其他层级特征图 for feature, lateral_conv, fpn_conv in zip( reversed(inputs[:-1]), reversed(self.lateral_convs[:-1]), reversed(self.fpn_convs[:-1])): top_down_feature = F.interpolate(last_inner, scale_factor=2, mode='nearest') inner_lateral = lateral_conv(feature) last_inner = inner_lateral + top_down_feature results.insert(0, fpn_conv(last_inner)) return tuple(results) if __name__ == "__main__": model = FPN([256, 512, 1024, 2048], 256).cuda() # 假设backbone输出四个阶段,分别为C2,C3,C4,C5 C2 = torch.rand((1, 256, 256, 256)).cuda() C3 = torch.rand((1, 512, 128, 128)).cuda() C4 = torch.rand((1, 1024, 64, 64)).cuda() C5 = torch.rand((1, 2048, 32, 32)).cuda() P2, P3, P4, P5 = model([C2, C3, C4, C5]) # 得到增强后的多尺度特征图P2-P5 ``` 此段代码展示了如何基于给定的不同层次的基础特征图(`C2`, `C3`, `C4`, 和 `C5`),通过一系列的操作生成新的具有更强表达能力的特征图(`P2`, `P3`, `P4`, 和 `P5`)。这些新产生的特征图可以在后续的任务中被利用起来,比如目标检测中的候选框生成或是分类预测等[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Together_CZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值