这张图里有多少辆汽车?——SegFormer 如何用一个 84M 参数的 Transformer 看清每一条街
- 关联论文:2105.15203
你有没有试过这种体验 🛣️:
你让 AI 看一张街景图,问"这条路上有几辆汽车、几棵树、几个行人"—— 它回你"这是一条繁忙的城市街道" 🫠
听起来"对",但完全没用。
城市街道、卫星图像、工厂表面、医学切片——这些场景里你真正需要的是逐像素的精确类别(哪里是车、哪里是路、哪里是墙),不是一句概括。
这件事有个专门的名字:语义分割(semantic segmentation)。
2021 年之前的标准做法是把 CNN(比如 ResNet)当编码器,再堆一个复杂到离谱的解码器:空洞卷积、金字塔池化、密集上采样……这些模块把参数量推到 200M+,但效果也就那样。
arXiv 2105.15203(SegFormer) 用一个反直觉的设计把这件事正面拆开:
编码器只用"分层 Transformer + 不带位置编码",解码器只用"一个 4 层 MLP"——两者拧成一根绳,参数量砍到 5× 以下、精度反而涨了 2.2%。
为什么这事值得每个做"看图"产品的人关心
今天任何"AI 看图"的应用——自动驾驶、工业质检、医学影像、遥感、AR 滤镜——底层都离不开像素级分类:
- 自动驾驶:城市道路上几百个类别同时预测,错一个就是事故
- 工厂表面检测:金属、织物、PCB 板的瑕疵需要精确像素定位
- 医学影像:肿瘤与正常组织的边界需要毫米级对齐
- 遥感:农作物分类、城市扩张、灾害评估都是密集预测
- AR / 直播:实时背景分割必须 25 FPS 以上
但现状是:
- CNN encoder + 重解码器:参数 200M+,推理慢、部署贵、跨分辨率掉性能
- ViT 类方案:全局自注意算力爆炸,对测试分辨率敏感
- Mask2Former / SAM:2022+ 才出,而且很贵——不是所有场景都值得
SegFormer 的核心价值是:给了一条"简单到离谱"的 baseline,工业界可以无脑抄。
一句话核心
SegFormer = 分层无位置编码的 Transformer 编码器 + 纯 MLP 解码器;ADE20K 上以 64M 参数拿到 50.3% mIoU,比同期 SETR / Swin 小 5×、好 2.2%;Cityscapes-B5 84.0% mIoU + Cityscapes-C 零样本鲁棒性;6 个 checkpoints(B0~B5)覆盖从 Jetson edge 到服务器全档部署。
三个洞察
洞察 1:去掉位置编码是这篇论文最反直觉的设计
2017-2021 年所有 Transformer 视觉模型都默认带位置编码(PE),大家普遍认为 PE 是"Transformer 看到图像空间结构的必要工具"。
SegFormer 的实验结论是反的:
传统设计:ViT 编码器 + 显式位置编码(双线性插值)
→ 测试分辨率变化时,PE 分布漂移、性能显著下降
SegFormer:分层 Transformer + 完全不带 PE
→ 用 overlap patch embedding 与 Mix-FFN(FFN 内嵌 3×3 卷积)
替代 PE,让网络"自己学"出隐含位置
关键工程细节:
- 分层结构:4 个 stage,每个 stage 把空间降采样 2 倍、维度翻倍,产出
H/4, H/8, H/16, H/32四尺度特征 - Mix-FFN:用
MLP + 3×3 Conv + MLP替代纯 MLP-FFN,把局部归纳偏置"塞进" FFN 内部 - 重叠 patch embedding:相邻 patch 重叠采样,避免 PE 又保留位置信息
翻译成大白话:这不是"模型更复杂"的事,而是"模型更敢砍"的事——把 ViT 默认带的两件套(PE + 复杂解码器)一起拿掉,结果反而更好、更鲁棒。
洞察 2:all-MLP 解码器证明"密集预测不一定需要 ASPP / FPN"
传统分割解码器(DeepLab 系列、Swin-U 等)几乎默认要 ASPP(空洞卷积金字塔)、FPN(特征金字塔)、U-Net 风格密集上采样。SegFormer 的实验结论再次反直觉:
传统解码器:4 个尺度特征 → ASPP → FPN → 上采样 → seg_map
→ 参数量经常比编码器还大
SegFormer:4 个尺度特征 → 各过一个 MLP → 上采样到统一尺度 → 拼接
→ 另一层 MLP → 双线性上采 4× → seg_map
为什么 MLP 够了:
- 4 个尺度的特征同时被融合到
H/4,每个像素位置都同时拿到局部(H/4 浅层)与全局(H/32 深层)的上下文 - 双轨注意同时存在 → 不需要额外 ASPP 模块
- 整个解码器参数量 < 5M,对比 SETR 的 100M+ 解码器是数量级差距
翻译成大白话:这篇论文告诉你"密集预测的算力黑洞"是历史包袱,不是物理必要——只要编码器本身就分层、不需要再补一次金字塔。
洞察 3:模型族 B0~B5 给出了一条完整的 latency / accuracy 曲线
SegFormer 不是单一模型,而是一族:
| 模型 | 参数量 | ADE20K mIoU | Cityscapes mIoU | 1080Ti / V100 FPS | Jetson FPS |
|---|---|---|---|---|---|
| SegFormer-B0 | 3.7M | 37.4 | — | ~120 | ~15 |
| SegFormer-B1 | 13.7M | ~42 | — | ~60 | ~8 |
| SegFormer-B2 | 27.4M | 46.5 | — | ~17 | ~3 |
| SegFormer-B3 | 47.3M | 49.4 | 81.7 | ~12 | ~2 |
| SegFormer-B4 | 64.1M | 50.3 | 82.6 | ~10 | ~1.5 |
| SegFormer-B5 | 84.7M | 51.8 | 84.0 | ~7 | ~0.8 |
工程上的价值是选型对齐:
- B0:edge / 移动端 < 15M 量级,Jetson 实时推理
- B2:通用平衡档,单卡 V100 17 FPS
- B4:精度上限参考,论文主报告
- B5:极致精度,Cityscapes 84% mIoU
翻译成大白话:这条曲线告诉你"不是把模型做大才好"——从 3.7M 到 84.7M,每一档都有清晰定位,工业选型直接抄表。
关键实验与数据
- ADE20K val B4:50.3% mIoU,64M params,比 SETR / Swin 小 5×、好 2.2%
- Cityscapes val B5:84.0% mIoU,84.7M params
- Cityscapes-C 零样本:B5 在 19 类噪声 / 天气扰动下退化幅度小于 SETR / Swin
- B2 推理速度:512×2048 Cityscapes,V100 / 1080Ti 上 ~17 FPS
- 6 个 checkpoints:B0~B5,覆盖从 edge 到服务器
- 开源:NVIDIA 官方 repo 提供 PyTorch 训练 / 推理 / ONNX 导出脚本
- Mix-FFN:FFN 内部嵌 3×3 卷积替代位置编码
- all-MLP decoder:仅 4 层 MLP,总参数 < 5M
⚠️ 事实存疑:B0 ADE20K mIoU = 37.4% 原文未精确标注;B5 ADE20K 给出 51.8% 与 51.5% 两个邻近数字,引用时建议注明"部分表给出 51.5%"。FPS 数据来源于 NVIDIA 官方复现 + 论文 auxiliary table,与论文 abstract 不一定完全对齐。
为什么这件事对 2026 年的视觉产品至关重要
如果你在做下面任何一种产品,SegFormer 的思路都值得今晚抄一抄:
| 你在做的产品 | 能抄的设计 |
|---|---|
| 自动驾驶(城市道路感知) | B3 / B4 + Cityscapes 预训练 + 你的 fine-tune |
| 工厂表面检测 | B0 / B1,Jetson edge 实时推理 |
| 医学影像分割 | B2 / B3 做 baseline,把 B0 当部署底线 |
| 遥感图像 | B4 + sliding window,注意 H/32 token 爆炸 |
| 实时视频分割(直播 / AR) | B0 / B1,1080Ti 60+ FPS |
| 工业部署 baseline | SegFormer-B2 当"效果底线",B0 当"延迟底线" |
| 做 closed-set 像素分类 | SegFormer encoder + 任意 decoder,避免上 SAM / Mask2Former |
一句话总结对你的启发:在密集预测任务里,先把所有"看起来必要"的复杂模块(PE、ASPP、FPN、重型 decoder)全部拿掉,跑一遍 SegFormer 的"裸奔" baseline,再决定要不要加回来。
一段给普通人的话
下次你让 AI 看一张图,它回你"这是一条繁忙的城市街道"——
不是 AI 不够聪明,是过去的视觉模型把"看图"理解成"理解图",而不是"看清图"。 你需要的是逐像素精确分类(哪里是车、哪里是路、哪里是墙),不是一句概括。
这件事有个专门名字:语义分割。
arXiv 2105.15203(SegFormer) 给的反直觉解法很工程师 💡:
编码器只用分层 Transformer + 不带位置编码—— 用 Mix-FFN 把局部归纳偏置塞进 FFN 内部,让网络"自己学"位置; 解码器只用一个 4 层 MLP—— 4 个尺度同时融合,局部 + 全局上下文双轨; 模型族从 3.7M 到 84.7M 全档可选—— edge 实时推理到服务器高精度全覆盖。
🎯 结果:
- ADE20K 上 64M 参数拿 50.3% mIoU——比同期 SETR / Swin 小 5×、好 2.2%
- Cityscapes 上 B5 拿 84.0% mIoU + Cityscapes-C 零样本鲁棒性
- 已开源 NVIDIA 官方 repo——ADE20K / Cityscapes 全量 fine-tune pipeline 直接抄
这种事 2026 年仍然值得抄 📐——
Mask2Former / SAM 是更晚的"通用分割"范式(2022+),但对 closed-set 像素分类场景,SegFormer 仍然是性价比最高的 baseline:
- 比 CNN encoder + 重解码器简单 5×
- 比 SETR / Swin 跨分辨率鲁棒
- B0 / B1 是真正的 edge / mobile 可用档位
而抄这种"裸奔即正义"的设计,正是我们擅长的 🛠️。
关联论文:2105.15203 原标题:SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers 状态:v1,2021-05 提交;NVIDIA 官方 PyTorch repo 仍持续维护 核心数字:ADE20K val 50.3% mIoU (B4, 64M params) · Cityscapes val 84.0% mIoU (B5)
三个标题变体
- 这张图里有多少辆汽车?——SegFormer 如何用一个 84M 参数的 Transformer 看清每一条街
- "密集预测不需要 ASPP / FPN"——SegFormer 用一个 4 层 MLP 解码器,把语义分割参数砍到 5× 以下
- 去掉位置编码 + 砍掉重型 decoder:SegFormer 给"看图"产品留了一条工业界能无脑抄的 baseline
小红书风格卡片文案(可直接发布)
🛣️ "AI 看图"为什么总像"隔靴搔痒"? 🛣️
你让 AI 看一张街景图,问"路上有几辆车、几棵树"—— 它回你"这是一条繁忙的城市街道" 🫠
听起来对,完全没用。 你需要的是逐像素精确分类—— 哪里是车、哪里是路、哪里是墙,每一像素都不能错。
这件事有个专门名字:语义分割(semantic segmentation)。
传统做法是 CNN encoder + 复杂到离谱的解码器—— 空洞卷积、金字塔池化、密集上采样全部堆满, 参数量推到 200M+,效果也就那样 😭
arXiv 2105.15203(SegFormer) 给了一个反直觉解法 💡:
编码器只用"分层 Transformer + 不带位置编码" 解码器只用"一个 4 层 MLP" 两者拧成一根绳,参数量砍到 5× 以下、精度反而涨 2.2%
🎯 三大关键设计:
1️⃣ 去掉位置编码是最大胆的反直觉
# 传统 ViT:显式位置编码(PE)+ 双线性插值
# → 测试分辨率一变 → PE 分布漂移 → 性能掉
# SegFormer:完全不带 PE
# → Mix-FFN:FFN 内嵌 3×3 卷积
# → 让网络"自己学"出隐含位置
# → 测试分辨率变化时鲁棒性显著提升
2️⃣ all-MLP 解码器证明"密集预测不需要 ASPP"
传统:4 尺度特征 → ASPP → FPN → 上采样 → seg_map
(参数量经常比 encoder 还大)
SegFormer:4 尺度特征 → 各过一个 MLP → 拼接 → MLP → 上采 4×
(decoder 参数 < 5M,对比 SETR 100M+)
3️⃣ B0~B5 全档覆盖 edge 到服务器
| 模型 | 参数 | ADE20K | Cityscapes | Jetson FPS |
|---|---|---|---|---|
| B0 | 3.7M | 37.4 | — | ~15 |
| B2 | 27.4M | 46.5 | — | ~3 |
| B4 | 64M | 50.3 | 82.6 | ~1.5 |
| B5 | 84.7M | 51.8 | 84.0 | ~0.8 |
📚 核心数字:
- ADE20K val B4:50.3% mIoU,64M params
- Cityscapes val B5:84.0% mIoU,84.7M params
- 比同期 SETR / Swin:小 5×、好 2.2%
- Cityscapes-C 零样本鲁棒性 > SETR / Swin
🛠️ 今晚就能抄的工业 baseline:
# 1. 装环境(NVIDIA 官方 repo)
git clone https://github.com/NVlabs/SegFormer.git
cd SegFormer && pip install -r requirements.txt timm
# 2. 快速推理(预训练 B4 on ADE20K)
python demo/demo.py \
--input-image street.jpg \
--output-path seg.png \
--model mit-b4 \
--checkpoint-path pretrained/mit_b4.pth
# 3. 你的领域 fine-tune(Cityscapes / 自有数据集)
python tools/train.py \
--config configs/segformer/B4/cityscapes.yaml \
--epochs 160 --batch-size 2 --lr 6e-5
# 4. 导出 ONNX(部署到生产)
python tools/onnx_export.py \
--config configs/segformer/B2/cityscapes.yaml \
--checkpoint pretrained/mit_b2.pth \
--output segformer_b2.onnx
💡 为什么每个"AI 看图"团队都该抄?
今天任何"看图"应用都绕不开像素级分类: 🚗 自动驾驶(城市道路感知)→ 几百个类别同时预测 🏭 工厂表面检测 → 金属 / 织物 / PCB 瑕疵定位 🩺 医学影像分割 → 肿瘤与正常组织毫米级边界 🛰️ 遥感 → 农作物 / 城市扩张 / 灾害评估 📱 AR / 直播 → 实时背景分割必须 25 FPS+
SegFormer 第一次给了一条"简单到离谱"的 baseline—— 比 CNN+重 decoder 简单 5×, 比 SETR / Swin 跨分辨率鲁棒, B0 / B1 是 edge / mobile 真可用档位 🎯
而抄这种"裸奔即正义"的设计,正是我们擅长的 🛠️
⚠️ 坑也得提一句:
- 2048×2048+ 遥感原图会撞 H/32 token 爆炸——需要 sliding-window + overlap
- B5 fine-tune 需大显存(V100 32GB 仅 batch=2)——gradient accumulation 或 ZeRO 必备
- closed-set 设计:类别集合变了就要重训——open-vocabulary 场景需要换 SAM / Mask2Former
- B0 / B1 的 ADE20K 数字原文未精确标注,引用时要避免当作"绝对 SOTA"
- ⚠️ 2022+ 的 Mask2Former / SAM 在通用分割 / open-vocabulary已显著超越——SegFormer 是 closed-set 性价比之王,不是 research 贡献源