PVT:金字塔 Vision Transformer 用于密集预测
FreeGuideOnline
最新
2026-06-21
输入图像 (H, W, 3) │ ▼ Stage 1: Patch Embedding (patch_size=4) ↓ 输出 H/4 × W/4, C1 Transformer Encoder × L1 │ ▼ Stage 2: Patch Embedding (patch_size=2) ← 空间尺寸减半 ↓ 输出 H/8 × W/8, C2 Transformer Encoder × L2 │ ▼ Stage 3: Patch Embedding (patch_size=2) ↓ 输出 H/16 × W/16, C3 Transformer Encoder × L3 │ ▼ Stage 4: Patch Embedding (patch_size=2) ↓ 输出 H/32 × W/32, C4 Transformer Encoder × L4
**特征金字塔输出**: `F1`, `F2`, `F3`, `F4` 分别具有 4×、8×、16×、32× 的下采样率,通道数逐步增加(典型值如 64, 128, 320, 512)。这些多尺度特征可直接送入 FPN 或其他检测/分割头。
---
## 核心组件详解
### 1. 金字塔结构的 Patch Embedding
传统的 ViT 使用单个大卷积(kernel=16, stride=16)直接将图像转换为 patch token。PVT 改用递进式下采样:
- Stage 1:卷积层 `kernel=7, stride=4, padding=2`,将图像转为 H/4 × W/4 的 token。
- Stage 2~4:使用 `kernel=3, stride=2, padding=1` 的卷积层,每次将分辨率减半。
这种渐进式下采样模仿 CNN 的金字塔构建方式,逐渐扩大感受野并增加通道数,同时在早期保留较多空间细节,有利于密集预测。
### 2. 空间归约注意力(Spatial-Reduction Attention, SRA)
自注意力最大的瓶颈在于 K 和 V 的 token 数量。SRA 的核心思想:**在计算注意力之前,先将 K 和 V 的 token 数量通过卷积进行空间归约**。
计算公式如下:
SRA(Q, K, V) = Concat(head_1, ..., head_h) W^O
head_i = Attention(Q W_i^Q, SR(K) W_i^K, SR(V) W_i^V)
其中 **SR(·)** 是空间归约操作:
SR(x) = Norm(Reshape(x, R_i) W^S)
操作步骤:
1. **Reshape**: 将输入序列重塑为空间形状 H_i × W_i。
2. **步长卷积**: 使用步长为 R_i 的卷积将分辨率降为原来的 1/R_i,同时调整通道。
3. **展平并 LayerNorm**: 恢复为序列形式并进行归一化。
不同阶段可使用不同的归约比例 R_i(如 Stage 2 用 R=2,Stage 3 用 R=5,Stage 4 用 R=8)。这种设计使得在高分辨率特征图上也能有效控制注意力计算开销:复杂度从 O(N²) 降至 O(N · N/R²)。
### 3. PVT v2 的改进:线性 SRA 与重叠 Patch Embedding
PVT v2 对原始 PVT 做了进一步优化,提升性能而不增加参数:
- **线性 SRA**:将自注意力中的 softmax 替换为简单的平均池化,形成**线性注意力**。这一改变进一步降低计算复杂度,且实验证明在大模型上效果更好。
- **重叠 Patch Embedding**:使用有重叠的卷积进行下采样,避免信息损失,更好地保留局部连续性。
- **前馈网络调整**:采用类似卷积的 depth-wise 卷积增强局部建模能力。
PVT v2 的高效性使其成为当时最流行的纯 Transformer 密集预测骨干之一。
---
## PVT 与 ViT、Swin Transformer 的对比
| 特性 | ViT | PVT | Swin Transformer |
|--------------------|----------------|--------------------|-----------------------|
| 特征金字塔 | ✘ 单尺度 | ✔ 4 尺度 | ✔ 4 尺度 |
| 注意力范围 | 全局 | 全局(经空间归约) | 局部窗口 + 移位 |
| 注意力计算复杂度 | O(N²) | O(N² / R²) | O(N · Window²) |
| 下采样方式 | 仅输入层大patch| 渐进式卷积下采样 | 补丁合并 |
| 纯 Transformer | ✔ | ✔ | ✔(无卷积) |
| 适合密集预测 | 需适配 | 原生支持 | 原生支持 |
PVT 最大特点是保留了**完整的全局注意力能力**,但通过空间归约解决了计算量问题。Swin Transformer 则使用局部窗口注意力并依赖移位操作建立跨窗口连接。两者最终都成功验证了Transformer骨干在密集任务上的有效性。
---
## 实验效果与典型应用
### 图像分类(ImageNet-1K)
以 PVT-Small 为例,同参数级别下与 ResNet-50 比较:
- ResNet-50:76.5% Top-1
- PVT-Small:79.8% Top-1
在参数和计算量相似的情况下,PVT 显著优于经典 CNN,证明全局注意力具有更强的特征表示能力。
### 目标检测与实例分割(COCO + RetinaNet / Mask R-CNN)
将 PVT 作为骨干直接替代 ResNet,使用相同检测头:
| 骨干 | RetinaNet (AP) | Mask R-CNN (box AP / mask AP) |
|----------------|----------------|-------------------------------|
| ResNet-50 | 36.3 | 38.0 / 34.6 |
| PVT-Small | 40.4 | 40.4 / 37.0 |
| PVT-Medium | 41.9 | 42.0 / 38.6 |
| PVT-Large | 42.6 | 42.9 / 39.5 |
在几乎不增加计算复杂度的情况下,PVT 大幅提升检测和分割精度,尤其在小目标和边缘细节上表现更优。
### 语义分割(ADE20K + Semantic FPN)
| 骨干 | mIoU |
|----------------|-------|
| ResNet-50 | 36.7 |
| PVT-Small | 39.8 |
| PVT-Large | 44.8 |
PVT 的全局语义建模能力和多尺度金字塔结构,完美契合语义分割对视场和细节的需求。
---
## 实战:使用 PVT 构建密集预测模型
### 在 MMDetection 中调用
```python
# 配置文件示例
backbone=dict(
type='PyramidVisionTransformer',
embed_dims=[64, 128, 320, 512],
num_heads=[1, 2, 5, 8],
mlp_ratios=[8, 8, 4, 4],
sr_ratios=[8, 4, 2, 1],
depths=[3, 4, 6, 3],
out_indices=(0, 1, 2, 3)),
neck=dict(type='FPN', ...)