前言

前面几章中,我们已经系统整理了 ViT 和 DeiT。

ViT 证明了:图像可以被切成 patch token,然后输入 Transformer Encoder 进行图像分类。

DeiT 进一步说明:通过更好的训练策略和蒸馏机制,ViT 可以在不依赖超大规模外部数据的情况下更高效地训练。

但是,到这里为止,我们讨论的核心任务仍然主要是:图像分类。也就是输入一张图像,输出一个类别标签。可是计算机视觉中还有很多更复杂的任务,比如:

目标检测
语义分割
实例分割
关键点检测
密集预测

这些任务不只是判断“图像里有什么”,还要回答:

目标在哪里?
每个像素属于什么类别?
不同实例之间如何区分?
小目标和大目标如何同时识别?

这就引出一个非常重要的问题:原始 ViT 能不能直接作为目标检测和语义分割的通用骨干网络?

1. 分类、检测和分割任务有什么区别?

1.1 图像分类

图像分类的目标是:

输入一张图像,输出一个类别。

例如:

输入:一张猫的图片
输出:cat

分类任务只需要判断整张图像的主要类别,不需要精确知道目标在哪个位置,也不需要知道每个像素属于哪个类别。所以分类任务通常只需要一个全局图像表示。这正好适合 ViT 中的 class token。ViT 的做法是:

patch tokens 通过 Transformer Encoder 交互
class token 聚合全图信息
最后取 class token 做分类

ViT 原论文就是把图像切成固定大小 patch,线性嵌入后加位置编码,再送入标准 Transformer Encoder,并使用一个额外的 learnable classification token 做分类。


1.2 目标检测

目标检测不仅要判断图像中有什么,还要知道目标在哪里。

例如:

输入:一张街景图像
输出:
car: bounding box
person: bounding box
traffic light: bounding box

目标检测至少需要两个信息:

1. 类别信息:目标是什么?
2. 位置信息:目标在哪里?

这就要求模型保留比较丰富的空间信息。如果模型只输出一个全局 class token,就远远不够。


1.3 语义分割

语义分割更加细粒度。它的目标是:

给图像中的每个像素分配一个类别。

例如:

天空区域 → sky
道路区域 → road
行人区域 → person
车辆区域 → car

这类任务需要像素级或高分辨率特征。也就是说,语义分割不仅需要知道图像中有什么,还需要知道每个位置是什么。所以它对空间分辨率和多尺度特征要求更高。

2 VIT的缺陷

2.1原始 ViT 的第一个局限:缺少金字塔结构

原始 ViT 的一个核心问题是:

它没有像 CNN 那样天然产生多尺度特征图。

CNN 通常是逐层下采样的。例如 ResNet 中,特征图分辨率会逐渐降低:

输入图像: 224 × 224
Stage 1: 56 × 56
Stage 2: 28 × 28
Stage 3: 14 × 14
Stage 4: 7 × 7

这种层次化结构天然形成了特征金字塔。不同层的特征具有不同分辨率和语义层次。而原始 ViT 是把图像一次性切成 patch。以 ViT-B/16 为例:

224 × 224 图像
切成 14 × 14 个 patch
后续 Transformer Encoder 一直处理这 196 个 patch token

也就是说,ViT 的 token 网格从开始到结束基本保持:

14 × 14

它不像 CNN 那样逐层产生:

56 × 56
28 × 28
14 × 14
7 × 7

这样的多尺度特征。这对分类影响不大,因为分类最终只需要全局表示。但对于检测和分割来说,缺少金字塔结构会带来明显问题。


2.2. 原始 ViT 的第二个局限:输出分辨率较低

以 ViT-B/16 为例,输入图像是:

224 × 224

patch size 是:

16 × 16

输出 patch token 对应的空间网格是

14 × 14

这个分辨率对于分类任务可以接受。但是对于分割任务,14×14 显然太粗糙。因为语义分割需要对每个像素或较高分辨率位置进行预测。如果只依赖 14×14 的 token 网格,再上采样回原图大小,很多边界细节会丢失。例如:

细长物体
小目标
目标边界
局部纹理
密集场景中的相邻实例

都很容易受到影响。检测任务也类似。如果特征图太低分辨率,小目标可能只对应很少几个 token,甚至被压缩到一个 token 中。PVT 论文就明确指出,与 ViT 通常低分辨率输出和较高计算/显存开销不同,PVT 通过渐进式金字塔和空间压缩注意力,尝试让 Transformer 更适合密集预测任务。


2.3. 原始 ViT 的第三个局限:计算复杂度高

ViT 中 self-attention 的计算复杂度和 token 数量平方相关。如果 token 数量是:

N

那么 attention matrix 大小是:

N × N

也就是说复杂度大致是:

O(N²)

对于分类任务,ViT-B/16 中:

N = 197

这个规模还可以接受。但是检测和分割往往需要更高分辨率输入。例如输入从:

224 × 224

提高到:

1024 × 1024

如果仍然使用 patch size 16,那么 patch 网格变成:

64 × 64 = 4096 tokens

attention matrix 大小就是:

4096 × 4096

这会带来巨大的计算和显存开销。所以,原始全局 self-attention 很难直接处理高分辨率密集预测任务。这也是 Swin Transformer 提出窗口注意力的重要原因。Swin Transformer 通过把 self-attention 限制在局部窗口内,并用 shifted window 实现跨窗口连接,从而降低高分辨率图像上的计算复杂度,并构建可用于分类、检测和分割的层次化视觉骨干。


