论文题目:Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers
论文地址:https://arxiv.org/pdf/2012.15840
这篇论文提出了一种新的语义分割方法,称为SETR(SEgmentation TRansformer)。
- 将语义分割视为序列到序列的预测任务。
- 使用纯transformer(没有卷积和分辨率降低)将图像编码为一系列图像块。
- transformer的每一层都对全局上下文进行建模。
实现方法

图像转换为较短序列
Transformer模型擅长处理一维的序列数据(如句子),而图像是二维的,所以需要一种方法来把二维图像转换成一维序列,同时保留图像的空间(位置)信息。
例如,一个大小为480x480的图像,直接把图像的每个像素点平铺成一个一维的向量(例如,480x480x3 = 691,200个像素值)是不现实的,因为这种方法会生成一个非常长的序列,导致计算量太大,模型无法有效处理。
1.将图像分成小块(网格块):
把图像分成很多小的网格块。例如,如果图像是 480×480,我们可以把它分成 16×16的小块。
2.向量化网格块:
把这些网格块“展平”成一个个一维的向量。想象一下,把一个小块里的所有像素值排成一个长条,这个长条就是一个向量。
3. 线性投影函数:
线性投影的目的是将一个高维度的输入向量(如 𝑝)转换成一个较低维度的输出向量(如 𝑒)。这种转换使用一个线性变换,通常由一个权重矩阵 𝑊 和一个偏置向量
𝑏 定义。
线性投影的公式如下:
e
=
p
⋅
W
+
b
e=p⋅W+b
e=p⋅W+b
- p:输入的向量(例如,大小为16x16x3=768)。
- 𝑊:线性投影的权重矩阵。它的大小是 768 × C 768×C 768×C,其中 𝐶 是我们想要的输出维度(例如,512)。
- 𝑏:偏置向量,它的大小是 𝐶(例如,512)。
- e e e: [ e 1 , e 2 , e 3 , . . . , e 512 ] [e_1,e_2,e_3,...,e_{512}] [e1,e2,e3,...,e512]
4. 位置嵌入(Positional Embedding):
因为Transformer模型本身是没有顺序的(它是“无序的自注意力机制”),我们需要告诉它每个网格块在图像中的位置。为此,我们为每个网格块生成一个位置嵌入(一个特定的向量 p i p_i pi ),这个向量编码了这个网格块的位置信息。
5. 组合特征和位置信息:
最后,为了形成Transformer的输入序列,我们把每个网格块的特征向量 e i e_i ei和它的位置嵌入 p i p_i pi相加,得到最终的输入向量 E = { e 1 + p 1 , e 2 + p 2 , . . . , e L + p L } E = \{e_1+p_1,e_2+p_2,...,e_L+p_L\} E={e1+p1,e2+p2,...,eL+pL},这个序列 𝐸既包含了每个网格块的特征信息,又包含了它们在图像中的位置。
transformer
1. 输入1D嵌入序列 E E E
transformer的输入是上一步骤得到的1D嵌入序列 E E E
2. transformer编码器的结构
transformer 的 encoder是一个有很多层的模型,每一层有两部分:多头自注意力(MSA)机制和多层感知器(MLP)块。
3. 自注意力计算
帮助模型理解输入数据中的各个部分如何互相关联。在每一层
l
l
l,模型需要计算:query、key、value。
q
u
e
r
y
=
Z
l
−
1
W
Q
,
k
e
y
=
Z
l
−
1
W
K
,
v
a
l
u
e
=
Z
l
−
1
W
V
query = Z^{l-1}W^Q, key = Z^{l-1}W^K, value = Z^{l-1}W^V
query=Zl−1WQ,key=Zl−1WK,value=Zl−1WV
- Z l − 1 Z^{l-1} Zl−1是上一层的输出(或初始输入)。
- W Q , W K , W V W^Q,W^K,W^V WQ,WK,WV是学习到的参数矩阵。
4. 自注意力(SA)公式
自注意力操作计算每个部分(或块)之间的关系,确定哪些部分更重要,哪些部分需要更多的关注。
SA
(
Z
l
−
1
)
=
Z
l
−
1
+
softmax
(
Z
l
−
1
W
Q
(
Z
l
−
1
W
K
)
⊤
d
)
(
Z
l
−
1
W
V
)
\text{SA}(Z^{l-1}) = Z^{l-1} + \text{softmax}\left( \frac{Z^{l-1} W^Q (Z^{l-1} W^K)^\top}{\sqrt{d}} \right)(Z^{l-1} W^V)
SA(Zl−1)=Zl−1+softmax(dZl−1WQ(Zl−1WK)⊤)(Zl−1WV)
- softmax 将注意力得分转换为概率形式,确保所有得分的总和为1.
- 最后的结果是一个新的向量,包含了图像各部分之间的关系信息。
5. 多头自注意力(MSA)
自注意力的升级版本,不是只计算一次注意力,而是计算多次。
每个头会看图像的不同部分或不同角度,将这些信息结合起来,可以捕捉到图像中更多的细节和复杂关系。
MSA
(
Z
l
−
1
)
=
[
SA
1
(
Z
l
−
1
)
;
SA
2
(
Z
l
−
1
)
;
⋯
;
SA
m
(
Z
l
−
1
)
]
W
O
\text{MSA}(Z^{l-1}) = [\text{SA}_1(Z^{l-1}); \text{SA}_2(Z^{l-1}); \cdots; \text{SA}_m(Z^{l-1})] W^O
MSA(Zl−1)=[SA1(Zl−1);SA2(Zl−1);⋯;SAm(Zl−1)]WO
- W O W^O WO是另一个权重矩阵,用于将所有的头的结果合并成一个新的向量。
6. 多层感知器(MLP)块和输出
MLP是一个简单的神经网络结构,它进一步处理多头自注意力的输出结果。
Z
l
=
MSA
(
Z
l
−
1
)
+
MLP
(
MSA
(
Z
l
−
1
)
)
∈
R
L
×
C
Z^l = \text{MSA}(Z^{l-1}) + \text{MLP}(\text{MSA}(Z^{l-1})) \in \mathbb{R}^{L \times C}
Zl=MSA(Zl−1)+MLP(MSA(Zl−1))∈RL×C
这个公式表示每一层的输出是通过两部分:MSA的结果和MLP处理过的结果相加而得(类似于“残差连接”,用来防止信息丢失和梯度消失)。
7. 层归一化(Layer Normalization)
层归一化是一种技术,用于使模型更稳定、更快地收敛。它标准化每一层的输出,以防止值太大或太小。
虽然这一步在公式中省略了,但在实际应用中它是很重要的步骤。
8. 多层特征表示
最后,经过多层处理,模型会生成多层次的特征表示,这些特征可以用来做很多事情,比如图像分类、对象检测等。
这些特征表示为
{
Z
1
,
Z
2
,
.
.
.
,
Z
L
e
}
\{Z^1,Z^2,...,Z^{Le}\}
{Z1,Z2,...,ZLe},每一层的特征表示捕捉了图像中的不同信息和关系。
解码器的三种设计
- Naive Upsampling(简单上采样,Naive)
- Progressive Upsampling(渐进式上采样,PUP)
- Multi-Level Feature Aggregation(多层次特征聚合,MLA)
1. Naive Upsampling(简单上采样)
- 使用一个简单的两层网络(1x1卷积+批归一化+1x1卷积)将编码器的输出特征转换为类别维度。
- 然后直接用双线性插值方法把特征图上采样到原始图像的分辨率。
- 最后,每个像素进行分类,输出最终的分割结果。
2. Progressive Upsampling(渐进式上采样,PUP)
- 将编码器的输出特征一步一步地逐步放大,每次放大2倍。
- 每次放大之间,使用卷积层进一步提取特征,这样在放大的过程中能够更好地恢复图像的细节和边缘。
3. Multi-Level Feature Aggregation(多层次特征聚合,MLA)
- 从编码器的多个层次提取特征,这些层次在整个编码器结构中均匀分布。
- 每个层次的特征通过卷积层进一步处理,确保不同尺度的信息能够被有效提取和整合。
- 将每个处理过的特征图进行融合(通过逐元素相加和通道连接),形成最终的高分辨率特征图。
7990

被折叠的 条评论
为什么被折叠?



