09 PVT 论文:Pyramid Vision Transformer: A Versatile Backbone for Dense Prediction without Convolution
前言
前面一章我们讨论了一个问题:原始 ViT 为什么不适合直接做目标检测和语义分割?
核心原因是,原始 ViT 主要是为图像分类设计的。它通常把图像切成固定大小的 patch,然后在一个固定长度的 token 序列上堆叠 Transformer Encoder,最后使用 class token 完成分类。这种结构对于图像分类是合理的,但对于目标检测、实例分割、语义分割这类 密集预测任务 并不天然适配。密集预测任务通常需要:
1. 高分辨率特征;
2. 多尺度特征;
3. 局部细节;
4. 全局上下文;
5. 能够直接接入 FPN、RetinaNet、Mask R-CNN、Semantic FPN 等框架。
原始 ViT 的问题在于:输出通常是单尺度、低分辨率 token,而且全局 self-attention 在高分辨率输入下计算代价很高。PVT,也就是 Pyramid Vision Transformer,正是为了解决这个问题提出的。
PVT 论文全名是:Pyramid Vision Transformer: A Versatile Backbone for Dense Prediction without Convolutions
它发表于 ICCV 2021,目标是构建一个 不依赖卷积、但适合密集预测任务的通用 Transformer backbone。论文明确指出,PVT 希望克服 ViT 迁移到检测和分割任务时的困难,并通过金字塔结构和 Spatial-Reduction Attention 生成高分辨率、多尺度特征。
1. 论文基本信息
论文题目:Pyramid Vision Transformer: A Versatile Backbone for Dense Prediction without Convolutions
中文可以理解为:金字塔视觉 Transformer:一种无卷积的密集预测通用骨干网络
论文作者包括 Wenhai Wang、Enze Xie、Xiang Li、Deng-Ping Fan、Kaitao Song、Ding Liang、Tong Lu、Ping Luo 和 Ling Shao。该论文发表于 ICCV 2021,Open Access 页面显示论文页码为 568–578。
这篇论文的关键词主要有三个:
1. Pyramid structure
2. Dense prediction
3. Spatial-Reduction Attention
如果用一句话概括 PVT:PVT 将 CNN 中常用的金字塔多尺度结构引入 Transformer,使 Transformer 能够像 CNN backbone 一样输出多尺度特征,从而更自然地用于目标检测、实例分割和语义分割等密集预测任务。
2. PVT 想解决什么问题?
PVT 的提出背景非常明确:
ViT 是一个很好的图像分类模型,但不是一个天然适合密集预测的视觉 backbone。
原始 ViT 的结构更像一个“柱状结构”,整个网络基本在同一 token 分辨率下处理特征。论文中也指出,ViT 被设计用于图像分类,其输出特征通常是单尺度且低分辨率,并且在常见检测输入尺寸下计算和显存开销较高。而目标检测和语义分割需要的是另一类能力:
目标检测:需要定位不同大小的目标;
实例分割:需要同时预测目标框和目标 mask;
语义分割:需要对每个像素或每个位置进行分类。
这些任务对特征图的要求更高:
1. 需要高分辨率特征来保留细节;
2. 需要多尺度特征来适配不同大小目标;
3. 需要全局上下文来理解场景;
4. 需要能够接入 FPN、RetinaNet、Mask R-CNN、Semantic FPN 等框架。
CNN backbone 天然适合这些任务,因为 CNN 会随着网络加深逐渐降低特征图分辨率,形成多尺度特征金字塔。PVT 的目标就是:
将这种金字塔思想引入 Transformer,使 Transformer 也能生成类似 CNN 的多尺度 feature maps。
PVT 的核心思想可以概括为一句话:
把 CNN 的金字塔多尺度结构引入 Transformer,并用 SRA 降低高分辨率 token 上的 attention 计算量。
具体来说,PVT 主要做了三件事:
1. 使用更细粒度的 patch 划分,让浅层特征保持较高分辨率;
2. 使用 progressive shrinking pyramid,让特征图分辨率逐阶段降低;
3. 使用 Spatial-Reduction Attention,在计算 attention 前压缩 K 和 V 的空间尺度。
这三个设计分别解决不同问题:
| 设计 | 解决的问题 |
|---|---|
| 细粒度 patch | 提高浅层输出分辨率 |
| 金字塔结构 | 产生多尺度特征 |
| SRA | 降低高分辨率 attention 计算量 |
论文中明确表示,PVT 通过细粒度 patch、progressive shrinking pyramid 和 spatial-reduction attention 来克服传统 Transformer 在密集预测中的困难。
3. PVT 的整体模型结构
PVT 的整体结构类似 CNN backbone,被划分为 4 个 stage。每个 stage 包含两部分:
1. Patch Embedding
2. Transformer Encoder
整体流程可以写成:
Input Image
↓
Stage 1: Patch Embedding + Transformer Encoder
↓
Stage 2: Patch Embedding + Transformer Encoder
↓
Stage 3: Patch Embedding + Transformer Encoder
↓
Stage 4: Patch Embedding + Transformer Encoder
↓
Feature Pyramid: F1, F2, F3, F4
PVT 的整体结构:整个模型被分成四个 stage,每个 stage 都由 patch embedding 层和若干层 Transformer Encoder 组成;输出分辨率从高分辨率的 4-stride 逐渐缩小到 32-stride。原始 ViT 是:
单阶段 / 单尺度 token 序列
而 PVT 是:
四阶段 / 多尺度 feature pyramid
所以 PVT 更像 ResNet 这类 CNN backbone,可以输出不同尺度的特征图。
3.1. Progressive Shrinking Pyramid 详解
Progressive Shrinking Pyramid 可以翻译为:
渐进式收缩金字塔
这个名字看起来复杂,其实核心思想很简单:
随着网络逐渐加深,特征图的空间分辨率逐步降低,通道数逐步增加。
这和 CNN 中的 stage 设计非常类似。CNN 中常见的金字塔输出是:
C2: 1/4 resolution
C3: 1/8 resolution
C4: 1/16 resolution
C5: 1/32 resolution
PVT 也希望得到类似输出:
F1: 1/4 resolution
F2: 1/8 resolution
F3: 1/16 resolution
F4: 1/32 resolution
论文中明确说明,PVT 的四个阶段会产生不同尺度的 feature maps,其 stride 分别为 4、8、16 和 32,可以形成特征金字塔 {F1, F2, F3, F4},用于分类、检测和分割等下游任务。
3.2. PVT 的四阶段特征输出
假设输入图像大小是:
H × W × 3
PVT 的四阶段输出可以写成:
F1: H/4 × W/4 × C1
F2: H/8 × W/8 × C2
F3: H/16 × W/16 × C3
F4: H/32 × W/32 × C4
对于常见的 224×224 输入,如果以 PVT 默认设置为例,空间尺寸大致是:
Stage 1: 56 × 56
Stage 2: 28 × 28
Stage 3: 14 × 14
Stage 4: 7 × 7
这和 CNN backbone 的金字塔输出非常接近。
以 PVT 的官方实现为例,PVT-Tiny/Small/Medium/Large 的 embedding 维度通常为:
C1 = 64
C2 = 128
C3 = 320
C4 = 512
官方实现中 PyramidVisionTransformer 默认使用四个 stage,并在各 stage 中设置 embed_dims=[64, 128, 256, 512];而 PVT v1 的具体模型构造函数中使用 embed_dims=[64, 128, 320, 512]、num_heads=[1,2,5,8]、sr_ratios=[8,4,2,1] 等配置。
3.2 Transformer Encoder 在 PVT 中如何设计?
PVT 每个 stage 中仍然使用 Transformer Encoder。一个 PVT block 的基本结构和 ViT 类似:
x = x + Attention(LayerNorm(x))
x = x + MLP(LayerNorm(x))
也就是:
LayerNorm
↓
Attention / SRA
↓
Residual Connection
↓
LayerNorm
↓
MLP
↓
Residual Connection
但是 PVT 和 ViT 的关键区别在于:PVT 不使用普通 MHA,而是使用 SRA,也就是 Spatial-Reduction Attention。PVT 的官方代码中,Block 先做 norm1,然后进入 Attention,再通过 DropPath 做残差连接,之后再经过 norm2 和 MLP。对应代码逻辑可以概括为:
x = x + DropPath(SRA(LayerNorm(x)))
x = x + DropPath(MLP(LayerNorm(x)))
其中 SRA 是 PVT 的核心。
4. Spatial-Reduction Attention 公式解析
Spatial-Reduction Attention,简称:
SRA
它的作用是:
在计算 attention 之前,先对 K 和 V 做空间降采样,从而降低 attention matrix 的大小。
普通 Multi-Head Attention 中,Q、K、V 的 token 数量相同。如果输入 token 数量是:
N = H × W
那么 attention matrix 是:
N × N
而 SRA 的思路是:
Q 保持原来的 N 个 token;
K 和 V 先在空间上降采样,变成 N / R² 个 token;
然后计算 Q 和降采样后的 K、V 的 attention。
其中 R 是 spatial reduction ratio。
4.1 SRA 总体公式
论文中 SRA 的公式可以写为:
其中每个 head 为:
Q:Query
K:Key
V:Value
SR(·):Spatial Reduction 操作
W_j^Q, W_j^K, W_j^V:第 j 个 head 的线性映射参数
W^O:多头拼接后的输出投影
这个公式说明:SRA 和普通 MHA 的区别不在 Q,而在 K 和 V。普通 MHA 直接使用 K 和 V,而 SRA 会先对 K 和 V 做空间压缩。该公式对应论文中 SRA 的定义。
4.2 SR 操作公式
论文中将空间压缩操作写为:
其中:
x:输入 token 序列
R_i:第 i 个 stage 中的 reduction ratio
Reshape(x, R_i):将 token 在空间上按 R_i 进行降采样式重排
W^S:线性投影参数
Norm:LayerNorm
直观理解就是:
把原本 H×W 个 token 压缩成 H/R × W/R 个 token。
如果原始 token 数量是:
那么经过 SR 后,token 数量变为:
所以 K 和 V 的长度都减少了 R² 倍。
论文中也说明,SRA 对输入序列进行空间维度缩减,并通过 LayerNorm 进行归一化。
4.3 SRA 为什么能降低计算量?
普通 MHA 中:
Q: N × d
K: N × d
V: N × d
attention matrix 大小是:N × N。而 SRA 中:
Q: N × d
K: N/R² × d
V: N/R² × d
attention matrix 大小变成:N × (N/R²)
因此,attention 的计算和显存开销约降低:R² 倍
举个例子。
如果 Stage 1 的特征图是:56 × 56
那么 token 数量是:N = 3136
如果使用普通 MHA,attention matrix 是:3136 × 3136
如果使用 R=8 的 SRA,那么 K 和 V 的 token 数量变成:3136 / 8² = 49
attention matrix 变成:3136 × 49
这就大大减少了计算量。
论文指出,通过这些公式可以看出,SRA 的计算和显存开销比普通 MHA 低 R_i² 倍,因此可以在有限资源下处理更大的输入特征图或更长 token 序列。
5. PVT-Tiny / Small / Medium / Large 配置
PVT 设计了多个不同规模的模型:
PVT-Tiny
PVT-Small
PVT-Medium
PVT-Large
它们的主要区别在于每个 stage 的 Transformer block 数量不同。官方实现中,PVT v1 的主要配置如下:
| 模型 | embed_dims | num_heads | depths | sr_ratios | mlp_ratios |
|---|---|---|---|---|---|
| PVT-Tiny | [64,128,320,512] | [1,2,5,8] | [2,2,2,2] | [8,4,2,1] | [8,8,4,4] |
| PVT-Small | [64,128,320,512] | [1,2,5,8] | [3,4,6,3] | [8,4,2,1] | [8,8,4,4] |
| PVT-Medium | [64,128,320,512] | [1,2,5,8] | [3,4,18,3] | [8,4,2,1] | [8,8,4,4] |
| PVT-Large | [64,128,320,512] | [1,2,5,8] | [3,8,27,3] | [8,4,2,1] | [8,8,4,4] |
从这个表可以看出:
1. 四个模型的通道数、head 数、SRA ratio 和 MLP ratio 基本一致;
2. 模型规模主要通过增加 Transformer block 数量来扩大;
3. Stage 3 的 depth 通常最大,说明主要计算资源集中在中间阶段。
论文也说明,PVT 设计遵循 ResNet 的经验:浅层使用较小通道数,随着网络加深逐渐增大通道数,并将主要计算资源集中在中间 stage。
6. PVT 如何用于图像分类?
对于图像分类,PVT 和 ViT 一样,最终仍然需要一个全局图像表示。
PVT 的做法是:
1. 前三个 stage 不使用 class token;
2. 在最后一个 stage 加入 learnable classification token;
3. 经过最后一个 stage 的 Transformer Encoder;
4. 取 class token 输出;
5. 接全连接层完成分类。
论文中明确说明,对于图像分类,PVT 跟随 ViT 的做法,在最后一个 stage 的输入中追加一个可学习的 classification token,然后在该 token 上使用 FC 层完成分类。
官方代码中也是这样实现的:只有在最后一个 stage 才会拼接 cls_token,随后返回 x[:, 0] 作为分类特征。这和原始 ViT 有一个重要区别:
ViT:从一开始就加入 class token;
PVT:只在最后一个 stage 加入 class token。
为什么这样设计?因为 PVT 的前几个 stage 更关注生成多尺度空间特征,而分类只需要最后阶段的全局语义表示。
7. PVT 如何用于目标检测和分割?
这是 PVT 最重要的应用场景。对于密集预测任务,PVT 不使用单个 class token,而是输出四个 stage 的特征金字塔:F1, F2, F3, F4。这些特征可以直接接入 FPN 或其他 dense prediction head。例如:
目标检测:PVT + RetinaNet
实例分割:PVT + Mask R-CNN
语义分割:PVT + Semantic FPN
论文中说明,在检测和分割中,PVT 使用 ImageNet 预训练权重初始化 backbone,然后将 {F1,F2,F3,F4} 输入 FPN,经过 FPN 处理后再送入后续检测或分割 head;训练检测/分割模型时,PVT 的各层不冻结。此外,由于检测和分割输入图像尺寸可以变化,ImageNet 预训练时学到的 position embedding 尺寸可能不再匹配,因此 PVT 在下游任务中会根据输入分辨率对 position embedding 做双线性插值。
8. PVT 的训练过程
PVT 的训练可以分为三类:图像分类预训练、目标检测训练和语义分割训练。
8.1 图像分类训练
PVT 首先在 ImageNet-1K 上训练分类模型。
论文中使用 ImageNet 2012 数据集,该数据集包含约 128 万张训练图像、5 万张验证图像,共 1000 个类别。训练时使用随机裁剪、随机水平翻转、label smoothing、mixup、CutMix 和 random erasing 等数据增强策略;优化器使用 AdamW,batch size 为 128,并在 8 张 V100 GPU 上从头训练 300 个 epoch。
官方训练代码中也能看到类似训练设定,例如默认 batch size 为 128、epoch 为 300、优化器为 AdamW、weight decay 为 0.05、初始学习率为 5e-4、warmup 5 个 epoch,同时启用了 mixup、CutMix、label smoothing 和 random erasing 等配置。图像分类训练的作用是:
得到一个 ImageNet 预训练的 PVT backbone。
后续检测和分割任务都会基于这个预训练 backbone 进行迁移。
8.2 目标检测训练
目标检测实验在 COCO 数据集上进行。
论文中使用 COCO train2017 的 118k 图像训练,并在 val2017 的 5k 图像上评估。检测框架包括 RetinaNet 和 Mask R-CNN。训练前,PVT backbone 使用 ImageNet 预训练权重初始化,新加入的层使用 Xavier 初始化。训练时 batch size 为 16,使用 8 张 V100 GPU,优化器为 AdamW,并采用 1x 或 3x schedule,其中 1x 表示 12 个 epoch,3x 表示 36 个 epoch;训练图像短边 resize 到 800,长边不超过 1333。目标检测流程可以概括为:
ImageNet 预训练 PVT
↓
作为 RetinaNet / Mask R-CNN backbone
↓
输出 F1, F2, F3, F4
↓
输入 FPN
↓
检测 / 实例分割 head
↓
COCO 上训练和评估
8.3 语义分割训练
语义分割实验在 ADE20K 上进行。
ADE20K 是一个场景解析数据集,论文中说明它包含 150 个细粒度语义类别,训练集、验证集和测试集分别包含 20,210、2,000 和 3,352 张图像。PVT 使用 Semantic FPN 作为分割框架进行评估。语义分割流程可以概括为:
ImageNet 预训练 PVT
↓
输出 F1, F2, F3, F4
↓
Semantic FPN
↓
像素级分类
↓
ADE20K 上评估 mIoU
9. PVT 的实验结果
PVT 的实验结果主要证明了三件事:
1. PVT 可以做图像分类;
2. PVT 更适合目标检测和实例分割;
3. PVT 可以作为语义分割 backbone。
9.1 图像分类结果
在 ImageNet 分类任务上,PVT 能达到和 ViT/DeiT 相近的性能,但论文也指出,PVT 的金字塔结构主要是为密集预测设计的,因此对分类任务的提升并不是最主要目标。官方仓库给出的 PVT v1 ImageNet-1K 结果为:PVT-Tiny 75.1、PVT-Small 79.8、PVT-Medium 81.2、PVT-Large 81.7 Top-1 accuracy。
9.2 目标检测结果
PVT 在 COCO 目标检测上表现明显优于相近规模 CNN backbone。例如,在 RetinaNet 1x 训练设置下,PVT-Small 达到 40.4 AP,而 ResNet50 为 36.3 AP;在 PVT 论文摘要中也强调,PVT+RetinaNet 在参数规模相近时比 ResNet50+RetinaNet 高 4.1 AP。这说明 PVT 的多尺度 Transformer backbone 对目标检测非常有效。
9.3 实例分割结果
在 Mask R-CNN 上,PVT 同样带来提升。论文报告中,PVT-Tiny 在 1x schedule 下获得 35.1 mask AP,比 ResNet18 高 3.9 点,甚至比 ResNet50 高 0.7 点;PVT-Large 的 mask AP 达到 40.7,比 ResNeXt101-64x4d 高 1.0 点,同时参数量更少。这说明 PVT 生成的多尺度特征不仅对检测框有帮助,也对 mask 预测有帮助。
9.4 语义分割结果
在 ADE20K 语义分割中,PVT 配合 Semantic FPN 也表现出明显优势。论文中报告,PVT-Tiny、PVT-Small、PVT-Medium 和 PVT-Large 在 Semantic FPN 上分别达到 35.7、39.8、41.6 和 42.1 mIoU;其中 PVT-Small 比 ResNet50 高 3.1 mIoU,PVT-Large 比 ResNeXt101-64x4d 高 1.9 mIoU,且参数和 GFLOPs 更低。
更多推荐
所有评论(0)