SETR 阅读笔记

前言

SETR是一篇CVPR2021的语义分割论文,论文将于语义分割视为Seq2Seq的预测任务,提出了一种解决语义分割问题的新思路。

1. 模型的特点

现有的语义分割模型大多都是基于FCN的Encoder-Decoder结构:Encoder用于学习图像特征,Decoder则基于Encoder学到的特征对图片中的每一个像素进行分类。其中,Encoder通常以卷积分类网络作为Backbone,将输入图片不断下采样以增加感受野,学习更加抽象的图像特征。但是,通过不断堆叠卷积层来增加感受野无法有效地学习图像信息中的远距离依赖关系。而这一点对于提升语义分割的效果十分重要。

为了解决这个问题,SETR完全舍弃卷积操作,Encoder将输入图像看作图像patch序列,通过全局注意力建模学习图像特征;Decoder利用从Transformer Encoder中学到的特征,将图像恢复到原始大小,完成分割任务。整个过程没有使用卷积操作,没有对图片进行下采样,而是在Encoder Transformer的每一层进行全局上下文建模,从而为语义分割问题的解决提供了新思路。

SETR的主要贡献如下:

  1. 区别于Encoder-Decoder结构,将语义分割问题重新定义为Seq2Seq问题
  2. Encoder完全使用Transformer框架,通过序列化的图像实现全局注意力特征提取
  3. 设计了三种不同复杂度的解码器。

2. 模型结构

SETR整体模型结构如下:
在这里插入图片描述

2.1 Encoder

Encoder的功能是将输入图像 x ∈ R C × H × W x \in \mathbb R^{C \times H \times W} xRC×H×W转化为序列 Z ∈ R L × C Z \in \mathbb R^{L \times C} ZRL×C。(img2seq)

输入图像等分为16个Patch,每一个Patch大小都是 H 16 × W 16 \frac{H}{16} \times \frac{W}{16} 16H×16W,可以拉伸为长度 L = H × W 256 L = \frac{H \times W}{256} L=256H×W的序列。将这16份Patch平展成一个序列,通过线性变换 f : p → e ∈ R C f: p \rightarrow e \in \mathbb R^{C} f:peRC,将每一个Patch映射到 C C C维向量空间中,转化为序列 x f ∈ R L × C x_f \in \mathbb R^{L \times C} xfRL×C。然后为每一个 e i e_i ei向量添加对应的位置编码 p i p_i pi,得到最终的输入序列 E = { e 1 + p 1 , e 2 + p 2 , … , e L + p L } E = \lbrace e_1 + p_1, e_2 +p_2, \ldots, e_L + p_L \rbrace E={e1+p1,e2+p2,,eL+pL}

