前言
Swin Transformer是微软研究院于2021年3月推出的Transformer模型,用于处理CV中的任务,例如图像分类、图像分割、语义分割等等,该模型的性能非常惊人,其结果如下:
- ImageNet-1k上,预训练准确率可达86.4%
- COCO目标检测数据集上,box AP可达58.7%,比sota高出2.7%,mAP可达51.1,比sota高出2.6%
- ADE20K语义分割数据集上,mIOU可达53.5%,比sota高出3.2%
目前代码已经开源:https://github.com/microsoft/Swin-Transformer
Swin Transformer的结构
输入图像首先切成一个一个互不相交的patch,这些patch reshape为vector,经过一个全连接层的处理,得到一系列的token,输入数据的处理和ViT基本是近似,感兴趣的读者可以阅读我之前总结的ViT
Swin Transformer有两处与ViT不同
- 存在两种类型的self attention,分别为W-MSA、SW-MSA,如上图右边所示
- Transformer block之间引入了Patch Merging
motivation
ViT中self attention的计算量非常大,而W-MSA、SW-MSA可以降低模型的计算量
图像中目标的尺度大小不是固定的,并且变化很大,目前的ViT,所有的token,对应到原图中的尺度是一样大的,这导致ViT不适用于某些任务,例如目标检测,目标检测通常会将CNN不同层的feature map提取出来使用,因为不同层的feature map的scale不同,可以观察到的物体也将不一致,例如小的scale,更容易观察到图像中的小物体,大的scale,更容易观察到大物体,由于ViT中每个token的scale都一致,可以观察到的物体大小也基本一致,而Patch Merging使得ViT不同层的token的scale变得不同
下面将详细介绍这两种方法,为了叙述方便,设一张图片的长为H,宽为W,下文将不再介绍H、W的含义
Patch Merging
Patch Merging就是将相邻patch的token进行合并,具体而言,Swin Transformer的单个patch大小为4*4*3=48(reshape过后),设一个patch经过Linear Embedding后的维度为C,Patch Merging会将“相邻”的4个token进行合并,此处的“相邻”是指空间范围的相邻,合并后单个token的维度为4C,接着经过一个线性层处理,维度变为2C,Patch Merging的过程如下所示
Swin Transformer的输入数据大小为KaTeX parse error: Undefined control sequence: \* at position 12: \frac{H}{4}\̲*̲\frac{W}{4}*C,经过第一次Patch Merging的处理,数据大小变为KaTeX parse error: Undefined control sequence: \* at position 12: \frac{H}{8}\̲*̲\frac{W}{8}*2C,经过第二次Patch Merging的处理,数据大小变为KaTeX parse error: Undefined control sequence: \* at position 13: \frac{H}{16}\̲*̲\frac{W}{16}*4C,经过第三次Patch Merging的处理,数据大小变为KaTeX parse error: Undefined control sequence: \* at position 13: \frac{H}{32}\̲*̲\frac{W}{32}*8C,按照此规律以此类推
W-MSA、SW-MSA
Swin Transformer将Transformer block中的Multi head attention替换成了W-MSA和SW-MSA,交替使用两者,例如第一个Transformer block使用W-MSA,第二个Transformer block使用SW-MSA
上图中,左边是W-MSA,右边是SW-MSA,灰色矩形表示patch,红色矩形表示window,同处一个window的patch之间会进行self attention操作,传统的self attention操作时针对所有patch进行,swin Transformer将其变为一个window内进行,势必会降低计算量。
W-MSA中,一个window含有4x4=16个个patch,SW-MSA中,将W-MSA中的window大小缩小为 1 4 \frac{1}{4} 41,一个window含有4/2 x 4/2=4个patch,相邻的window进行合并为一个大的window。self attention在一个window内部进行
Experiment
实验部分有很多有意思的部分,ViT通常需要预训练,但是Swin Transformer直接给出了随机初始化训练的结果,在ImageNet-1K上的结果如下:
相比于ViT,Swin Transformer的计算量得到显著下降,并且性能上得到了一定提升,和sota的CNN性能基本一致,但计算量开销稍微大些