查看原文
其他

【源头活水】SegFormer: 简单有效的语义分割新思路

“问渠那得清如许,为有源头活水来”,通过前沿领域知识的学习,从其他研究领域得到启发,对研究问题的本质有更清晰的认识和理解,是自我提高的不竭源泉。为此,我们特别精选论文阅读笔记,开辟“源头活水”专栏,帮助你广泛而深入的阅读科研文献,敬请关注。

来源:知乎—Anonymous

地址:https://zhuanlan.zhihu.com/p/379054782

论文地址: https://arxiv.org/pdf/2105.15203.pdf

代码: https://github.com/NVlabs/SegFormer

PS: SegFormer很快也会在mmsegmentation中支持,欢迎各位看官试用~

太长不看

这个工作主要提出了SegFormer, 一种简单、有效且鲁棒性强的语义分割的方法。SegFormer 由两部分组成:

(1) 层次化Transformer Encoder 

(2) 仅由几个FC构成的decoder。SegFormer不仅在经典语义分割数据集(如:ADE20K, Cityscapes, Coco Stuff)上取得了SOTA的精度同时速度也不错(见图1),而且在Cityscapes-C(对测试图像加各种噪声)上大幅度超过之前的方法(如:DeeplabV3+),反映出其良好的鲁棒性。希望这个工作能对语义分割领域有一些启发。

如下是一个video demo,在cityscapes-C上同时跑SegFormer和Deeplabv3+,大家可以对比看下,SegFormer的鲁棒性比DeepLab好很多。

这篇文章主要做了以下几个微小的工作:


01

分析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做双线性插值,这会损害性能, 要么做固定分辨率的滑动窗口测试,这样效率很低而且很不灵活

图来自于SETR的论文


02

设计更加适合语义分割的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传递位置信息。

SegFormer的pipeline


03

设计简单轻量级的的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年的论文:<Understanding the Effective Receptive Field in Deep Convolutional Neural Networks>

对于语义分割来说最重要的问题就是如何增大感受野,之前无数的工作也都是在研究这方面。首先对于CNN encoder来说,有效感受野是比较小且局部的,所以需要一些decoder 的设计来增大有效感受野,比如ASPP里利用了不同大小的空洞卷积来实现这一目的。

但是对于Transformer encoder来说,由于 self-attention这一牛逼的操作,有效感受野变得非常大,因此decoder 不需要更多操作来提高感受野(self-attention 永远滴神!)。我们也设计了ablation study具体见论文的Table 1d.
我们可视化了DeepLabv3+和Segformer的有效感受野,如图:


04

实验结果

下表是在ADE20K和cityscapes上的性能,速度,参数以及计算量等指标。可以看到我们的方法随着encoder的增长,性能也在逐步提高。首先我们的最小的模型,SegFormer-B0的参数仅有3.7M 但是效果已经很好了超过很多大模型的方法。其次,我们最大的模型SegFormer-B5在87M参数的情况下取得了最好的结果,相比之下,SETR的参数有318M。同时,从速度层面看,SegFormer相比别的方法优势也比较大。

更多关于ADE20K, Cityscape和Coco Stuff的结果可以参考论文的实验部分。关于鲁棒性的结果也可以参考论文的实验部分。

最后的一点总结以及自己的思考,欢迎讨论以及拍砖~

1. 对于语义分割,特征提取非常重要,Transformer已经在分类上证明了比CNN更强大的特征提取能力。但是分类和分割还是有一定的GAP, 因此如何设计对分割友好的更好的Transformer结构,我认为还可以继续研究。

2. 有了很好的特征,decoder该如何设计才能进一步提高性能。我们这里用了一个很简单的MLP decoder取得了不错的效果,而传统的ASPP之类的decoder 在Transformer的基础上帮助不是很大,未来如何针对性的设计更好的decoder也比较值得探索。

最后的最后,SegFormer将会很快在openmmlab的mmsegmentation里开源,mmsegmentation我个人认为是目前最好的语义分割军火库(openmmlab, yyds),推荐大家多多使用。

本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。


“源头活水”历史文章


更多源头活水专栏文章,

请点击文章底部“阅读原文”查看



分享、在看,给个三连击呗!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存