来源: arXiv.21030v1
代码:https:// github.com/microsoft/Swin-Transformer [暂时未放出04/02]
这篇文章提出了层次Transformer以使用transformer代替传统的CNN结构的backbone,这个思路和Pyramid Vision Transformer(PVT)很相似,后续我们将总结一些类似目的的方法,比如stand-alone self-attention,PVT等。 这篇文章另一个重要的创新点在于提出一种shifted windows划分方式,目的是解决对feature map划分产生了window边界不连续问题。
文章模型作为backbone,在检测、分割和图像分类任务上都刷新了性能指标。
我们先来看看Swin Transformer的结构:
- 输入是的图像,尺寸可以变化
- 经过patch partition模块对图像进行划分,一般划分成的不重叠网格,然后将每个window中的rgb特征进行cat,(和PVT相同),于是将特征变为的特征图;
- 将feature map送入stage1模块。 stage1中首先包含一层线性embedding层,将rgb特征映射到维度, 后接着2个swin transformer块。swin transformer内部结构如(b)图所示,其核心部分是W-MSA和SW-MSA模块。基于W-MSA和SW-MSA的block交替搭建。 MLP包含2层,中间激活函数采用的GELU。第一层将维度扩大倍,最后一层没有激活函数(应该可以加入dropout)。
W-MSA和SW-MSA的区别在于对feature map的划分方式不同。我们先讲W-MSA。W-MSA本质上是对feature map进行固定尺寸的windows划分,然后在每个window中进行multi-head self-attention操作, 文章中window的尺寸M=7, 每个head的维度为32。
- 从stage2开始,将输入的featmap划分成的网格,每个网格的特征concate成4C的特征,经过一层线性层转成2C的特征,然后送入swin transformer blocks中。线性层应该跟着激活层,激活函数文章没说。
以上就是基于swin transformer的backbone的构造。
W-MSA是在每个窗口内执行self-attention, SW-MSA执行的窗口划分进行了平移,像右下角循环移位之后同样的操作。
循环移位是文章提出的处理方式,实验证明了比最直接的加padding的方式有效,加padding的方式划分的窗口数会增大, 。
feature map的循环位移也是交替的,从而保证尽可能的融合windows之间的bound带来的不连续性。
在multi-head self-attention时,需要对window中的每个位置进行编码,这里采用的是相对位置编码,相对的是query的位置。
注意!注意! 方法值得注意的点:
- 每个位置的编码长度为1,对于MxM的窗口,每个位置的元素需要计算个相对位置的相关关系,因此位置编码矩阵大小为, 但因为是相对位置,所以该矩阵是从的位置编码矩阵中采样获得的。
- 在循环位移时会产生图像边界线上的window组成patch,这时候需要使用掩码处理不同的位置,从而使其在计算att时只考虑原始空间的邻近点。
- 不知道Patching Merging的激活函数是什么。
具体实现见模型复现.
不同结构的变种
layer number 是每个stage中 swin transformer block的个数。
实验
实验部分在图像分类、目标检测和语义分割上都刷新了记录。但是设置的超参数对不同的任务需要设置不同的参数,相对复杂。
总结
回顾一下PVT,也是对image和featuremap进行了网格划分从而实现scale的缩小。不同的是key和value的范围。PVT是对featmap化成windows,每个windows抽取一个特征,进而能利用全局的特征,而swin transformer也是划分不同的windows,只是特征是融合了window内部信息。swin transformer性能优于PVT,个人认为可能是因为能更好的刻画类似CNN backbone中的局部特征逐层富集的过程。