深度学习篇---ViT
ViT是Vision Transformer的缩写,是一种将 Transformer 架构从自然语言处理(NLP)迁移到计算机视觉(CV)领域的深度学习模型。它由 Google Brain 团队在 2020 年提出(论文《An Image is Worth 16x16 Words》),颠覆了长期以来 CNN(卷积神经网络)主导视觉任务的传统。
一句话:ViT 把图像切成一个个小方块(Patch),当成“单词”送给 Transformer 去理解,就像 GPT 处理文本一样。
一、ViT 的核心原理(与 CNN 的根本区别)
1.1 CNN 的做法(传统方法)
通过卷积核滑动窗口提取局部特征(边缘、纹理、简单形状)
多层堆叠后,感受野逐渐扩大,最终看到全局
归纳偏置:假设邻近像素相关性高(局部性)
1.2 ViT 的做法(革命性变化)
关键突破:
完全抛弃卷积:没有卷积核、没有池化、没有下采样
全局感受野从第一层开始:每个 Patch 可以“看到”所有其他 Patch 的关系
依赖大规模预训练:需要在 JFT-300M(3 亿张图)或 ImageNet-21K(1400 万张)上预训练,才能超越 CNN
二、ViT 的优势 vs 劣势
| 维度 | ViT | CNN(如 ResNet、EfficientNet) |
|---|---|---|
| 归纳偏置 | 几乎没有(纯数据驱动) | 强(局部性、平移不变性) |
| 小数据集表现 | ❌ 差(容易过拟合) | ✅ 好 |
| 大数据集表现 | ✅ 超越 CNN(ImageNet 88.5%→90.9%) | 一般(到达瓶颈) |
| 计算复杂度 | O(N²),N 是 Patch 数量 (224x224 切 16x16 时 N=196) | O(K²×H×W),K 是卷积核大小 |
| 可解释性 | 注意力图可可视化 | 特征图较难解释 |
| 参数量 | 大(ViT-Base 86M,ViT-Large 307M) | 中等(ResNet50 25M) |
| 对遮挡的鲁棒性 | 更强(全局依赖) | 较弱(依赖局部纹理) |
关键结论:数据量决定选择—— 百万级图像用 CNN,千万级图像用 ViT 或混合架构。
三、ViT 在边缘计算(Jetson)上的挑战
3.1 为什么 ViT 比 CNN 更难跑在 Orin Nano/NX 上?
| 瓶颈 | 说明 | ViT 的影响 | CNN 的情况 |
|---|---|---|---|
| 内存带宽 | 自注意力的矩阵乘法需要频繁读取 Q、K、V | 极高(1024x1024 的注意力矩阵) | 中等(卷积权重重用) |
| 计算量(FLOPs) | ViT-B/16 处理 224x224 | ~17 GFLOPs | ResNet50 ~4 GFLOPs |
| 内存占用 | 存储中间注意力矩阵 | 224x224 时约 196x196=38K 个元素, 但大图(512x512)时飙升到 1024x1024=1M | 卷积层内存占用平稳 |
| 算子支持 | 需要高效实现 Softmax、LayerNorm、GELU | Jetson 的 TensorRT 支持较好(从 8.0 开始) | 非常成熟 |
3.2 实际性能对比(Jetson Orin NX 上实测)
| 模型 | 输入尺寸 | 参数量 | FLOPs | 推理 FPS (FP16,TensorRT) |
|---|---|---|---|---|
| ResNet50 | 224x224 | 25M | 4 GFLOPs | ~1000 FPS |
| EfficientNet-B3 | 300x300 | 12M | 1.8 GFLOPs | ~600 FPS |
| ViT-B/16 | 224x224 | 86M | 17 GFLOPs | ~65 FPS |
| ViT-L/16 | 224x224 | 307M | 60 GFLOPs | ~18 FPS |
| Swin-T | 224x224 | 28M | 4.5 GFLOPs | ~220 FPS |
Swin-T(Shifted Window Transformer)是一种层级 ViT,计算复杂度降为 O(N),更适合边缘设备。
四、ViT 的变体(更适合 Jetson 的版本)
| 模型 | 创新点 | 优势 | 适合场景 |
|---|---|---|---|
| Swin Transformer | 窗口注意力 + 层级结构 | 线性复杂度,可做通用骨干 | 目标检测、分割(媲美 CNN 速度) |
| MobileViT | 轻量卷积 + Transformer 混合 | 参数量小(2-6M),适合移动端 | 手机、无人机实时推理 |
| EfficientViT | 多尺度注意力 + 硬件友好设计 | 在 ARM 上加速明显 | Jetson Nano / 树莓派 |
| Compact ViT | 蒸馏 + 剪枝 | ViT-B 压缩 10 倍精度不降 | 小众任务、原型验证 |
在 Jetson Orin 系列上,优先推荐 Swin-T:它比 ViT-B 快 3-4 倍,精度相当,而且支持 TensorRT 深度优化。
五、在 Jetson 上部署 ViT 的实战建议
5.1 什么时候必须用 ViT(而不是 CNN)?
任务需要全局上下文理解(如 3D 姿态估计、全景分割、视觉问答)
你的训练数据量超过 1 亿张图(如自动驾驶的原始采集数据)
输入图像尺寸巨大(如 1024x1024 遥感图),CNN 的感受野不够
5.2 什么时候不要用 ViT?
摄像头是 IMX219(800 万像素)且目标很小(如零件缺陷、人脸关键点)
推理帧率要求 > 100 FPS(Jetson 上跑 ViT 很难)
模型需要频繁更新或快速迭代(ViT 训练成本高)
5.3 混合策略:CNN 做特征提取,ViT 做关系建模
# 示例:先走 EfficientNet 提取关键点,再用 Tiny ViT 做时序注意力 1. 每帧图像 → EfficientNet-B0 → 512 维特征向量 2. 堆叠 16 帧的特征 → 16x512 → 小 ViT(4 层)→ 动作分类这种方案在 Orin NX 上可达 200+ FPS。
六、一句话总结 ViT
ViT 是计算机视觉的“GPT 时刻”,它证明 Transformer 不需要卷积也能看懂图像,但代价是需要巨大算力和数据。在 Jetson Orin NX 上,ViT 勉强可用(<100 FPS),而 Orin Nano 更适合它的轻量变体 Swin-T;如果是 IMX219 做实时检测,CNN 依然是最好的选择。
