深度学习——SETR(Segmentation Transformer)学习(2020.12)

文章目录

  • 一、概述
    • [1.1 语义分割](#1.1 语义分割)
    • [1.2 SETR](#1.2 SETR)
  • 二、结构
    • [2.1 输入预处理](#2.1 输入预处理)
    • [2.2 Encoder结构](#2.2 Encoder结构)
    • [2.2 Decoder(解码器)](#2.2 Decoder(解码器))
      • [2.2.1 基础上采样(Naive Upsampling)](#2.2.1 基础上采样(Naive Upsampling))
      • [2.2.2 渐进式上采样(Progressive Upsampling)](#2.2.2 渐进式上采样(Progressive Upsampling))
      • [2.2.3 多层次特征聚合(Multi-Level Feature Aggregation)](#2.2.3 多层次特征聚合(Multi-Level Feature Aggregation))
    • [2.3 输出](#2.3 输出)
  • 三、总结

一、概述

1.1 语义分割

图像分类和语义分割:

  • 图像分类:输入一张图片,输出一个或多个类别。只关心整张图的主体是什么,不关心位置、形状、边界。模型关心全局语义、整体特征,不需要空间细节,不需要位置信息。
    • CNN:ResNet、VGG、MobileNet
    • Transformer:ViT

输入:一张猫的照片。输出:cat

  • 语义分割:给每一个像素分类:这个像素是:人?车?路?天空?猫?狗?背景?模型关心每个像素的类别、物体边缘、形状、位置、多尺度信息(大物体 + 小物体都要识别)。
    • CNN:FCN、U-Net、DeepLab
    • Transformer:SETR、SegFormer、Mask2Former

输入:城市街景图。输出:和原图一样大的彩色掩码图,每个颜色代表一类

维度 图像分类 语义分割
输出粒度 图像级别(1 个标签) 像素级别(H×W 个标签)
是否需要空间结构 不需要 必须要
是否需要边缘 / 形状 不需要 非常需要
输出形状 类别数C H×W×C
典型模型 ViT SETR
特征使用 只取全局特征 保留所有空间特征
损失函数 交叉熵(单标签) 逐像素交叉熵

1.2 SETR

SETR 是首个纯 Transformer 做语义分割的主流模型,把语义分割看作序列到序列(Seq2Seq)任务,用纯 Transformer 编码器替代传统 CNN 编码器。

论文标题:Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers

论文链接https://arxiv.org/abs/2012.15840

官方代码https://github.com/fudan-zvg/SETR

二、结构

对于SETR,本质是VIT+Decoder结构,其中Decoder主要由三种设计。

2.1 输入预处理

输入:将图像张量 (H,W,3) 转换为嵌入序列 (L,C),为 Transformer 输入做准备。
X ∈ R H × W × C (高度 H )(宽度 W )(通道数 C , R G B 为 3 ) \mathbf{X} \in \mathbb{R}^{H \times W \times C} (高度H)(宽度W)(通道数C,RGB 为 3) X∈RH×W×C(高度H)(宽度W)(通道数C,RGB为3)

  • Patch划分:将图像均匀划分为固定大小的 Patch(默认 16×16)
  • Patch展平:将每个 Patch 展平为向量。
    分块数量: N u m p a t c h e s = H P × W P 。每个块为: X p ∈ R ( P × P × C ) 分块数量:Num_{patches} = \frac{H}{P} \times \frac{W}{P}。每个块为:\mathbf{X_p} \in \mathbb{R}^{(P \times P \times C)} 分块数量:Numpatches=PH×PW。每个块为:Xp∈R(P×P×C)
  • 线性映射:通过线性投影层(Linear Projection)映射为 C 维的特征嵌入。(论文中C=1024)
    X 0 ∈ R N × C ( N 个 P a t c h ,每个 C 维) X_0∈\mathbb{R}^{N×C} (N个 Patch,每个C维) X0∈RN×C(N个Patch,每个C维)
  • 位置编码:Transformer 本身无序,需为每个位置学习可训练的位置嵌入,与向量逐元素相加,得到最终输入序列,保留空间位置信息。
    X = X 0 + P E ∈ R N × C X=X_0+PE∈\mathbb{R}^{N×C} X=X0+PE∈RN×C
处理 步骤 ViT SETR 结论
1 Patch 切分 将图像切成固定大小的非重叠 Patch(如 16×16) Patch 尺寸可选更多(如 16×16/8×8),且支持更大输入分辨率(如 512×512) 逻辑一致,SETR 为适配分割的高分辨率需求,放宽了 Patch 尺寸 / 输入分辨率限制
2 Patch 展平 每个 Patch(16×16×3)展平为一维向量(768 维) 完全一致 无差异
3 线性映射 展平后的向量经线性层映射为固定维度 Token(如 768 维) 完全一致 无差异
4 位置编码 ①可学习的位置编码,维度与 Token 一致 ②固定尺寸:训练用 224×224 对应的 PE,推理时输入分辨率必须和训练一致 ①可学习的位置编码,维度与 Token 一致(和 ViT 相同) ②可插值的 PE:训练用固定尺寸 PE,推理时若输入分辨率不同,对 PE 做 bilinear 插值,适配新的 Token 数量 框架一致,SETR 对 PE 做了插值适配改造
5 Class Token 分类任务需要,在 Token 序列开头添加一个可学习的Class Token 分割任务不需要全局分类 Token,不添加Class Token 任务目标差异,但不影响核心输入结构

2.2 Encoder结构

Encoder:编码器由多个完全相同的 Transformer 层堆叠而成,每层包含核心组件:

  • 层归一化(Layer Norm):对输入序列做归一化,稳定训练;
  • 多头自注意力(MSA, Multi-Head Self-Attention):为每个位置生成查询(Query)、键(Key)、值(Value)向量(均来自同一输入);计算各位置与所有位置的注意力权重,实现全局感受野,建模长距离依赖;多头机制并行学习不同子空间的注意力模式,提升特征表达能力。
  • 残差连接(Residual Connection):将 MSA 输出与输入相加,缓解梯度消失;
  • 层归一化(Layer Norm):对序列做归一化,稳定训练;
  • 多层感知机(MLP):包含两层线性变换 + 中间 GELU 激活,进一步增强特征非线性表达,同样搭配残差连接与 Layer Norm。
  • 残差连接(Residual Connection):缓解梯度消失;

输出:

  • Naive/PUP Decoder仅用最后一层特征;
  • MLA Decoder用多层特征(如 L = 24 L=24 L=24时选 Z 6 , Z 12 , Z 18 , Z 24 Z_6,Z_{12},Z_{18},Z_{24} Z6,Z12,Z18,Z24)
    Z = X L ∈ R N × C Z=X_L∈\mathbb{R}^{N×C} Z=XL∈RN×C

论文提供两种编码器变体,适配不同算力与性能需求:

配置 嵌入维度C 编码器的层数 注意力头数 参数规模
T-Base 768 12 12 ~87M
T-Large 1024 24 16 ~305M

ViT 和 SETR 都复用上述这套结构,SETR 本质是基于 ViT 改造的语义分割模型。差异不在【单层怎么做】,而在【多层怎么用】。

差异维度 ViT(分类) SETR(分割) 差异原因
特征输出方式 ① 仅保留最后一层的输出; ② 只取Class Token或对所有Token全局池化; ③ 输出:[Batch, 1, Dim](全局特征) ① 保留所有层的输出,至少抽取关键层6/12/18/24; ② 保留所有 Token 的空间对应关系,不丢弃任何 Token; ③ 输出:[Batch, Num_Tokens, Dim](多层空间特征) ViT 只需全局语义 SETR 需要像素级特征
层数与参数量选择 ① 标准配置:12/16/24 层; ② 输入分辨率固定(224×224) ③ Token 数少(196),计算量可控 ① 优先用24 层大模型; ② 支持更高分辨率输入(如 512×512), ③ Token 数多(1024),但通过抽取多层而非全部层控制计算量 分割需要更强语义,需高分辨率保证精度
特征维度(Dim)适配 固定维度,仅服务于分类头 维度与 ViT 一致,但后续会将 [Batch, N, D] 转为 [Batch, D, H, W],维度作为通道数,适配卷积解码器 分割需空间结构
训练策略 / 正则化 ① 用 ImageNet 预训练,优化分类损失; ② 常用 Dropout、权重衰减 ① 先复用 ViT 的 ImageNet 预训练权重,再在分割数据集(如 Cityscapes)微调; ② 增加随机裁剪、翻转等数据增强; ③ 损失函数是逐像素交叉熵,而非图像级交叉熵 分割数据集标注成本高,预训练 + 微调是必选; 像素级任务需要更强的数据增强防止过拟合
自注意力计算 全局自注意力,所有Token 两两计算注意力),Token 数少,计算压力小 同样是全局自注意力,但 Token 数多,单注意力头计算量是 ViT 的27 倍;SETR 未改注意力机制,而是靠解码器渐进上采样缓解整体计算量 这是 Transformer 做分割的固有问题,SETR 选择不改 Encoder 注意力,改解码器的折中方案

2.2 Decoder(解码器)

将 Transformer 输出的序列 (N,L,C) 恢复为 2D 特征图 (N,H/16,W/16,C),再逐步上采样至输入分辨率 (N,H,W,K)(K 为类别数),输出像素级分割结果。

  • 特征重塑:Encoder 阶段的Flatten就像把一张完整的风景照片,按从左到右、从上到下的顺序卷成一根长条,这个过程是为了用 Transformer 高效建模全局特征。现在需要将 Encoder 输出的序列特征恢复为特征图,把这根长条重新展开,变回一张特征照片,为 Decoder 的空间上采样做准备。 Z ∈ R N × C ------ > Z 2 D = R e s h a p e ( Z ) ∈ R H P × W P × C Z∈\mathbb{R}^{N×C}------>Z_{2D}=Reshape(Z)∈\mathbb{R}^{\frac{H}{P} \times \frac{W}{P}×C} Z∈RN×C------>Z2D=Reshape(Z)∈RPH×PW×C

  • 上采样:Decoder 的核心是将【H/16,W/16】​的低分辨率特征图恢复为【H,W】的像素级分割。
    Z 2 D ∈ R H P × W P × C ------ > Y ∈ R H × W × K Z_{2D}∈\mathbb{R}^{\frac{H}{P} \times \frac{W}{P}×C}------>Y∈\mathbb{R}^{{H} \times{W}×K} Z2D∈RPH×PW×C------>Y∈RH×W×K

2.2.1 基础上采样(Naive Upsampling)

两步卷积降通道 + 一步 16 倍上采样。

  • 步骤1:两次1*1卷积映射通道。(C--->K)
    • 1×1 卷积的核心作用:仅改变通道数,空间尺寸(高 / 宽)完全不变。

Z c o n v = C o n v 1 × 1 ( C o n v 1 × 1 ( Z 2 D ) ) ∈ R H P × W P × K Z_{conv}=Conv_{1\times1}(Conv_{1\times1}(Z_{2D}))∈\mathbb{R}^{\frac{H}{P} \times \frac{W}{P}×K} Zconv=Conv1×1(Conv1×1(Z2D))∈RPH×PW×K

  • 步骤2:双线性上采样16倍,恢复原图尺寸,通道数不变
    • 双线性上采样不会凭空创造信息,而是对小特征图的每个像素,按 16 倍比例扩散,空缺的像素用周围 4 个像素的加权平均填充。
    • 先把 32×32 的特征图 铺 到 512×512 的画布上:
      • 小图的 (0,0) 像素 → 大图的 (0,0) 位置;
      • 小图的 (0,1) 像素 → 大图的 (0,16) 位置;
      • 小图的 (1,0) 像素 → 大图的 (16,0) 位置;
      • 以此类推,小图每个像素对应大图间隔 16 个像素的位置。
    • 填充空缺像素:
      • 比如大图 (0,1)~(0,15) 这些空缺位置,用小图 (0,0) 和 (0,1) 两个像素的 "距离加权平均" 计算值;
      • 再比如大图 (1,1) 位置,用小图 (0,0)、(0,1)、(1,0)、(1,1) 四个像素的加权平均计算值(这就是 "双线性" 的由来)。
        Y N a i v e = U p s a m p l e ( s c a l e = 16 ) ( Z c o n v ) ∈ R H × W × K Y_{Naive}=Upsample_{(scale=16)}(Z_{conv})∈\mathbb{R}^{H\times W\times K} YNaive=Upsample(scale=16)(Zconv)∈RH×W×K

2.2.2 渐进式上采样(Progressive Upsampling)

4 次 2× 渐进上采样 + 卷积降通道

  • 步骤1:4 次【2× 上采样】(累计 16×)+ 每次上采样前卷积细化。
    • 一次性 16 倍上采样:小特征图(如 32×32)直接放大到 512×512,插值填充的像素太多,容易丢失细节;
    • 4 次 2 倍分步上采样:32×32 → 64×64 → 128×128 → 256×256 → 512×512(每次只放大 2 倍),每次放大前用卷积 细化特征,让小尺寸特征先优化,再放大,细节更准确。
      Z i = U p s a m p l e ( s c a l e = 2 ) ( C o n v 3 × 3 ( Z i − 1 ) ) Z_i=Upsample_{(scale=2)}(Conv_{3\times 3}(Z_{i-1})) Zi=Upsample(scale=2)(Conv3×3(Zi−1))
    • i = 1 : R H 8 × W 8 × C i=1:\mathbb{R}^{\frac{H}{8}\times \frac{W}{8}\times C} i=1:R8H×8W×C
    • i = 2 : R H 4 × W 4 × C i=2:\mathbb{R}^{\frac{H}{4}\times \frac{W}{4}\times C} i=2:R4H×4W×C
    • i = 3 : R H 2 × W 2 × C i=3:\mathbb{R}^{\frac{H}{2}\times \frac{W}{2}\times C} i=3:R2H×2W×C
    • i = 4 : R H × W × C i=4:\mathbb{R}^{{H}\times {W}\times C} i=4:RH×W×C
  • 步骤2:最终1*1卷积映射类别(C--->K)
    Y P U P = C o n v 1 × 1 ( Z 4 ) ∈ R H × W × K Y_{PUP}=Conv_{1\times1}(Z_4)∈\mathbb{R}^{H\times W\times K} YPUP=Conv1×1(Z4)∈RH×W×K

2.2.3 多层次特征聚合(Multi-Level Feature Aggregation)

单流卷积降通道 + 单独上采样(4×)+ 多层特征融合 + 融合后(4×)

假设抽取 M = 4 层 E n c o d e r 特征( Z 6 , Z 12 , Z 18 , Z 24 ) M=4层Encoder 特征(Z_6,Z_{12},Z_{18},Z_{24}) M=4层Encoder特征(Z6,Z12,Z18,Z24),每层均为 R N × C \mathbb{R}^{N\times C} RN×C。

  • 步骤 1:单流特征处理(4 个流并行)
    • 卷积降通道:Conv1×1(1024→512)→Conv3×3(512→512)→Conv3×3(512→256)
    • 输出: R 256 × H 16 × W 16 \mathbb{R}^{{256}\times \frac{H}{16}\times \frac{W}{16}} R256×16H×16W
    • 4× 上采样: R 256 × H 4 × W 4 \mathbb{R}^{{256}\times \frac{H}{4}\times \frac{W}{4}} R256×4H×4W
  • 步骤 2:自上而下融合(跨层交互):从第 2 个流开始,将当前流特征与上一流特征逐元素相加。
    • F l ′ = F l + C o n v 3 × 3 ( F l − 1 ′ ) F_l^′=F_l+Conv_{3×3}(F_{l−1}^′) Fl′=Fl+Conv3×3(Fl−1′)
    • 融合后每个流仍为 R 256 × H 4 × W 4 \mathbb{R}^{{256}\times \frac{H}{4}\times \frac{W}{4}} R256×4H×4W
  • 步骤 3:拼接与最终上采样
    • 将 4 个流的 F l ′ F_l^′ Fl′拼接,维度 R 4 × 256 × H 4 × W 4 \mathbb{R}^{{4}\times{256}\times \frac{H}{4}\times \frac{W}{4}} R4×256×4H×4W
    • 4× 上采样:维度 R 1024 × H 4 × W 4 \mathbb{R}^{1024\times \frac{H}{4}\times \frac{W}{4}} R1024×4H×4W
    • 1×1 卷积映射类别
      Y M L A = C o n v 1 × 1 ( F ) ∈ R H × W × K Y_{MLA}=Conv_{1\times1}(F)∈\mathbb{R}^{H\times W\times K} YMLA=Conv1×1(F)∈RH×W×K

2.3 输出

将 Decoder 输出的高维特征图映射为【像素级类别概率分布】,并通过损失函数完成模型训练。

三、总结

关键创新点:

  • 纯 Transformer 分割范式:首次证明 Transformer 可独立完成语义分割任务,打破 CNN 在分割领域的垄断
  • 序列→空间的适配设计:通过【Patch Embedding 序列化】和【Reshape 反序列化】,解决 Transformer 序列特征与分割任务 2D 空间特征的适配问题
  • 多策略解码方案:提出 Naive/PUP/MLA 三种 Decoder,兼顾不同场景
  • 全局注意力优势:相比 CNN 的局部感受野,Transformer 的全局自注意力能更好捕捉图像长距离语义关联(如道路、建筑的全局布局),提升复杂场景分割精度。
相关推荐
xx_xxxxx_2 小时前
多模态动态融合模型Predictive Dynamic Fusion论文阅读与代码分析3-部分数学理论基础
论文阅读·机器学习·transformer·多模态
专业发呆业余科研2 小时前
深度反思不变学习:当 EIIL 失效时,如何通过“偏见诱导”重建环境标签?
人工智能·python·深度学习·神经网络·机器学习
醉酒柴柴2 小时前
word创建样式以后应用于所有新文件
开发语言·学习·c#·word
蛋白界小百灵2 小时前
【卡梅德】生物带您学习分子钓鱼术:噬菌体展示技术实验操作解析
学习
QQsuccess2 小时前
PyTorch保姆级安装教程
人工智能·pytorch·python·深度学习
糖果店的幽灵2 小时前
【大模型】大模型学习总结之机器学习 - 1.基础知识
人工智能·学习·机器学习
Hello.Reader2 小时前
深入理解学习率调度器原理、公式与 PyTorch 实战
人工智能·pytorch·学习
码喽7号2 小时前
Springboot学习五:MybatisPlus的快速上手
spring boot·学习·spring
云安全联盟大中华区2 小时前
[特殊字符] | OpenClaw威胁模型:MAESTRO框架分析
大数据·人工智能·深度学习·安全·ai