Transformer杀进来了——从SETR到SegFormer,全局上下文才是王道
前面三篇聊的全是CNN的天下这篇咱们进入后CNN时代——Transformer在分割领域的崛起。2020年ViT出来后CV圈经历了一场大地震——原来在NLP里称王的Transformer在图像任务上也能碾压CNN。分割领域当然没闲着各种把Transformer塞进分割的工作如雨后春笋般冒出来。ViT给分割带来的降维打击ViT的核心逻辑是把图像切成固定大小的patch比如16x16每个patch当作一个token然后像处理句子里的单词一样用Transformer的注意力机制来建模所有patch之间的全局关系。这对分类任务来说是革命性的——一张224x224的图切成196个patch自注意力让每个patch都能直接看到另外195个patch。CNN要通过几十层卷积才能把左上角和右下角的信息融到一起Transformer在第一层就做到了。这种全局感受野的能力正是分割任务梦寐以求的。但直接把ViT搬到分割上有三个问题第一计算复杂度。分类只输出一个全局类别分割要输出每个像素的标签。如果你用ViT的patch大小为16x16输出就是14x14的网格每个网格对应16x16像素。这14x14的粗粒度网格怎么可能用来做精细分割要精细分割就得把patch大小缩小到4x4或8x8token数量从196暴增到784或3136自注意力的O(n²)复杂度直接炸了。第二位置信息丢失。ViT的自注意力是无序的——它不管谁在谁旁边全靠位置编码来告诉模型空间位置。但分割任务对相邻像素属于同一物体这个空间连续性要求极高光靠位置编码不够。第三多尺度建模。分割需要同时关注大尺度和小尺度的信息。ViT的单尺度patch切分方式天然就比CNN的金字塔式多尺度特征提取要吃亏。SETR——第一个吃螃蟹的SETRSegmentation Transformer是2021年最早把ViT用进分割的工作之一。它的做法很直接用ViT做编码器输出一组特征序列然后用一个轻量级的解码器把序列重新组装成分辨率更高的特征图最后上采样做像素级分类。SETR证明了Transformer在分割上确实有潜力但它的缺陷也很明显计算量巨大、需要大量数据预训练、在小数据集上表现不如DeepLabv3。而且它的解码器设计偏简单没有充分利用ViT的多层特征。Swin Transformer——把窗口引入TransformerSwin Transformer是2021年微软亚洲研究院的工作它的核心创新是移位窗口注意力。简单理解就是把图像划分成一个个小的窗口比如7x7注意力只在窗口内部计算这样复杂度从O(n²)降到了O(n)。然后每一层把窗口的位置移位一下让窗口之间的边界信息也能流通。经过多层这样的窗口内注意力窗口间移位整个图像的信息最终能全局传播。Swin Transformer在ImageNet上做到了比ViT更高的精度而且计算效率大幅提升。分割领域很快就跟进了——Swin成了很多分割模型的首选backbone替换掉ResNet精度直接涨好几个点。SegFormer——大道至简如果说Swin Transformer是用复杂的设计解决了Transformer的效率问题那SegFormer就是用更聪明的简化解决了同样的问题。SegFormer的设计哲学可以总结为去掉一切花哨的东西只保留Transformer的核心能力然后把解码器做得极轻极简。具体来说编码器用了类似ViT的结构但每层输出不同分辨率的特征图类似于CNN的层级特征这样自然就获得了多尺度信息完全抛弃了位置编码——作者认为位置编码在分割任务上弊大于利因为测试图像的大小可能跟训练时不同位置编码插值会带来误差解码器极简——就是一个简单的MLP层把所有尺度的特征聚合起来直接做像素级预测没有任何复杂的上采样和跳层连接结构SegFormer在ADE20K和Cityscapes上都刷到了当时的新SOTA而且速度比很多基于CNN的模型还快。最关键的是它的设计极其干净——你能用几十行PyTorch把整个网络搭出来没有什么黑魔法。Transformer分割的现状——赢了精度输了工程到了2026年的今天Transformer已经在分割领域的精度指标上全面超越了CNN。你去翻各个数据集ADE20K、Cityscapes、COCO-Stuff的Leaderboard排在前面的清一色是基于Transformer或者混合架构的。但工业界的情况是另外一回事。你去任何一个做智慧城市、工业质检、遥感分析的公司看看跑在生产环境里的模型超过一半还是DeepLabv3、U-Net、PSPNet这些CNN时代的老家伙。Transformer的模型要么推理太慢、要么显存占用太高、要么部署工具链不完善总有一个理由让你不敢上线。Transformer分割的工程困境集中体现在推理延迟一个SegFormer-B5在Cityscapes上跑512x1024的图在A100上能达到15FPS但客户用的Jetson AGX Orin上连5FPS都跑不到。而一个轻量化的DeepLabv3在同样的设备上能跑到20FPS。显存占用Transformer的自注意力机制在特征图分辨率较高时比如解码器上采样到1/4分辨率中间张量的大小能轻易把16GB显存撑爆。部署支持目前主流的推理框架TensorRT、ONNX Runtime、TFLite对Transformer算子的支持程度远不如CNN成熟。你导出一个SegFormer的ONNX文件在PC上用TensorRT跑没问题换到手机端的TFLite上可能就有算子不支持。Transformer在分割领域的下一步在哪儿我个人觉得方向有三个方向一效率优化。既然Transformer推理慢那就想方设法让它变快。窗口注意力Swin、可变形注意力Deformable DETR的思路搬过来、稀疏注意力、混合架构CNNTransformer混合这些都是既保留Transformer的全局能力、又降低计算代价的尝试。方向二预训练范式的变革。ViT能在分类上超越CNN很大程度是因为它用了大规模预训练JFT-300M、ImageNet-21K。分割领域能不能也用海量数据做预训练然后快速适配下游任务SAM的大规模预训练已经证明了这条路走得通下篇聊但分割的预训练比分类难多了——你需要像素级标注的数据来做预训练成本太大。方向三统一架构。我们现在有检测用DETR分割用Mask2Former分类用ViT能不能一个Transformer框架把所有视觉任务全干了Google的ViT-22B、Meta的SAM已经在朝这个方向走了。统一的好处是系统架构简化、知识共享、多任务协同但代价是模型大得离谱、训练成本高到只有大厂玩得起。我的态度拥抱Transformer但不盲从我这几年做项目的态度是在新项目里优先尝试Transformer方案但保留一条退回CNN的后路。如果数据量大、算力充足、精度要求高SegFormer或者Mask2Former往往是更好的选择。如果数据量小、要跑在边缘设备上、客户要求快速交付DeepLabv3或者U-Net依然是更稳妥的路线。技术选型不是非此即彼是看场景下菜碟。谁能在同样的数据、同样的算力、同样的延迟约束下给出更好的精度谁就是好模型。至于是CNN还是Transformer实现的客户根本不关心。