08 ViT 的局限:为什么不适合直接做检测和分割?
前言
前面几章中,我们已经系统整理了 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
计算量更低
层次化结构
适合密集预测更多推荐



所有评论(0)