从零实现 ViT、MAE 预训练、DINO 自监督学习,掌握 Swin Transformer、Deformable DETR 等层次化视觉架构。
ViT 的核心洞察:图像可以被视为由 patch(类似于 NLP 中的 token)组成的序列。这意味着:
- 打破 CNN 范式:不再依赖卷积的局部感受野
- 统一架构:视觉和语言可以使用相同的 Transformer 处理
- 全局理解:第一层起每个 patch 就能看到所有其他 patch
一张 224×224 的 RGB 图像,使用 16×16 的 patch:
- 产生 14×14 = 196 个视觉 tokens
- 每个 token 是 16×16×3 = 768 维向量
- 通过线性投影映射到 hidden_dim
Patch Embedding 实际上等价于一个 kernel_size=stride=16 的大卷积核 Conv2d。
ViT 在所有 patch tokens 前面添加一个可学习的 [CLS] token。经过 Transformer 处理后,[CLS] 的输出包含了整张图像的全局表示。
这个设计来自 BERT,但 ViT 不能简单地用平均池化替代吗?可以,经验上差距不大,但 [CLS] token 通过 attention 学习到了"哪些 patch 重要"。
| 特性 | CNN | ViT |
|---|---|---|
| 感受野 | 从小到大(逐层扩大) | 全局(第一层起) |
| 归纳偏置 | 局部性、平移不变性 | 几乎没有 |
| 数据需求 | 较少 | 需要大规模数据 |
| 全局理解 | 需要深层 | 天然全局 |
| 多尺度 | 天然支持 | 需要特殊设计 |
ViT 的全局理解能力对自动驾驶很有价值:
- 场景理解:同时关注车辆、行人、交通灯
- 多视角融合:天然的全局注意力适合多相机输入
- 统一架构:与 LLM 共享结构,便于后续 VLA 设计
标注数据昂贵,但未标注的驾驶视频几乎是无限的。MAE 提供了一种从海量未标注数据中学习强大视觉表示的方法。
MAE 的训练过程:
1. 随机遮住图像 75% 的 patches
2. Encoder 只处理可见的 25% patches
3. Decoder 从编码特征 + mask tokens 重建完整图像
4. 只计算被遮住位置的 L2 重建 loss
- 30%: 太简单,模型可以靠局部插值填充
- 75%: 迫使模型理解全局语义才能重建
- 这个比例是论文通过实验找到的"甜蜜点"
MAE 的高效关键:
- Encoder(大)只处理 25% 的 patches → 训练速度 ~4x
- Decoder(小)处理所有 patches → 足够进行重建
- 这种不对称使得预训练可以规模化
- 处理遮挡:从部分相机图像重建全景
- 占据预测:从稀疏观测重建稠密 3D 场景
- 世界模型:预测未来的场景状态
- 预训练 backbone:在大量未标注驾驶数据上预训练
DINO 的核心是 Teacher-Student 自蒸馏:
- Student 通过梯度下降学习
- Teacher 是 Student 的 EMA
- Teacher 引导 Student 学习一致的表示
DINO 的创新之一:同时使用全局裁剪和局部裁剪
- 全局裁剪(2 个):覆盖 >50% 图像 → 场景级语义
- 局部裁剪(8 个):覆盖小区域 → 细节
Student 从局部裁剪学习匹配 Teacher 对全局裁剪的理解。
两个防止表示坍缩的技巧:
- Centering:减去表示空间的移动平均中心
- Sharpening:Teacher 用极小温度(0.04)→ 输出尖锐
- 两个技巧形成对抗:centering 防止坍缩到单点,sharpening 防止坍缩到均匀分布
DINOv2 是 Meta 的最新版本,在 DINO 基础上:
- 更大模型、更大数据
- 更精细的训练策略
- 特征质量接近有监督方法
- 已经成为许多视觉任务的标准 backbone
标准 ViT 所有层输出相同分辨率 → 不适合检测/分割等多尺度任务。
Swin 的解决方案:
- Patch Merging:阶段性降低分辨率
- 从 H/4 × W/4 → H/8 × W/8 → H/16 × W/16 → H/32 × W/32
- 类似 CNN 的层次化特征金字塔
局部窗口内的 Self-Attention:
- 复杂度从 O(N²) 降到 O(W²×N/W²) = O(W²)
- W 是窗口大小(7),N 是总 token 数
- 大大降低了高分辨率特征的计算量
偶数层:标准窗口
奇数层:偏移窗口(移动 W/2)
→ 窗口之间通过偏移实现通信
→ 不需要全局 attention 也能获得全局感受野
DETR 将检测问题重新定义为集合预测:
- 不需要 anchor boxes
- 不需要 NMS(非极大值抑制)
- 端到端可微
DETR 使用可学习的 object queries(检测"问题"):
- N 个 query,每个代表一个潜在目标
- 通过 Cross-Attention 与图像特征交互
- 输出该位置是否有目标 + 目标的类别和位置
训练时将 N 个预测与 M 个 GT 做最优二分匹配:
- 代价 = -log P_class + L1_bbox + GIoU
- 确保一对一匹配(不重复)
- 自然地解决了重复检测问题
| 策略 | 做法 | 适用场景 |
|---|---|---|
| Linear Probing | 冻结 backbone,只训练分类头 | 快速评估、数据少 |
| Full Fine-tuning | 全部训练 | 数据充足、追求最佳效果 |
| LoRA | 只训练低秩适配器 | 参数高效、快速适配 |
将预训练 ViT 用于驾驶场景:
1. 目标检测 → 车辆、行人、交通标志
2. 可行驶区域 → 哪里可以开
3. 交通灯状态 → 红灯/黄灯/绿灯
本章建立的核心能力:
1. ✅ ViT 从零实现 → 理解"图像即 Token"
2. ✅ MAE 自监督预训练 → 从遮挡中学习
3. ✅ DINO 自蒸馏 → 无标签的特征学习
4. ✅ Swin/DETR → 层次化 + 端到端检测
5. ✅ 注意力可视化 → 理解模型决策
6. ✅ 下游迁移 → 适配驾驶场景
下一章:视觉-语言对齐 (CLIP) — 将视觉与语言统一起来