Swin Transformer发表于ICCV 2021,获得最佳论文,其作者都来自微软亚洲研究院。
Transformer最初是处理NLP(自然语言处理)领域的任务,获得了巨大的成功。逐渐向计算机视觉领域进行拓展,有DETR、ViT以及ViT的变种,使得Transformer在计算机视觉领域大放异彩。
Transformer架构图
Transformer由Encoder和Decoder组成,它是文本语句转化为词向量的一系列处理。
因为语句中的词是有先后顺序的,在计算机视觉领域,为了使用Transformer,需要将一张图片进行切分成若干Patch,再加上一个额外可学习的分类编码。送入Transformer Encoder(多层堆叠),再加上位置编码。再进入MLP Head(多层感知机),最后进行具体的分类。在ViT中只是使用了Transformer的Encoder而没有使用Decoder。ViT的问题:它没有考虑文本和视觉信号的不同,它只能做图像分类,对于目标检测和图像分割没有相应的尝试。
Swin Transformer提供了更加通用的基于Transformer的计算机视觉任务的主干网络,并且能应用到多种计算机视觉任务中,如图像分类、目标检测、语义分割、实例分割等任务。甚至在某些方面性能超过了传统的CNN。
Swin Transformer是根据ViT发展而来的,在ViT中只用了16倍的下采样,经过Transformer Block中,它的形状保持不变,并且主要用于图像的分类。而Swin Transformer开始的时候是使用4倍的下采样,也就是4*4的patch下采样后变成1个像素点。然后还可以做8倍、16倍下采样,可以达到多尺度的特征图的提取效果,它不仅可以用于图像分类,还可以用于目标检测和图像分割。
其实Swin Transformer的很多思想和CNN有异曲同工之处,它利用了视觉信号的好的先验,它的网络架构中也采用了层次化(hierarchy)、局部化(locality)、平移不变性(translation invariance)。我们知道CNN可以进行多尺度,层级化的特征提取,主要代表为YOLOV3的FPN网络。在Swin Transformer中,我们也可以看到不同的下采样尺度,它的特征提取的颗粒度在不断的变大,由浅层到深层,它的感受野相比于浅层也是逐渐的扩大。局部性主要体现在它的注意力的计算主要是在窗口中进行的,而ViT是在整个特征图上进行注意力的计算,这样Swin Transformer计算的复杂度就会大大的降低。
主要技术创新
Swin Transformer的主要技术创新就是采用了局部化和偏移窗口(Shifted windows)。它是采用非重叠的窗口进行自注意力计算,有关自注意力机制可以参考计算机视觉中的注意力机制 。这种非重叠窗口是在每个尺度的feature map的窗口中进行局部化的自注意力的计算,但是在不同的尺度(层)之间一直是局部化的计算,就缺少窗口之间的信息的交互,所以它还采用了不同层级的窗口的偏移,不仅包含了W_MSA(窗口自注意力机制),还有SW_MSA(偏移窗口自注意力机制)。
Shifted windows技术
在上图的Layer l中有四个蓝色的窗口,自注意计算就是在这种局部非重叠窗口进行的。不同query会共享同样key集合,减少计算量,从而对硬件友好。在Layer l 1中,在前后两层的Transformer模块中,非重叠窗口的配置相比前一层做了半个窗口的移位,也就是蓝色窗口发生了移动,使得上一层中不同窗口信息进行了交换。图中灰色的格子就是一个patch(小块),它是一个4*4像素的大小;红色的格子是一个局部窗口,它是进行自注意的计算,一般包含7*7个patch大小(这里跟图上不同)。我们看到从Layer l到Layer l 1的过程中,蓝色窗口向右下移动了半个窗口的距离,从而使得layer l 1的第一个蓝色窗口有原先4个窗口的信息,这样Layer l 1层相对Layer l层就有相邻窗口之间的信息交互。
Swin Transformer网络架构
首先图片送入网络,先经过块状分区(Patch Partition),再经过线性嵌入(Linear Embedding),再送入Swin Transformer Block。每个Swin Transformer Block是由两个连续的Swin Transformer Blocks所组成(见最右边),也就是我们上面说的Layer l和Layeer l 1层,其中Layer l层包含的是W-MSA(窗口自注意力机制),而layer l 1层包含的是SW-MSA(偏移窗口自注意力机制)。然后第一个Stage的输出再送到块状拼接(Patch Merging),再送到Swin Transformer Block,这是Stage 2,后面的Stage跟Stage 2是一样的了,只不过Stage 3的Swin Transformer Block不是2个而是6个,表示有三个成对的Layer l和Layer l 1层。
我们再从图片尺寸的角度来看一下整个过程,我们假设送入网络的图片是224*224*3,由于每个patch是4*4像素的大小,那么经过块状分区(Patch Partition)后,就变成了(224/4)*(224/4)*(4*4*3)=56*56*48的尺寸。再经过线性嵌入(Linear Embedding)后,通道数翻倍,就变成了56*56*96=3136*96的尺寸。