基于Transformer的图像分割算法:Segmenter
字数 2669 2025-10-29 21:04:18
基于Transformer的图像分割算法:Segmenter
题目描述
Segmenter是一种基于Transformer架构的端到端图像语义分割方法。与传统使用卷积神经网络(CNN)作为主干网络的方法不同,Segmenter直接采用标准的Vision Transformer(ViT)模型来提取图像特征,并利用一个解码头(Decoder)将这些特征映射为每个像素的类别标签。其核心创新在于用Transformer的全局自注意力机制来建模图像中所有像素块(patch)之间的长距离依赖关系,从而避免了CNN中感受野有限的局限性,尤其擅长处理复杂场景和大型物体。
解题过程循序渐进讲解
第一步:问题定义与图像预处理
- 目标:将输入图像中的每一个像素分配一个语义类别标签(如“人”、“车”、“天空”)。
- 输入:一张RGB图像,尺寸为 H x W x 3。
- 输出:一个尺寸为 H x W 的分割图,其中每个位置的值是该像素对应的类别索引。
- 预处理:将输入图像调整为固定尺寸(例如,512x512),并将其分割成一系列不重叠的图像块(patches)。例如,将图像划分为 16x16 的块,那么一张512x512的图像会被划分为 (512/16) * (512/16) = 1024个块。每个块(16163=768维)会被展平并线性投影到一个D维的嵌入向量(例如D=768)。这个过程将图像转换为一个由1024个D维向量组成的序列。
第二步:构建输入序列与位置编码
- 图像块嵌入:经过第一步,我们得到了一个代表图像视觉内容的序列 \(X_{patches} \in \mathbb{R}^{N \times D}\),其中N是块的数量(1024)。
- 分类令牌:类似于ViT,我们在序列的开头添加一个可学习的[class]令牌(一个D维向量)。这个令牌在后续的Transformer层中会聚合全局的图像信息。
- 位置编码:由于Transformer本身不具备感知序列顺序的能力,我们需要向每个图像块嵌入(包括[class]令牌)添加位置编码。这个位置编码也是一个可学习的D维向量,用于指示每个块在原始图像中的空间位置。最终,输入到Transformer编码器的序列是 \(Z_0 = [X_{class}; X_{patches}] + E_{pos}\),其中 \(E_{pos} \in \mathbb{R}^{(N+1) \times D}\) 是位置编码。
第三步:Transformer编码器提取特征
- 结构:Transformer编码器由L个相同的层堆叠而成(例如L=12或24)。
- 单层操作:每一层都包含两个核心子层:
- 多头自注意力(MSA):这是关键步骤。对于序列中的每一个元素(包括[class]令牌和所有图像块),自注意力机制会计算它与序列中所有其他元素的关联权重。这使得每个图像块都能直接“看到”并整合来自图像任何位置的信息,从而捕获全局上下文。多头机制允许模型在不同的表示子空间中共同关注信息。
- 前馈网络(FFN):一个简单的多层感知机,独立地应用于每个序列元素,用于进行非线性变换。
. 每个子层周围都应用了残差连接和层归一化(LayerNorm),以利于深度网络的训练。
- 输出:经过L层编码后,我们得到编码后的序列 \(Z_L = [z_{L}^{class}; z_{L}^{patch_1}; ...; z_{L}^{patch_N}]\)。其中,\(z_{L}^{class}\) 这个向量已经包含了整个图像的全局上下文信息。而 \(z_{L}^{patch_1}\) 到 \(z_{L}^{patch_N}\) 这些向量则包含了丰富的、融入了全局信息的局部特征。
第四步:解码头生成分割图
- 任务:将Transformer编码器输出的图像块特征序列(每个特征对应原图的一个块)上采样,恢复成原始图像分辨率(H x W)的分割图。
- 方法一(纯Transformer解码头):
- 将[class]令牌向量 \(z_{L}^{class}\) 丢弃。我们使用所有图像块对应的特征 \(Z_L^{patches} \in \mathbb{R}^{N \times D}\)。
- 将这些特征(形状为N x D)重新排列成2D空间网格格式,其空间分辨率为 \(\frac{H}{P} \times \frac{W}{P}\)(P是块大小,如16)。此时,这个特征图的分辨率很低。
- 使用一个简单的点卷积(1x1卷积)或线性层,将这个D维特征映射到K维(K是类别数),得到一个低分辨率的分割图(\(\frac{H}{P} \times \frac{W}{P} \times K\))。
- 最后,使用双线性插值将这个低分辨率分割图直接上采样到原始图像尺寸(H x W)。
- 方法二(更精细的解码头):为了获得更精确的边界,可以设计更复杂的解码头。例如,可以从Transformer编码器的不同层(而不仅仅是最后一层)提取多尺度的图像块特征,将它们组合起来,然后使用一个轻量级的CNN式 decoder(包含一些转置卷积层)来逐步上采样,融合多尺度信息,最终输出高分辨率分割图。
第五步:损失计算与模型训练
- 损失函数:最终输出的分割图尺寸为H x W x K,代表每个像素属于K个类别的概率(通常经过softmax激活)。训练时,将预测结果与真实的分割标签图(尺寸H x W)进行比较。
- 常用损失:由于语义分割是一个像素级的分类任务,并且类别间通常存在不平衡问题(如“天空”像素远多于“交通标志”像素),因此最常用的损失函数是交叉熵损失,有时会结合Dice损失来优化分割区域的重叠度。
- 训练过程:通过反向传播和梯度下降算法(如AdamW),最小化损失函数,从而优化整个Segmenter模型(包括Transformer编码器和解码头)的所有参数。
总结
Segmenter算法的核心流程是:图像 -> 分块线性投影 -> (加入位置编码)-> Transformer编码器(捕获全局依赖)-> 解码头(上采样并分类)-> 像素级预测。它展示了如何将自然语言处理中成功的Transformer架构直接、有效地应用于密集预测的视觉任务,其优势在于能够通过自注意力机制高效地建模图像全局上下文。