2.4. 原始 ViT 的第四个局限:局部建模能力不足

检测和分割不仅需要全局语义,也非常依赖局部细节。例如:

目标边界
小目标轮廓
纹理差异
相邻实例分界
局部形状

CNN 的卷积核天然关注局部邻域。所以 CNN 在局部纹理、边界和细节建模上有很强先验。而原始 ViT 一开始就把图像切成较大的 patch。如果 patch size 是 16,那么一个 token 对应:

16 × 16

的图像区域。这意味着 patch 内部的细粒度结构在一开始就被压缩进一个 token 表示中。虽然 Transformer 后续可以建模 patch 之间的关系,但它并不天然像 CNN 那样逐层提取局部边缘、纹理和细节。这也是为什么很多后续方法会重新引入局部建模机制,例如:

局部窗口注意力
卷积式 patch embedding
层次化结构
重叠 patch
金字塔特征

这些改进本质上都是在弥补原始 ViT 的局部建模不足。


2.5. 原始 ViT 的第五个局限:和 FPN 等检测框架不够匹配

现代目标检测框架通常依赖 backbone 输出多尺度特征。例如 FPN 通常希望 backbone 输出类似:

C2, C3, C4, C5

这些不同尺度的特征图。然后 FPN 进一步构建:

P2, P3, P4, P5

用于检测不同大小的目标。CNN backbone 天然适合这种流程,因为 CNN 的 stage 本身就会输出不同分辨率的 feature map。但是原始 ViT 的输出主要是一个固定长度 token 序列。如果强行接入检测框架,需要额外做很多转换:

token sequence → feature map
单尺度特征 → 多尺度特征
低分辨率输出 → 高分辨率预测

这就不如 CNN backbone 那样自然。因此,原始 ViT 虽然可以经过改造用于检测和分割,但并不是一个天然适配密集预测的 backbone。


3. 为什么 CNN/FPN 更适合密集预测?

CNN/FPN 适合密集预测,主要有三个原因。

3.1 CNN 天然保留空间结构

CNN 从头到尾处理的是二维特征图。例如:

[B, C, H, W]

这种格式天然适合检测和分割。因为检测和分割都需要空间位置。而 ViT 会把图像变成 token 序列:

[B, N, D]

虽然 token 可以重新 reshape 成二维网格,但 ViT 本身的结构并不像 CNN 那样一直维持多尺度二维特征图。


3.2 CNN 天然有层次化特征

CNN 的不同 stage 输出不同分辨率。

例如:

浅层:高分辨率,细节丰富
深层:低分辨率,语义更强

这正好适合检测和分割。而原始 ViT 的所有 Transformer block 基本都在同一 token 分辨率下处理。


3.3 FPN 可以融合不同尺度特征

FPN 的核心价值是:

把高层语义信息和低层空间细节结合起来。

它让模型既能检测大目标,也能检测小目标。FPN 原论文强调利用 CNN 自身的多尺度金字塔层次结构,以较小额外成本构建特征金字塔,从而提升目标检测中特征表达能力。这也是原始 ViT 不适合直接做检测和分割的重要原因:

它缺少可以直接接入 FPN 的多尺度特征层次。


4. PVT 如何改进原始 ViT?

PVT,也就是 Pyramid Vision Transformer,就是为了解决原始 ViT 不适合密集预测的问题而提出的。

从名字就可以看出,它的核心是:

Pyramid

也就是金字塔结构。PVT 的目标是把 Transformer 改造成类似 CNN backbone 的形式,使其能够输出多尺度特征。PVT 的关键改进包括:

1. 多阶段结构
2. 渐进式缩小 token 分辨率
3. 输出多尺度特征
4. Spatial Reduction Attention 降低计算量

PVT 论文明确提出,它是面向 dense prediction 的 pure Transformer backbone,并通过 progressive shrinking pyramid 和 spatial-reduction attention 克服 Transformer 迁移到密集预测任务中的困难。可以简单理解为:

ViT:
一次性切 patch
单尺度 token 序列
主要用于分类

PVT:
分阶段处理
逐步降低分辨率
输出多尺度特征
适合检测和分割

所以 PVT 是 ViT 从分类模型走向通用视觉 backbone 的重要一步。


5. Swin Transformer 如何改进原始 ViT?

Swin Transformer 也是为了解决原始 ViT 的局限而提出的。

它的核心改进有两个:

1. Hierarchical structure
2. Shifted Window Attention

也就是:

层次化结构 + 移动窗口注意力

5.1 层次化结构

Swin Transformer 像 CNN 一样逐步降低特征图分辨率。它通过 patch merging 实现类似下采样的效果。这样 Swin 可以产生多尺度特征,更适合检测和分割。


5.2 窗口注意力

原始 ViT 在全图 token 上做 self-attention。Swin 则把图像划分成局部窗口,只在每个窗口内部做 attention。这样计算复杂度更低。但是如果只在固定窗口内计算,窗口之间缺少交互。因此 Swin 又提出 shifted window。通过窗口移动,让不同窗口之间建立连接。Swin Transformer 论文说明,shifted window 机制通过限制 self-attention 在非重叠局部窗口内计算来提升效率,同时通过窗口移动实现跨窗口连接;其层次化结构可服务于图像分类、目标检测和语义分割等任务。可以简单理解为:

ViT:
全局 attention
计算量高
单尺度结构

Swin:
局部窗口 attention
计算量更低
层次化结构
适合密集预测
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