前言
这篇论文提出了一个新的 Vision Transformer 叫做 Swin Transformer,它可以被用来作为一个计算机视觉领域一个通用的骨干网络.但是直接把Transformer从 NLP 用到 Vision 是有一些挑战的,这个挑战主要来自于两个方面
一个就是尺度上的问题。因为比如说现在有一张街景的图片,里面有很多车和行人,里面的物体都大大小小,那这时候代表同样一个语义的词,比如说行人或者汽车就有非常不同的尺寸,这种现象在 NLP 中就没有
另外一个挑战是图像的 resolution太大了,如果要以像素点作为基本单位的话,序列的长度就变得高不可攀,所以说之前的工作要么就是用后续的特征图来当做Transformer的输入,要么就是把图片打成 patch 减少这个图片的 resolution,要么就是把图片画成一个一个的小窗口,然后在窗口里面去做自注意力,所有的这些方法都是为了减少序列长度.
基于这两个挑战,本文的作者就提出了 hierarchical Transformer,它的特征是通过一种叫做移动窗口的方式来学习的
移动窗口的好处:不仅带来了更大的效率,因为跟之前的工作一样,现在自注意力是在窗口内算的,所以这个序列的长度大大的降低了;同时通过 shifting 移动的这个操作,能够让相邻的两个窗口之间有了交互,所以上下层之间就可以有 cross-window connection,从而变相的达到了一种全局建模的能力。然后作者说这种层级式的结构不仅非常灵活,可以提供各个尺度的特征信息,同时因为自注意力是在小窗口之内算的,所以说它的计算复杂度是随着图像大小而线性增长,而不是平方级增长,这其实也为作者之后提出 Swin V2 铺平了道路,从而让他们可以在特别大的分辨率上去预训练模型
论文:Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
官方开源代码地址:https://github.com/microsoft/Swin-Transformer
网络架构

