### Feature Pyramid Network (FPN) 结构图解释
#### FPN 的核心概念
Feature Pyramid Network (FPN)[^1]是一种用于目标检测的特征提取架构,旨在解决多尺度目标检测问题。它通过构建特征金字塔来增强模型对不同尺寸目标的检测能力[^2]。
#### FPN 的结构组成
FPN 的网络结构主要包括两个部分:自底向上(Bottom-Up)路径和自顶向下(Top-Down)路径[^3]。
- **自底向上路径**:这是基于传统卷积神经网络(如 ResNet)的标准前向传播过程,负责生成多层次的特征图。每层特征图都包含了不同的空间分辨率和语义信息。
- **自顶向下路径**:这一路径通过上采样操作将高层次的语义信息传递到低层次,并通过横向连接与对应的低层特征图进行融合。这种设计使得低层特征图不仅保留了丰富的空间细节,还获得了更强的语义表达能力。
#### 特征图融合机制
在 FPN 中,特征图的融合是一个关键步骤。具体来说,高层特征图经过上采样后与对应低层特征图按元素相加,形成新的特征图。这个过程可以重复多次,最终生成一系列具有相同通道数但不同分辨率的特征图[^5]。这些特征图随后被送入区域提议网络(Region Proposal Network, RPN)或其他检测模块中,用于生成不同尺度的目标建议框(proposals)[^4]。
以下是 FPN 的典型结构图及其组成部分:

#### 图解说明
1. **输入图像**:原始输入图像进入骨干网络(Backbone Network),通常为预训练好的 CNN 模型(如 ResNet 或 VGG)。
2. **C 层次**:骨干网络输出多个中间特征图(记作 C2、C3、C4 和 C5),分别代表不同尺度的特征。
3. **P 层次生成**:
- P5 由 C5 经过 1×1 卷积降维生成;
- P4 由 P5 上采样并与 C4 融合生成;
- 同理依次生成 P3 和 P2。
4. **额外层**:为了覆盖更大的感受野,还可以从 P5 再生成更高一层的特征图 P6 和 P7[^4]。
#### 锚点设置
在 FPN 的每一层(P2 至 P6),都会定义一组锚点(anchors)。这些锚点的大小分别为 \(32^2\)、\(64^2\)、\(128^2\)、\(256^2\) 和 \(512^2\),并且每个规模下有三种比例(1:2、1:1、2:1)。这样总共形成了 15 种可能的 anchor 配置[^4]。
---
```python
import torch.nn as nn
class FPN(nn.Module):
def __init__(self, in_channels_list, out_channels=256):
super(FPN, self).__init__()
# 定义 lateral layers 将各层 channel 数调整一致
self.lateral_layer1 = nn.Conv2d(in_channels_list[0], out_channels, kernel_size=1)
self.lateral_layer2 = nn.Conv2d(in_channels_list[1], out_channels, kernel_size=1)
self.lateral_layer3 = nn.Conv2d(in_channels_list[2], out_channels, kernel_size=1)
# 定义 top-down pathway 的 conv layers
self.topdown_block1 = nn.ConvTranspose2d(out_channels, out_channels, kernel_size=2, stride=2)
self.topdown_block2 = nn.ConvTranspose2d(out_channels, out_channels, kernel_size=2, stride=2)
def forward(self, c2, c3, c4):
p4 = self.lateral_layer3(c4)
p3 = self._upsample_add(p4, self.lateral_layer2(c3))
p2 = self._upsample_add(p3, self.lateral_layer1(c2))
return [p2, p3, p4]
def _upsample_add(self, x, y):
_,_,H,W = y.size()
return nn.functional.interpolate(x, size=(H,W), mode='bilinear') + y
```
---