本文主要是介绍Swin Transformer: Hierarchical Vision Transformer using Shifted Windows(ICCV2021),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Swin Transformer
- 摘要
- 引言
- 方法
- 实验
摘要
本文提出了一种新的Vision Transformer,称为Swin Transformer,可以作为计算机视觉领域的通用主干。将Transformer从NLP应用到CV会面临一些挑战,这些挑战主要来自两个方面:一个是尺度问题,视觉领域中的目标往往尺度差异很大(比如一张街景图像,里面的行人和汽车有大有小),而NLP中的Transformer并不需要考虑这个问题;另一个是图像分辨率高的问题,需要对其进行预处理缩小序列长度。针对这些挑战,作者提出了一种hierarchical transformer,其特征表示通过移动窗口(Shifted windows)计算得到。移动窗口设计一方面将自注意力计算限制在非重叠的局部窗口,序列长度大大降低,从而带来了更高的效率;另一方面shift操作可以让两个窗口之间实现信息交互,因此上下层之间就可以通过跨窗口连接,变相的达到一种全局建模的能力。这种层级式结构不仅非常灵活,可以提供各种尺度的特征信息,而且计算复杂度只会随着图像大小的变化进行线性增长,而不是平方级增长。Swin Transformer的这些特性,使其能够很好地被应用于计算机视觉的下游任务。
引言
在本文中,作者试图拓展Transformer的适用性,使其可以作为视觉领域的通用主干,不光在分类任务上,在检测、分割等其他任务上也能取得很好的效果。Transformer应用于视觉领域会面临两大挑战:(1)现有的基于Transformer的模型中,token都是固定维度的,这一特性并不适合视觉应用;(2)与句子中的单词相比,图像像素分辨率要高得多,对于许多视觉任务(如语义分割),需要在像素级上进行密集预测,而这对于Transformer来说是困难的,因为其自注意力的计算复杂度会达到图像大小的平方级。
为了克服上述挑战,作者提出了Swin Transformer。如上图(b)所示,ViT将图像分割成许多个16×16大小的patch,这些patch的尺寸从始至终都是固定的,虽然能达到全局建模的能力,但对多尺度特征的把握会相对弱一些。在目标检测和目标分割等下游任务中,多尺度特征至关重要。比如对于目标检测中的多尺度而言,应用最广的一个方法是Feature Pyramid Network(FPN),当有一个分层式的卷积神经网络,每一个卷积层出来的特征所具有的感受野是不一样的,因此能抓住物体不同尺寸的特征,从而能够很好地处理物体不同尺寸的问题。在ViT中,它产生的是单一尺寸且低分辨率的特征图,不适合处理密集预测型任务;而且它始终是在全局做自注意力计算,因此它的计算复杂度是以图像尺寸平方级的形式增长。上图(a)就是作者提出的Swin Transformer,它借鉴了很多卷积神经网络的设计理念和先验知识。比如为了减少序列长度,降低计算复杂度,Swin Transformer采取了在小窗口中计算自注意力,而不是像ViT一样在整图上进行计算,这样的话只要窗口大小是固定的,自注意力的计算复杂度就是固定的,整张图的计算复杂度就会跟图像大小成线性增长关系。Swin Transformer的这一计算方式其实就是借鉴了CNN中的locality这个归纳偏置,即利用了局部性的这个先验知识。同一个物体的不同部位或者语义相近的不同物体还是大概率会出现在相邻的地方,因此在小范围窗口中计算自注意力也是差不多够用的,全局计算自注意力对于视觉任务来说有点浪费资源。
对于多尺度特征,CNN之所以能够提取多尺度特征,主要在于池化操作,池化能够增大每一个卷积核看到的感受野,从而使得每一次池化后的特征能够抓住物体的不同尺寸。受此启发,Swin Transformer也提出了类似于池化的操作,叫做patch merging,就是把相邻的小patch合成一个大patch,合并后的大patch就能看到之前四个小patch看到的东西,从而增大了感受野,同时还能抓住多尺寸的特征。Swin Transformer的一个关键设计元素就是移动窗口操作,如下图所示。
图中的每一个灰色小方格都是一个4×4大小的小patch,每个红色的框是一个中型的计算单元(也就是一个窗口),在Swin Transformer中一个窗口默认有7×7=49个小patch的,这里就是画个示意图。从Layer1到Layer1+1就相当于将Layer1中的整个图像向右下角移了两个方格单元。
方法
Swin Transformer的整体架构如上图所示。假设有一张大小为224×224×3的图像,首先第一步就像ViT一样将图像分割成许多个patch,与ViT不同的是,Swin Transformer的每个patch大小为4×4×3,拉直后就是48维,因此经过patch partition之后,一张图像的尺寸变成了56×56×48,也就是一个3136×48的矩阵。然后将这些patch送入线性投射层,使得向量维度变成预先设置好的值C,Swin Transformer的一个变体Swin-T将这个超参数C设为96,3136×48经过线性投射层后就变成了3136×96。3136的序列长度对于Transformer来说是相当大的,因此Swin Transformer引入了基于窗口的自注意力计算,每个窗口有7×7=49个patch,也就是说序列长度就变成了49,大大降低了计算复杂度。在Stage 1中,Swin Transformer Block的输入是56×56×96,输出也是56×56×96。想获取到多尺寸的特征信息,那么就要构建一个层级式的Transformer,也就是要像卷积神经网络一样,弄一个类似于池化的操作出来。Swin Transformer提出了patch merging的操作,它的操作过程如下图所示。在Stage 2中,经过patch merging后,图像的H、W各缩小2倍,C变成4倍,然后会用一个1×1的卷积将4C降维到2C,Swin Transformer Block的输入为28×28×192,输出也是28×28×192。在Stage 3中,经过patch merging后,Swin Transformer Block的输入为14×14×384,输出也是14×14×384。在Stage 4中,经过patch merging后,Swin Transformer Block的输入为7×7×768,输出也是7×7×768,也就是说在最后一个阶段,只有一个窗口,这个窗口就代表了整个图像特征。
Swin Transformer特征图的维度跟卷积神经网络(残差网络)很像,而且为了和CNN保持一致,Swin Transformer并没有像ViT一样使用class token,而是在得到最后的特征图之后,用了一个全局平均池化(GAP)操作,将7×7取平均变成1。整体框架图中没有画出GAP,因为Swin Transformer并不是只用来做分类,它还能用于检测、分割等其他下游任务,如果是做分类的话,7×7×768经过GAP操作后就变成了1×768。
全局自注意力和基于窗口的自注意力的计算复杂度如下面公式所示,M=7为一个窗口的边长,假设h和w都是56,则 ( h w ) 2 = 3136 × 3136 (hw)^2=3136×3136 (hw)2=3136×3136, M 2 h w = 49 × 3136 M^2hw=49×3136 M2hw=49×3136,计算复杂度相差64倍,可以说是非常大了。
基于窗口的自注意力虽然大幅降低了计算复杂度,但是窗口之间没有信息交互了,全局建模的缺失会限制模型性能。针对这一问题,Swin Transformer提出了移动窗口方法,该方法将整幅图像向右下角移动两个窗口单元,而后再根据下图所示过程对移动后的窗口进行处理。在Swin Transformer中,先做一遍基于窗口的多头自注意力,再做一遍基于移动窗口的多头自注意力,这样就能实现窗口与窗口之间的信息交互,从而达到全局建模的能力。
Swin Transformer有以下几种变体,其中Swin-T的计算复杂度与ResNet50差不多,Swin-S的计算复杂度与ResNet101差不多,Swin-T、Swin-S、Swin-L的模型规模和计算复杂度分别是Swin-B的0.25、0.5、2倍。这几个变体中,不同的地方主要在于超参数C(线性投射后得到的向量维度)的大小和Transformer Block的数量。其中基于窗口的多头自注意力是一个block,基于移动窗口的多头自注意力也是一个block,这两个block连在一起计算,因此layer numbers中的2指的就是一个窗口block和一个移动窗口block。
实验
Swin Transformer与其他先进算法在图像分类任务上的性能比较:
相似规模的Swin Transformer与ResNet的性能比较:
Swin Transformer与其他先进算法在目标检测和实例分割数据集COCO上的性能比较:
Swin Transformer与其他先进算法在语义分割数据集ADE20K上的性能比较:
移动窗口和相对位置编码带来的性能提升消融实验:
这篇关于Swin Transformer: Hierarchical Vision Transformer using Shifted Windows(ICCV2021)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!