GitHub:https://fudan-zvg.github.io/SETR
最近的语义分割大多还是基于FCN的encoder和decoder结构。 encoder负责不断压缩分辨率,不断提高channel 最后生成hot-map 一是把图像信息转移到通道信息上去 二逐渐降低分辨率才能获取抽象的全局信息 decoder负责不断恢复分辨率,不断结合之前的encoder的信息形成像素点级别的预测 对于encoder和decoder经典结构本文提出了一个可替代的方法,纯粹的只有transformer作为encoder去把对图像的处理当作对序列的处理 本文只用transformer对encoder进行处理是因为在网络里表征学习是最重要的部分。 CNN的两大特点:卷积和池化 卷积提取局部细节的信息,但要结合池化降低分辨率且随着层数的加深才能提取细节信息 但在语义分割中我们需要逐像素的去进行分割,池化虽然可以获取相对的位置信息,但肯定会丢失一些细节信息,这对语义分割很是致命。 现在的大多的方法可以分为三种: 1.去对卷积进行操作 如何去扩大感受野并且增大 2.在encoder和decoder上加入attention模块 3.在网络结构上的改变
本文的实现: encoder: 先把图像转化为固定大小的图像patch,再对每个patch进行嵌入映射成序列向量 HW3 →LC 本文以1616像素为一个patch L=HW/(1616) 再对每个patch进行嵌入映射 再加上位置信息得到transformer的输入 2.self-attention+残差结构(attention 的输入) 3.MLP+残差结构(attention的输出) 不断的transformer decoder: 因为encoder生成的还是一维序列,我们先要改变维度把多个一维序列改成三维图像(H/16,W/16,C),再进行decoder decoder并没有采取transformer的decoder,而是提供了三种方法: 1.直接上采样 通过一些卷积层加norm 采取双线性插值法直接恢复到原图大小 接这用交叉熵在分类层进行分割类别的识别 2.逐渐上采样 直接一步到位恢复原图的分辨率会引入噪声等,所以每次只恢复为当前分辨率的2倍,中间在夹杂一些卷积层。 3. 多层次特征叠加 把每层transformer的输出拿出来,记作Z^m ,m表示第几层的特征。(这里有个疑问 他这个每层输出带有权重吗 i/m 还是直接拿出来 ) 把想要的层的transformer找出来,先通过卷积转换为三维图像 经过三次卷积 其中第一次 和第三次channel减半 第三层后将分辨率提升4倍 把层逐元素相加 再经过卷积 再把分辨率提升4倍 这样就恢复原图大小
本文的图:
优点: 1.因为有self-attention所以可以很好的学习全局信息 2.因为没有池化,分辨率不会改变 可以很好的保留局部细节信息 3.提供了和FCN不同的解决方案来做语义分割,同时也说明了抛弃了CNN的backbone只用transformer,到底能达到怎样的性能。(网络需要预训练才可以)
缺点:
- 对比试验做的不行,最小的设定的参数量和计算量以后超过了ResNet-152网络,而作者最大的设定却在和ResNet-101比较。效果好,也有一部分的原因是因为参数多的问题,虽然参数增加并不一定等于性能的提升,如果要完全比较作者需要找一个和transformer一样参数量的卷积网络来比较。
- 太壕了,训练拿的是8块32G的GPU训练,对不起,拿不出来。
- 太水了,真的。如果不是名字是rethink我怀疑根本去不了cvpr,也说明了论文名字的重要性。encoder的架构用的是vit的,decoder的架构就是普通的上采样,唯一可以看的就是和金字塔差不多的聚合的处理。感觉现在 SETR 就是在做这件事。所以,别把它和 VIT 当成一个 level 的工作,感觉 SETR 只是 VIT 的一个补充实验。
|