1. 项目概述
SETR(Segmentation Transformer)是2020年12月提出的首个基于纯Transformer架构的语义分割模型,它彻底改变了传统CNN主导的语义分割范式。作为一名长期从事计算机视觉研究的工程师,我第一次读到这篇论文时就被其创新性所震撼——它成功地将Transformer的自注意力机制应用于像素级预测任务,这在当时是一个极具挑战性的突破。
1.1 语义分割任务解析
语义分割是计算机视觉中的基础任务之一,与图像分类相比,它需要更精细的预测能力。让我用一个实际案例来说明两者的区别:
假设我们有一张城市街景照片:
- 图像分类任务只需要判断这张图片包含"城市"、"车辆"、"行人"等类别标签
- 语义分割则需要精确标注每个像素属于哪一类(如道路、建筑、行人等)
这种像素级的预测需求带来了几个关键挑战:
- 需要保留完整的空间结构信息
- 必须处理多尺度对象(从大型建筑到小型交通标志)
- 需要精确的边界划分能力
传统CNN-based方法(如FCN、U-Net)通过编码器-解码器结构和跳跃连接来解决这些问题。而SETR的创新之处在于,它完全摒弃了CNN,使用纯Transformer架构来处理这些挑战。
1.2 SETR的核心创新
SETR的核心思想是将语义分割重新定义为序列到序列(Seq2Seq)的任务。具体来说:
- 将输入图像分割为固定大小的patch,并将每个patch视为一个"词"
- 使用标准的Transformer编码器处理这些patch序列
- 通过专门设计的解码器将序列输出转换回2D分割图
这种设计带来了几个显著优势:
- 全局感受野:自注意力机制可以捕获图像中任意两个位置之间的关系
- 更好的长距离依赖建模:克服了CNN局部感受野的限制
- 统一的架构:可以使用标准的Transformer组件
在实际应用中,我们发现SETR特别适合处理需要全局上下文理解的场景,如城市街景中的道路和建筑分割。传统的CNN方法在这些场景中往往会因为局部感受野而出现不一致的预测结果。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 模型架构详解
2.1 输入预处理
SETR的输入处理流程是其成功的关键之一。让我们深入解析这一过程:
2.1.1 Patch划分与嵌入
-
图像分块:将输入图像X∈R^(H×W×3)划分为N=(H/P)×(W/P)个P×P大小的patch
- 典型配置:P=16,对于512×512输入,得到32×32=1024个patch
- 每个patch展平后维度:P×P×3=768(当P=16时)
-
线性投影:通过可学习的矩阵E∈R^(768×D)将每个patch投影到D维嵌入空间
- 论文中使用D=1024(Large模型)
- 这一步实际上相当于一个stride=P的卷积操作
-
位置编码:添加可学习的位置编码PE∈R^(N×D)
- 不同于ViT,SETR支持位置编码插值,可以处理不同分辨率的输入
- 这是分割任务的一个重要改进,因为测试时可能需要处理不同尺寸的输入
python复制# 伪代码示例:SETR的patch嵌入实现
class PatchEmbed(nn.Module):
def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768):
super().__init__()
self.proj = nn.Conv2d(in_chan
