第26篇:计算机视觉新范式:从CNN到Vision Transformer
摘要:
本文系统讲解卷积神经网络(CNN)的局限性(归纳偏置、长距离依赖弱),深入解析Vision Transformer(ViT)的图像分块(Patch)与线性嵌入、自注意力在图像上的应用,详解Swin Transformer的滑动窗口机制与层次化设计。结合PyTorch,使用timm库实现图像分类。探讨多模态模型(如CLIP)的兴起。帮助学习者理解视觉领域的“Transformer革命”,掌握现代视觉模型的核心思想。
一、CNN的辉煌与局限
1.1 CNN的三大归纳偏置
- 局部性(Locality):卷积核关注局部区域。
- 平移不变性(Translation Equivariance):特征图随输入平移而平移。
- 权重共享(Weight Sharing):同一卷积核扫描整个图像。
✅ 这些偏置使CNN在图像任务上高效且有效。
1.2 CNN的局限性
- ❌ 长距离依赖建模弱:需深层网络或额外模块(如Non-local)。
- ❌ 计算冗余:卷积核在所有位置滑动,无论内容是否重要。
- ❌ 架构刚性:固定感受野,难以自适应调整。
✅ Transformer凭借全局自注意力,为视觉任务提供新思路。
二、Vision Transformer(ViT):将图像视为序列
2.1 核心思想
- 将图像分块(Patch),展平为序列,输入标准Transformer。
- ✅ 证明“注意力即一切”在视觉领域同样成立。
2.2 ViT 架构详解
输入图像 (H×W×C)
↓
[分块] → 将图像划分为 P×P 的块,展平为 (N, D) 向量,N=(H/P)*(W/P)
↓
[线性嵌入] → 通过线性层映射到 D 维向量
↓
[添加 [CLS] token] → 用于分类
↓
[位置编码] → 注入位置信息(可学习或正弦)
↓
[Transformer Encoder] × L
↓
[MLP Head] → 分类输出
2.3 关键技术点
2.3.1 图像分块(Image Patching)
- 输入图像
224×224×3,块大小16×16。 - 得到
14×14=196个块。 - 每个块展平为
16×16×3=768维向量。 - 通过线性层映射到
D=768维(嵌入维度)。
✅ 块越大,序列越短,计算越快,但细节损失。
2.3.2 位置编码(Positional Encoding)
- 由于无卷积,必须显式添加位置信息。
- ViT使用可学习的位置编码(Learnable Position Embeddings)。
- 为每个块位置学习一个D维向量。
2.3.3 自注意力在视觉上的优势
- ✅ 全局感受野:每个块可与所有其他块交互。
- ✅ 动态权重:注意力权重由内容决定,自适应聚焦重要区域。
- ✅ 长距离依赖强:一步到位,无需深层堆叠。
2.4 ViT的训练需求
- ❌ 数据饥饿:在ImageNet上表现不如CNN。
- ✅ 大规模预训练:在JFT-300M等大数据集上预训练后,性能超越CNN。
✅ “规模弥补归纳偏置”——ViT的成功依赖于海量数据。
三、Swin Transformer:迈向高效与多尺度
ViT计算复杂度为 O(N²),N为序列长度,对高分辨率图像不友好。
Swin Transformer(2021)提出滑动窗口(Shifted Windows)机制。
3.1 核心创新
3.1.1 局部窗口自注意力
- 将图像划分为不重叠的窗口(如7×7)。
- 在每个窗口内计算自注意力。
- ✅ 计算复杂度降至
O(N),与图像尺寸线性相关。
3.1.2 滑动窗口(Shifted Windows)
- 奇数层:窗口划分。
- 偶数层:窗口偏移半个窗口。
- ✅ 使不同窗口间的信息得以交互,保持全局建模能力。
3.1.3 层次化设计
- 类似CNN,Swin Transformer有多个阶段,逐步下采样,扩大感受野。
- ✅ 生成多尺度特征图,适用于检测、分割等密集任务。
四、实战:使用timm库实现ViT图像分类
4.1 环境准备
pip install timm torch torchvision
timm(PyTorch Image Models)是一个强大的视觉模型库,包含ViT、Swin等。
4.2 加载预训练ViT模型
import torch
import timm
from PIL import Image
from torchvision import transforms
# 检查设备
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# 加载预训练ViT模型
model = timm.create_model('vit_base_patch16_224', pretrained=True)
model = model.to(device)
model.eval()
# ImageNet类别标签
with open('imagenet_classes.txt') as f:
classes = [line.strip() for line in f.readlines()]
4.3 图像预处理
# ViT的预处理(与ResNet类似)
transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
# 加载图像
img = Image.open('cat.jpg').convert('RGB')
input_tensor = transform(img).unsqueeze(0).to(device) # (1, 3, 224, 224)
4.4 推理与预测
with torch.no_grad():
output = model(input_tensor)
probabilities = torch.nn.functional.softmax(output[0], dim=0)
# 获取Top-5预测
top5_prob, top5_catid = torch.topk(probabilities, 5)
for i in range(top5_prob.size(0)):
print(f"{classes[top5_catid[i]]}: {top5_prob[i].item():.4f}")
✅ 输出如:
"tabby, tabby cat: 0.8923"。
4.5 使用Swin Transformer
# 加载Swin-Tiny模型
model_swin = timm.create_model('swin_tiny_patch4_window7_224', pretrained=True)
model_swin = model_swin.to(device)
model_swin.eval()
# 同样预处理和推理...
✅ Swin在检测、分割任务上表现更优。
五、多模态模型的兴起:CLIP
ViT的成功启发了多模态(图像+文本)模型。
5.1 CLIP(Contrastive Language-Image Pre-training)
- 思想:用对比学习对齐图像与文本。
- 架构:
- 图像编码器:ViT 或 CNN。
- 文本编码器:Transformer。
- 训练:从互联网收集“图像-文本对”,最大化匹配对的相似度,最小化非匹配对。
5.2 零样本图像分类
CLIP无需微调,即可进行分类:
- 将类别名称转换为文本提示(如
"a photo of a {class}")。 - 计算图像与所有文本提示的相似度。
- 选择相似度最高的类别。
✅ 真正的“零样本”能力,如DALL·E、Stable Diffusion的基石。
六、总结与学习建议
本文我们:
- 认识了CNN的局限性;
- 掌握了ViT的分块与序列化思想;
- 理解了Swin Transformer的滑动窗口机制;
- 实战了timm库的图像分类;
- 了解了CLIP等多模态模型。
📌 学习建议:
- 理解范式转移:从“局部卷积”到“全局注意力”。
- 掌握timm库:它是视觉研究的瑞士军刀。
- 探索Swin:在密集预测任务(检测、分割)上更优。
- 关注多模态:CLIP、BLIP、Flamingo是未来方向。
- 动手实践:尝试微调ViT/Swin在自定义数据集上。
七、下一篇文章预告
第27篇:多模态大模型:图文理解与生成(CLIP, DALL·E, Stable Diffusion)
我们将深入讲解:
- CLIP的对比学习与零样本分类
- DALL·E系列(DALL·E 2, DALL·E 3)的图文生成原理
- Stable Diffusion的Latent Diffusion与文本引导
- BLIP、Flamingo等图文理解模型
- 多模态大模型的挑战与应用
进入“图文并茂”的AI世界!
参考文献
- Dosovitskiy, A. et al. (2020). An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale. ICLR (ViT).
- Liu, Z. et al. (2021). Swin Transformer: Hierarchical Vision Transformer using Shifted Windows. ICCV.
- Radford, A. et al. (2021). Learning Transferable Visual Models From Natural Language Supervision. ICML (CLIP).
- timm库: https://github.com/rwightman/pytorch-image-models
- OpenAI CLIP: https://openai.com/research/clip
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)