Feature Pyramid Network (FPN)
特征金字塔网络(FPN)将深层语义特征与精细的高分辨率特征融合,让检测器能同时发现大物体和小物体。
特征金字塔网络(FPN)是一种颈部架构,可将骨干网络的多分辨率特征图转换为金字塔结构,使每个层级都包含丰富的语义信息,并对应一定范围的物体尺寸。该架构由 Facebook AI Research 在论文 Feature Pyramid Networks for Object Detection(CVPR 2017)中提出。它在标准卷积神经网络(CNN)中加入自顶向下路径和横向连接,让模型能够在高分辨率层级检测小物体,同时保留深层对物体外观的认知。在大多数现代目标检测架构和实例分割模型中,FPN 及其衍生架构都位于骨干网络与检测头之间。
为什么检测器需要多尺度特征#
CNN 骨干网络越深入,下采样程度越高,因此最后一张特征图语义信息丰富,但分辨率较粗:在步幅为 32 时,一个 20 像素大小的物体在网格上占不到一个单元。早期特征图保留了精细的空间细节,主要对边缘和纹理产生响应。在 FPN 出现之前,检测器有三种选择,但各有代价。在多个尺度上对图像金字塔运行网络,精度高,但速度会慢好几倍。像原版 Faster R-CNN 那样只根据最后一张特征图预测,速度快,但对小物体的检测效果较弱。像 SSD 那样根据骨干网络的多个阶段进行预测,会从网络较深处开始,以避开较弱的低层特征,因此会错过小物体所需的高分辨率特征图。FPN 通过单次前向传播实现了图像金字塔的多尺度覆盖;采用 FPN 的 Faster R-CNN 在 COCO 检测任务上创下单模型的新纪录,同时在 GPU 上达到每秒 5 帧。
FPN 的工作原理#
FPN 分三步构建金字塔:
- 自底向上路径: 骨干网络的常规前向传播。在 ResNet 中,FPN 会取每个阶段的最后一张特征图,分别标记为 C2 到 C5,对应步幅 4、8、16 和 32。
- 自顶向下路径: 从最粗糙的层级开始,使用最近邻插值将每张特征图放大 2 倍,把高层语义信息传递到更精细的层级。
- 横向连接: 使用 1×1 卷积将每张骨干网络特征图转换为统一的 256 通道宽度,再将结果与上一级放大后的特征图逐元素相加,并使用 3×3 卷积平滑求和结果,以减少上采样伪影。输出 P2 到 P5 均有 256 个通道,因此一个共享权重的预测头即可处理所有层级。
Torchvision 自带现成的 FeaturePyramidNetwork 模块,可接收按顺序排列的字典形式的骨干网络特征图。
from collections import OrderedDict
import torch
from torchvision.ops import FeaturePyramidNetwork
# 640x640 图像在步幅 8、16 和 32 处的骨干网络输出(ResNet-50 通道数)
features = OrderedDict(
c3=torch.randn(1, 512, 80, 80),
c4=torch.randn(1, 1024, 40, 40),
c5=torch.randn(1, 2048, 20, 20),
)
# 横向 1x1 卷积加上自顶向下路径,使每个层级都具有相同的 256 个通道
fpn = FeaturePyramidNetwork(in_channels_list=[512, 1024, 2048], out_channels=256)
pyramid = fpn(features)
for name, level in pyramid.items():
print(name, tuple(level.shape))它会打印 c3 (1, 256, 80, 80)、c4 (1, 256, 40, 40) 和 c5 (1, 256, 20, 20):每个层级都保留了自己的空间尺寸,而现在三者的通道宽度也相同,因此一个预测头就能处理所有尺度。
应用场景#
- 航空和卫星影像: 在卫星图像分析和无人机影像中,车辆、人员和建筑物往往只有几个像素大小,因此检测器会依赖金字塔中的步幅 4 和步幅 8 层级。
- 实例分割: 在 Detectron2 中提供的 Mask R-CNN 会根据区域大小将其分配到金字塔的相应层级,然后预测边界框和掩码。
- 全景分割: Panoptic FPN 在同一个金字塔上增加语义分割分支,为道路、天空等不可计数区域以及可计数物体标注类别。
- 自动驾驶车辆: 单张相机画面中,既可能有占据半幅图像的近处卡车,也可能有只有几像素高的远处行人和交通信号灯。
FPN 与 PANet、BiFPN 及其他颈部架构的比较#
FPN 的自顶向下路径开创了一系列颈部架构,它们改变了层级之间的信息流动方式:
- PANet: 在 FPN 的自顶向下路径之后增加一条自底向上路径,缩短从精细且定位准确的特征到高层级的传递路径。PANet 在 COCO 2017 实例分割挑战赛中获得第一名。
- BiFPN: EfficientDet 的颈部架构会多次重复自顶向下和自底向上的特征融合,移除只有一个输入的节点,并为融合的每个输入学习一个权重。
- NAS-FPN: 通过神经架构搜索找到的一种金字塔布局,并会重复堆叠多次。
- U-Net: 同样通过跳跃连接融合粗略和精细特征,然后在完整分辨率下进行一次预测,因此更适合逐像素分割,而非多尺度检测。
YOLO26 使用通过拼接融合层级的 FPN 加 PAN 颈部架构:两次上采样将步幅 32 的上下文信息传递到步幅 8 层级,两次步幅卷积则将细节传回高层级,而检测头会根据步幅分别为 8、16 和 32 的 P3、P4 和 P5 进行预测。其 yolo26-p2.yaml 变体通过步幅 4 的 P2 层级扩展金字塔,以处理极小物体,这会使 YOLO26n 的未融合计算量从 6.1 增至 9.5 GFLOPs。










