SegFormer语义分割

date
Apr 1, 2023
Last edited time
Apr 1, 2023 06:21 AM
status
Published
slug
SegFormer语义分割
tags
DL
CV
summary
type
Post
Field
Plat
太长不看
这个工作主要提出了 SegFormer, 一种简单、有效且鲁棒性强的语义分割的方法。SegFormer 由两部分组成:(1) 层次化 Transformer Encoder (2) 仅由几个 FC 构成的 decoder。SegFormer 不仅在经典语义分割数据集 (如:ADE20K, Cityscapes, Coco Stuff) 上取得了 SOTA 的精度同时速度也不错 (见图 1),而且在 Cityscapes-C(对测试图像加各种噪声) 上大幅度超过之前的方法(如:DeeplabV3+),反映出其良好的鲁棒性。希望这个工作能对语义分割领域有一些启发。
notion image
1 分析 SETR 遗留的问题
众所周知,2020 年底,Vision Transformer(ViT) 在图像分类上全面超过 CNN, 从此在 CV 圈掀起 Transformer 的研究热潮。SETR 第一个用 Vision Transformer 做 encoder 来尝试做语义分割,并且取得了很好的结果, 具体体现为 ADE20K 上首次刷到 50+ mIoU。这其实迈出了比较重要的一步,说明了 Transformer 在语义分割上潜力很大,使用 Transformer 的性能上限可以很高。 另一方面,SETR 也存在一些问题需要解决。 其中比较主要的问题是 SETR 采用 ViT-large 作为 encoder, 它有以下几个缺点: (1) ViT-large 参数和计算量非常大,有 300M + 参数,这对于移动端模型是无法承受的; (2) ViT 的结构不太适合做语义分割,因为 ViT 是柱状结构,全程只能输出固定分辨率的 feature map, 比如 1/16, 这么低的分辨率对于语义分割不太友好,尤其是对轮廓等细节要求比较精细的场景 (3) ViT 的柱状结构意味着一旦增大输入图片或者缩小 patch 大小,计算量都会成平方级提高,对显存的负担非常大,32G 的 V100 也可能 hold 不住 (4) 位置编码. ViT 用的是固定分辨率的 positional embedding, 但是语义分割在测试的时候往往图片的分辨率不是固定的,这时要么对 positional embedding 做双线性插值,这会损害性能, 要么做固定分辨率的滑动窗口测试,这样效率很低而且很不灵活
notion image
2 设计更加适合语义分割的 Transformer Encoder
首先,回顾经典的语义分割方法, encoder 大多会输出 * 高分辨率的粗粒度特征 * 和 * 低分辨率的细粒度特征 *。 这样设计的好处在于语义分割可以同时保留这两种特征,从而像素分类更准以及边缘等细节的分割效果更精细。这也是我们期待设计出的 Transformer encoder 的效果。
首先,最近有一些 Transformer encoder 可以实现这一目的,比如 PVT 和 Swin Transformer, 这些工作成功的把 ViT 扩展到分割上,但是他们还有提高空间。比如他们还是采用了 Positonal Embedding 这一操作,如 PVT 的 Positonal Embedding 是和 ViT 一样固定形状的,如果图片分辨率变了同样需要插值,不够灵活。但是我们发现位置编码实际上在分割中可以完全去掉。
然后,我们重新设计了 Transformer encoder, 规避了上述问题,同时也有一些设计受到了之前工作的启发。主要总结为如下几个部分 (1) 之前 ViT 和 PVT 做 patch embedding 时,每个 patch 是独立的,我们这里对 patch 设计成有 overlap 的,这样可以保证局部连续性。(2) 我们彻底去掉了 Positional Embedding, 取而代之的是 Mix FFN, 即在 feed forward network 中引入 3x3 deepwise conv 传递位置信息。
notion image
3 设计简单轻量级的的 MLP Decoder
回顾一下过去 3 年语义分割的文章,不难发现大部分工作其实主要在研究如何设计更好的 decoder,比如 Deeplab 系列, PSPNet, OCNet 等工作,但是同时 decoder 也越来越重,越来越复杂。
不过,在 Segformer 中, decoder 非常简单,仅有几个 MLP 层。首先我们会对不同层的 Feature 分别过一个 linear 层确保他们的 channel 维度一样,其次都上采样到 1/4 分辨率并 concat 起来,再用一个 linear 层融合,最后一个 linear 层预测结果。整个 decoder 只有 6 个 linear 层,没有引入复杂的操作,比如 dilate conv, 甚至也没有 3x3 conv. 这样的好处是 decoder 的计算量和参数量可以非常非常小,从而使得整个方法运行的非常高效。
3.1 讨论 我们分析了一下,之前工作的相对复杂的 decoder 在 CNN encoder 上很重要且很有意义,但是在 Segformer 里,简单的 MLP decoder 也能 work 的很好,这是为什么呢?这里需要引出一个概念: 有效感受野 (Effective Receptive Field)。关于有效感受野可以看这篇 17 年的论文:
对于语义分割来说最重要的问题就是如何增大感受野,之前无数的工作也都是在研究这方面。首先对于 CNN encoder 来说,有效感受野是比较小且局部的,所以需要一些 decoder 的设计来增大有效感受野,比如 ASPP 里利用了不同大小的空洞卷积来实现这一目的。
但是对于 Transformer encoder 来说,由于 self-attention 这一牛逼的操作,有效感受野变得非常大,因此 decoder 不需要更多操作来提高感受野 (self-attention 永远滴神!)。我们也设计了 ablation study 具体见论文的 Table 1d. 我们可视化了 DeepLabv3 + 和 Segformer 的有效感受野,如图:
notion image
4 实验结果
下表是在 ADE20K 和 cityscapes 上的_性能,速度,参数以及计算量_等指标。可以看到我们的方法随着 encoder 的增长,性能也在逐步提高。首先我们的最小的模型,SegFormer-B0 的参数仅有 3.7M 但是效果已经很好了超过很多大模型的方法。 其次,我们最大的模型 SegFormer-B5 在 87M 参数的情况下取得了最好的结果,相比之下, SETR 的参数有 318M。 同时,从速度层面看,SegFormer 相比别的方法优势也比较大。
notion image

© Lazurite 2021 - 2024