将embeding序列 E E E输入到Transformer Encoder当中,Transformer Encoder由 L e L_e Le个Transformer层组成。其中第 l l l层的输入是 Z l − 1 ∈ R L × C Z^{l -1} \in \mathbb R^{L \times C} Zl1RL×C的向量,自注意力的输入是由 Z l − 1 Z^{l -1} Zl1计算得到的三维元组 ( q u e r y , k e y , v a l u e ) (query, key, value) (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=Zl1WQ,key=Zl1WK,value=Zl1WV

其中, W Q W_Q WQ W K W_K WK W V W_V WV是可学习权重矩阵,且 W Q / W K / W V ∈ R C × d W_Q/W_K/W_V \in \mathbb R^{C \times d} WQ/WK/WVRC×d d d d ( q u e r y , k e y , v a l u e ) (query, key, value) (query,key,value)的维度。

则自注意力可以表示为:

S A = Z l − 1 + s o f t m a x ( Q K T d ) V SA = Z^{l -1} + softmax(\frac{QK^T}{\sqrt {d}})V SA=Zl1+softmax(d QKT)V

多层自注意力即是由m个SA拼接起来得到, M S A ( Z l − 1 ) = [ S A 1 ( Z l − 1 ) ; S A 2 ( Z l − 1 ) ; ⋯   ; S A m ( Z l − 1 ) ] W O MSA(Z^{l - 1}) = [SA_1(Z^{l - 1}); SA_2(Z^{l - 1}); \cdots; SA_m(Z^{l - 1})]W_O MSA(Zl1)=[SA1(Zl1);SA2(Zl1);;SAm(Zl1)]WO,其中 W O ∈ R m d × C W_O \in \mathbb R^{md \times C} WORmd×C,最后 M S A MSA MSA的输出通过一个带有残差连接的全连接层得到Encoder的输出:
Z l = M S A ( Z l − 1 ) + M L P ( M S A ( Z l − 1 ) ) ∈ R L × C Z^l = MSA(Z^{l-1}) + MLP(MSA(Z^{l-1})) \in \mathbb R^{L \times C} Zl=MSA(Zl1)+MLP(MSA(Zl1))RL×C

进而有Transformer Encoder各层的输出 { Z 1 , Z 2 , … , Z L e } \lbrace Z^{1},Z^{2},\ldots,Z^{L_e} \rbrace {Z1,Z2,,ZLe}

2.2 Decoder

Decoder的目标是在原始的二维图像 ( H × W ) (H \times W) (H×W)上生成分割结果,需要将Encoder的输出 Z Z Z从二维 H W 256 × C \frac{HW}{256} \times C 256HW×Creshape为三维特征图 H 16 × W 16 × C \frac{H}{16} \times \frac{W}{16} \times C 16H×16W×C

设计了三种解码器:

(1)朴素上采样
使用一个简单的2层网络: 1 × 1 1 \times 1 1×1conv + batch norm + 1 × 1 1 \times 1 1×1conv,将将Transformer输出的 Z L e Z^{L_e} ZLe投影到类别个数的维度上(如Cityscapes中有19个类别),然后直接用双线性插值进行上采样得到原分辨率大小的输出。最后接一个逐像素计算交叉熵损失的分类层,得到每个像素的预测类别。

(2)渐进上采样(PUP)
直接一步上采样会引入很大的噪声,可以使用交替执行卷积和上采样的方法,将上采样倍数设置成2倍,减轻噪声。从 H 16 × W 16 \frac{H}{16} \times \frac{W}{16} 16H×16W Z L e Z^{L_e} ZLe得到原始图片大小,共需执行4次上采样操作。
在这里插入图片描述
(3)多层特征融合(MLA)
与特征金字塔相似的多级特征融合,但不同的是特征 Z L Z^L ZL来自各层Transformer并具有相同的分辨率。每隔 L e M \frac{L_e}{M} MLe层提取一层特征 { Z m } ( m ∈ { L e M , 2 L e M , … , M L e M ) \lbrace Z^m \rbrace (m \in \lbrace \frac{L_e}{M},2\frac{L_e}{M},\ldots,M\frac{L_e}{M}) {Zm}(m{MLe,2MLe,,MMLe),总共提取了 M M M条路径的特征。其中,每一层都是先将 Z L e Z^{L_e} ZLe H W 256 × C \frac{HW}{256} \times C 256HW×Creshape到 H 16 × W 16 × C \frac{H}{16} \times \frac{W}{16} \times C 16H×16W×C,然后使用一个三层神经网络进行处理(卷积核大小 1 × 1 1 \times 1 1×1 3 × 3 3 \times 3 3×3 3 × 3 3 \times 3 3×3),在第一层和第三层分别将通道数减半,然后在第三层之后进行4倍双线性插值上采样。并且从第2条路径开始,依次融合前面路径的特征,增强每条路径间的信息交互,再次经过一个 3 × 3 3 \times 3 3×3的卷积层后,将每条路径得到的特征图进行通道维度的拼接,并采用4倍双线性插值进行上采样,恢复出原图尺寸。
在这里插入图片描述

3. 思考与分析

SETR完全采用ViT-large作为encoder有以下几个缺点:

(1) ViT-large 参数和计算量非常大,有300M+参数,这对于移动端模型是无法承受的;
(2) ViT的结构不太适合做语义分割,因为ViT是柱状结构,全程只能输出固定分辨率的feature map, 比如1/16, 这么低的分辨率对于语义分割不太友好,尤其是对轮廓等细节要求比较精细的场景。
(3) ViT的柱状结构意味着一旦增大输入图片或者缩小patch大小,计算量都会成平方级提高,对显存的负担非常大。
(4) 位置编码,ViT 用的是固定分辨率的positional embedding, 但是语义分割在测试的时候往往图片的分辨率不是固定的,这时要么对positional embedding做双线性插值,这会损害性能;要么做固定分辨率的滑动窗口测试,这样效率很低而且很不灵活。

4. 下一步计划

  • 阅读源码进一步理解SETR模型结构
  • 学习并整理U-Net
  • 阅读论文熟悉Segformer模型结构

参考

Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers

### 回答1: PyTorch 是一个开源的深度学习库,它提供了高度灵活的神经网络构建和训练能力。其最大的特点是动态计算图机制,这意味着我们可以在模型训练过程中动态地修改、调整网络结构,使得它非常适合研究和实验。下面是关于 PyTorch 的几个重要特性: 1. 动态计算图:PyTorch 使用动态计算图机制,与静态计算图相比,动态计算图可以根据需要灵活地构建、修改和调整网络结构,这使得我们可以更容易理解和调试模型。此外,动态计算图还支持更复杂的模型,例如递归神经网络(RNN)等。 2. 张量操作与自动微分:PyTorch 提供了丰富的张量操作库,可以高效地进行向量和矩阵计算。此外,PyTorch 还支持自动微分,可以自动计算梯度,并且梯度在反向传播时自动更新。 3. 大量的预训练模型:PyTorch 社区提供了大量的预训练模型,这些模型在各种任务上经过了大规模的训练和优化,通常可以用于迁移学习等应用。 4. GPU 加速和分布式训练:PyTorch 支持 GPU 加速,可以利用 GPU 的强大计算能力加速模型训练。此外,PyTorch 还支持分布式训练,可以在多台计算机上同时训练模型,加快训练速度。 5. 简洁的代码:PyTorch 的 API 设计得相对简洁明了,使得用户能够更加直观地理解和使用库中的功能。此外,PyTorch 建立在 Python 上,使得其代码易于编写和调试。 总而言之,PyTorch 是一个功能强大、灵活易用的深度学习库,具有动态计算图、张量操作和自动微分、大量的预训练模型、GPU 加速和分布式训练等特性。它在学术研究中得到广泛应用,同时也被广大的工业界和开发者社区认可和使用。 ### 回答2: PyTorch是一个开源的机器学习库,其目的是为了让用户能够更加方便地构建和训练深度神经网络模型。 首先,PyTorch提供了一个灵活的张量计算库,这使得用户可以使用类似于NumPy的语法来进行张量操作。张量是PyTorch中最基本的数据结构,可以表示任意维度的数组。这使得PyTorch在处理各种类型的数据(如图像、文本、声音等)时变得非常方便。 其次,PyTorch采用了动态图的方法来构建计算图。这意味着用户可以在运行时定义计算图,并且可以根据需要进行修改。相比之下,其他框架(如TensorFlow)使用的是静态图,用户需要在编写代码之前定义整个计算图。动态图使得PyTorch更加易于调试和理解,同时也提供了更大的灵活性。 此外,PyTorch具有丰富的工具和资源,用于帮助用户进行模型训练和部署。例如,它提供了许多预先训练的模型,可以直接用于特定的任务。此外,PyTorch还提供了一些用于数据加载和处理的工具,使得用户能够高效地管理和处理大型数据集。 最后,PyTorch具有优秀的社区支持和文档资源。无论是初学者还是专业人士,都可以从社区中获取有关PyTorch的帮助和指导。此外,PyTorch官方文档详尽而清晰,提供了大量的示例代码和教程,帮助用户快速上手和理解PyTorch的各个功能。 总之,PyTorch是一个功能强大且易于使用的机器学习库,为用户提供了丰富的工具和资源,帮助他们构建和训练深度神经网络模型。无论是在学术研究还是工业应用中,PyTorch都是一个理想的选择。 ### 回答3: PyTorch是一个基于Python的开源机器学习库,被广泛应用于深度学习领域。它提供了丰富的工具和接口,便于用户构建和训练各种神经网络模型。 首先,PyTorch的设计理念是以动态计算图为核心。这意味着PyTorch允许用户在运行时动态地定义、修改和调整计算图,极大地提高了灵活性和可调试性。相比之下,其他许多深度学习框架比如TensorFlow则采用了静态计算图的方式,需要用户先定义好整个计算图再进行训练。 其次,PyTorch还具有良好的易用性和可读性。它的API设计简洁明了,语法与Python非常相似,使得编写模型和训练代码变得更加容易和直观。此外,PyTorch内置了许多实用的工具和函数,比如数据加载、模型优化、损失函数等,大大简化了深度学习流程的实现。 另外,PyTorch具有优秀的性能表现。它充分利用了现代GPU的并行计算能力,能够高效地处理大规模数据和复杂模型。此外,PyTorch还提供了分布式训练的支持,可以通过多台机器或多个GPU实现模型的并行训练,加速训练速度。 最后,PyTorch还积极推动深度学习社区的发展。它具有一个活跃的社区,提供了丰富的教程、示例和文档,方便用户学习和使用。同时,PyTorch也是很多顶尖研究机构和公司所选择的深度学习框架,很多前沿的研究成果都在PyTorch上实现和发布。 综上所述,PyTorch作为一款强大的深度学习库,以其动态计算图、易用性、性能表现和社区支持等优势,被广泛认可并应用于各个领域的深度学习任务中。无论是学术研究还是工业应用,PyTorch都为用户提供了丰富的工具和资源,帮助他们快速搭建和训练高效的神经网络模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值