首先基于上图对Swin Transformer和之前的Vision Transformer做了下对比。
- Vision Transformer就是把图片打成 patch,Vit中patch size 16x16的所以图中写着16x,也就意味着是16倍的下采样率,这也就意味着每一个 patch,也就是每一个 token,自始至终代表的尺寸都是一样的。每一层的Transformer block 看到token的尺寸都是16倍下采样率。虽然它可以通过这种全局的自注意力操作,达到全局的建模能力,但是它对多尺寸特征的把握就会弱一些。swin Transformer使用了类似卷积神经网络中的层次化构建方法(Hierarchical feature maps) 刚开始的下采样率是4倍,然后变成了8倍、16倍,之所以刚开始是4×的,是因为最开始的 patch 是4乘4大小的,一旦有了多尺寸的特征信息,有了这种4x、8x、16x的特征图。
- 所以当Swin Transformer有了多尺寸的特征信息 输给一个 FPN,从而就可以去做检测了 扔给一个 UNET,然后就可以去做分割了 所以这就是作者在这篇论文里反复强调的,Swin Transformer是能够当做一个通用的骨干网络的,不光是能做图像分类,还能做密集预测性的任务
对于视觉任务,尤其是下游任务比如说检测和分割来说,多尺寸的特征是至关重要的,比如说对目标检测而言,运用最广的一个方法就是 FPN(a feature pyramid network:当有一个分层式的卷积神经网络之后,每一个卷积层出来的特征的 receptive field (感受野)是不一样的,能抓住物体不同尺寸的特征,从而能够很好的处理物体不同尺寸的问题。
接下来,简单看下原论文中给出的关于Swin Transformer(Swin-T)网络的架构图,主要的关键点有:patch merging,W-MSA,SW_MSA 以及 transform block的计算过程.首先我们通过下图梳理下前向过程

前向过程
- 假设说有一张
224*224*3(ImageNet 标准尺寸)的输入图片
第一步就是像 ViT 那样把图片打成 patch,在 Swin Transformer 这篇论文里,它的 patch size 是4*4,而不是像 ViT 一样16*16,所以说它经过 patch partition 打成 patch 之后,得到图片的尺寸是56*56*48,56就是224/4,因为 patch size 是4,向量的维度48,因为4*4*3,3是图片的 RGB 通道 - 打完了 patch ,接下来就要做 Linear Embedding,也就是说要把向量的维度变成一个预先设置好的值,就是 Transformer 能够接受的值,在 Swin Transformer 的论文里把这个超参数设为 c,对于 Swin tiny 网络来说,也就是上图中画的网络总览图,它的 c 是
96,所以经历完 Linear Embedding 之后,输入的尺寸就变成了56*56*96,前面的56*56就会拉直变成3136,变成了序列长度,后面的96就变成了每一个token向量的维度,其实 Patch Partition 和 Linear Embedding 就相当于是 ViT 里的Patch Projection 操作,而在代码里也是用一次卷积操作就完成了, - 第一部分跟 ViT 其实还是没有区别的,但紧接着区别就来了
- 首先序列长度是
3136,对于 ViT 来说,用 patch size16*16,它的序列长度就只有196,是相对短很多的,这里的3136就太长了,是目前来说Transformer不能接受的序列长度,所以 Swin Transformer就引入了基于窗口的自注意力计算,每个窗口按照默认来说(M=7),都只有七七四十九个 patch,所以说序列长度就只有49就相当小了,这样就解决了计算复杂度的问题 - 所以也就是说, stage1中的swin transformer block 是基于窗口计算自注意力的,现在暂时先把 transformer block当成是一个黑盒,只关注输入和输出的维度,对于 Transformer 来说,如果不对它做更多约束的话,Transformer输入的序列长度是多少,输出的序列长度也是多少,它的输入输出的尺寸是不变的,所以说在 stage1 中经过两层Swin Transformer block 之后,输出还是
56*56*96 - 到这其实 Swin Transformer的第一个阶段就走完了,也就是先过一个 Patch Projection 层,然后再过一些 Swin Transformer block,接下来如果想要有多尺寸的特征信息,就要构建一个层级式的 transformer,也就是说需要一个像卷积神经网络里一样,有一个类似于池化的操作
Patch Merging
这篇论文里作者就提出 Patch Merging 的操作,Patch Merging 其实在之前一些工作里也有用到,它很像 Pixel Shuffle 的上采样的一个反过程,Pixel Shuffle 是 lower level 任务中很常用的一个上采样方式
-
假如有一个张量, Patch Merging 顾名思义就是把临近的小 patch 合并成一个大 patch,这样就可以起到下采样一个特征图的效果了
-
这里因为是想下采样两倍,所以说在选点的时候是每隔一个点选一个,也就意味着说对于这个张量来说,如下图每次选的点都是同一种颜色
-
如果原张量的维度是 h * w * c ,当然这里 c 没有画出来,经过这次采样之后就得到了4个张量,每个张量的大小是 h/2、w/2,它的尺寸都缩小了一倍
-
现在把这四个张量在 c 的维度上拼接起来,张量的大小就变成了 h/2 * w/2 * 4c,相当于用空间上的维度换了更多的通道数
-
假如有一个张量, Patch Merging 顾名思义就是把临近的小 patch 合并成一个大 patch,这样就可以起到下采样一个特征图的效果了

- 通过这个操作,就把原来一个大的张量变小了,就像卷积神经网络里的池化操作一样,为了跟卷积神经网络那边保持一致(不论是 VGGNet 还是 ResNet,一般在池化操作降维之后,通道数都会翻倍,从128变成256,从256再变成512),所以这里也只想让他翻倍,而不是变成4倍,所以紧接着又再做了一次操作,就是在 c 的维度上用一个1乘1的卷积,把通道数降下来变成2c,通过这个操作就能把原来一个大小为
h*w*c的张量变成h/2 * w/2 *2c的一个张量,也就是说空间大小减半,但是通道数乘2,这样就跟卷积神经网络完全对等起来了
W-MSA详解
窗口是怎样划分的
原图片会被平均的分成一些没有重叠的窗口,拿第一层之前的输入来举例,它的尺寸就是56*56*96,也就说有一个维度是56*56张量,然后把它切成一些不重叠的方格,也就是下图表示的方格

- 每一个方格就是一个窗口,如果在VIT中这个窗口就是最小单元了然后做Multi-head Self-Attention.但在Swin—T 中这个窗口并不是最小的计算单元 最小的计算单元是 patch 也就意味着每一个小窗口里其实还有
m * m个 patch,在 Swin Transformer 这篇论文里一般 m 默认为7。在上图中的窗口中再划分如下图7*7的patch

- 原来大的整体特征图到底里面会有多少个窗口呢?其实也就是每条边
56/7就8个窗口,也就是说一共会有8*8等于64个窗口,就是说会在这64个窗口里分别去算它们的自注意力(Windows Multi-head Self-Attention)
基于窗口的自注意力模式的计算复杂度
MSA和W-MSA两者的计算量具体差多少呢?原论文中有给出下面两个公式:
Ω ( M S A ) = 4 h w C 2 + 2 ( h w ) 2 C ( 1 ) {Ω(MSA)=}{4hwC}^{2}+{2(hw)}^{2}C\, \, \, \, \, \, \, \, \, \, \, \, \, (1) Ω(MSA)=4hwC2+2(hw)2C

SwinTransformer是一种新的Transformer架构,用于计算机视觉任务,通过移动窗口的层次化Transformer解决了图像尺度和分辨率的问题。它减少了计算复杂度,同时允许跨窗口连接,提供多尺度特征信息,适用于图像分类和密集预测任务。SwinTransformer引入了PatchMerging和SW-MSA(ShiftedWindowsMulti-HeadSelf-Attention)来实现更高效且具有全局建模能力的网络结构。
8113

被折叠的 条评论
为什么被折叠?



