小白学习Swin-Transformer

论文名称:Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
原论文地址: https://arxiv.org/abs/2103.14030
官方开源代码地址:https://github.com/microsoft/Swin-Transformer

本文是学习博主太阳花的小绿豆和lansfair的相关文章后,进行总结。

一、摘要

本文提出了Swin Transformer,它能够作为计算 机视觉的通用骨干。将Transformer从语言改编为视觉的挑战来自于两个领域之间 的差异,例如视觉实体规模的巨大变化,以及与文本中的单词相比,图像中的像素 分辨率较高。为了解决这些差异,我们提出了一个分层Transformer,它的表示是 用移位窗口计算的。通过将自关注计算限制在非重叠的局部窗口,同时还允许跨窗 口连接,转移窗口方案带来了更高的效率。 这种层次结构具有在不同尺度上建模的灵活性,并且具有与图像大小相关的线性计 算复杂性。Swin Transformer的这些特性使其能够兼容广泛的视觉任务,包括图像 分类(在ImageNet-1K上的87.3 top-1精度)和密集的预测任务,如对象检测(COCO testdev上的58.7 box AP和51.1 mask AP)和语义分割(ADE20K val上的53.5 mIoU)。 它的性能大大超过了以前的最先进水平,COCO上的+2.7盒AP和+2.6掩模AP, ADE20K 上的+3.2 mIoU,展示了基于变压器的模型作为视觉骨干的潜力。 分层设计和移位窗口方法也被证明对所有mlp体系结构都有好处。

  

紧接着作者将本文模型和VT模型进行了比较。

两个模型一共有两点不同:

1.左边的模型也就是本文Swin transformer是使用了类似卷积神经网络中的层次化构建方法,比如特征图尺寸中对图像下采样,是通过4倍,8倍,16倍的方式,而VT则是一开始就下采样16倍,后面一直保持16倍的采样率不变;

2.Swin transformer 在下采样的过程中将特征图分为了不同的窗口,并且Multi-Head Self-Attention只在每个窗口(Window)内进行(Windows Multi-Head Self-Attention(W-MSA))。VT则是直接对整个特征图进行Multi-Head Self-Attention。Swin transformer这样做的好像是减少了大量计算,但是由于Multi-Head Self-Attention只在每个窗口(Window)内进行,所以也隔绝不同窗口之间的信息传递。为了解决这个问题,作者又提出了 Shifted Windows Multi-Head Self-Attention(SW-MSA)的概念,通过此方法能够让信息在相邻的窗口中进行传递。

二、SW-MSA

2.1滑动窗口是如何移动的呢

先将一张图按照同样的窗口进行划分,如下图。

 然后再上图的基础上,将窗口向右下角移动,得到下面这张图

 也就是从一张图片被划分成了下图的不同窗口:

2.2为什么要进行划分呢?

 如果仅仅对于左图那样的划分去计算自注意力,那么块与块之间则毫无关联,仅仅会注意到自己的那一块,而和它相邻的块中信息则被忽略了,而再次对图进行右边一样的划分,好处是块与块之间有通信了,让原本被忽略的信息也计算进去了,正如swin transformer block中,对其进行W-MSA之后,再进行一次SW-MSA,这样就建立起了块与块之间的通信,效果也会更好。

 根据上图,可以发现通过将窗口进行偏移后,由原来的4个窗口变成9个窗口了。后面又要对每个窗口内部进行MSA,这样做感觉又变麻烦了。为了解决这个麻烦,作者又提出而了Efficient batch computation for shifted configuration,一种更加高效的计算方法。下面是原论文给的示意图。

 这里借用up添砖java的图(画的很清晰,而且他本人对SW-MSA的讲解很详细)。先将红色部分挪到最下面,再把最左边的绿色部分挪到最右边,这样就可以看做是一个四个方块。

 块现在分好了,但是除了E是一个单独的模块,其他模块都是从其他模块拼接过来的,如果直接计算,就会导致信息乱窜,所以要用掩码的方式来计算他们的自注意力机制。

 先将H和B按照从左往右从上到下的顺序展开,可以得到上图左下角的矩阵,然后让他进行自注意力计算,即自己和自己相乘,所以先进行转置,在相乘,得到右下角的窗口,很明显,右下角的窗口里36和63还是来自不同的小窗口,为了防止信息乱窜,还要继续对他们进行掩码计算。

 

 用可视化的方式展现出来就是,将需要用掩码计算的部分设置成一个很大的负值,这样经过softmax层时,会将其自动化为0,这样就无法提前得知后面的信息,也就防止了信息乱窜。

三、网络整体构架

输入图片尺寸:224*224*3

1.首先,将图片输入到patch partition中变成4*4的patch(patch可以通俗的理解为图像块。当需要处理的图像分辨率太大而资源受限时,就可以将图像划分成一个个小块,这些小的图像块就是patch。仍是原图片的一部分。)

2.然后再channel方向进行展平(展平有两种情况:1.是为了后面接全连接层 从而使多维张量变为一维向量 最后对这个向量进行分类等操作。2.可能是模型的输入层如果要求是展平的数据,就要展平),假设突入的图片是RGB三通道,那么每个patch就有4x4=16个像素,所以展平后是16x3=48,所以通过Patch Partition后图像shape由 [H, W, 3]变成了 [H/4, W/4, 48]

3.经过Linear Embeding层。这一层对每个像素的channel数据做线性变换,由48变成C,即图像shape再由 [H/4, W/4, 48]变成了 [H/4, W/4, C]

4.然后就是通过四个Stage构建不同大小的特征图,除了Stage1中先通过一个Linear Embeding层外,剩下三个stage都是先通过一个Patch Merging层进行下采样。然后都是重复堆叠Swin Transformer Block注意这里的Block其实有两种结构,如图(b)中所示,这两种结构的不同之处仅在于一个使用了W-MSA结构,一个使用了SW-MSA结构。而且这两个结构是成对使用的,先使用一个W-MSA结构再使用一个SW-MSA结构。所以 Block的次数都是偶数(因为成对使用)。

四、Patch Merging

除了第一个stage外,每个stage都要通过一个Patch Merging层进行下采样。简单理解patch merging就是把临近的小的patch合并成大的patch。如下图所示,这里因为是想下采样两倍,所以说在选点的时候是每隔一个点选一个,这里的1、2、3、4并不是矩阵里有的值,而是给它的一个序号,同样序号位置上的 patch 就会被 merge。经过隔一个点采一个样之后,原来的这个张量就变成了四个张量,在深度方向进行concat拼接,维度从h x w x c变为h/2 x w/2 x 4c,然后在通过一个LayerNorm层(作用把神经网络中隐藏层归一为标准正态分布,也就是 独立同分布,以起到加快训练速度,加速收敛的作用)。最后通过一个全连接层在feature map的深度方向做线性变化,将feature map的深度由C变成C/2。所以通过Patch Merging层后,feature map的高和宽会减半,深度会翻倍。

图片来源于博主lansfair

五、相对位置偏执

模型在每次计算自注意力时加上了相对位置偏置(Relative Position Bias)。(图片来自太阳花的小绿豆)

 这里只做一个简单的介绍。图片中有蓝黄红绿,下方是他们的绝对位置,那么假如说单拎出蓝色,也就是说相对于蓝色的相对位置,用蓝色的位置去减去其他地方的绝对位置,(0,0)-(0,1)=(0,-1)就得到了黄色相对于蓝色的相对坐标,以此类推,可可以得到所有。

接下来将每个相对位置索引矩阵按行展平,并拼接在一起可以得到下面的4x4矩阵 。

六、实验部分

(此部分参考博主lansfair)

1.图片分类

我们构造的基础模型 Swin-B 具有类似于 ViT-B/DeiT-B 的模型大小和计算复杂度。我们也引入了 Swin-T,Swin-S 和 Swin-L,其模型大小和计算复杂度分别是 Swin-B 的0.25×,0.5× 和2× 。注意到,Swin-T 和 Swin-S 的复杂度分别与 ResNet-50 (DeiT-S) 和 ResNet-101 相似。每种架构的窗口尺寸均默认设为 M=7。

 该实验是先在ImageNet-1K(128万张图片、1000个类)上做训练,在ImageNet-1K测试集上测试;

然后在更大的ImageNet-22K(1,400万张图片、2万多个类别)上做预训练,再在ImageNet-1K上微调,在ImageNet-1K测试集上测试

由表格可以看到,在ImageNet-1K的时候 ViT的训练效果还没有特别理想,但是在ImageNet-22K上原始标准的 ViT 的性能就有了很大提升,Swin-Transformer也取得了更好的结果,这也再次验证了Transformer强大的拟合能力,Swin Large 最后能到87.3,达到了很好的效果。

 2.目标检测

在 COCO 数据集上训练并且进行测试

 (a)中测试了在不同的算法框架下,Swin Transformer 到底比卷积神经网络要好多少,主要是想证明 Swin Transformer 是可以当做一个通用的backbone,所以用了 Mask R-CNN、ATSS、RepPointsV2 和Sparse R-CNN,这些都是表现非常好的一些算法,在这些算法里,将ResNet-50替换成了 Swin Tiny(Swin Tiny 的参数量和 FLOPs 跟 ResNet-50基本一致,因此用来对比还是比较公平的),可以看到,Swin Tiny 对 ResNet-50 是全方位的碾压,在四个算法上都超过了它,而且超过的幅度也是比较大的。

(b)选定算法Cascade Mask R-CNN ,然后在上面换更多的不同的backbone,比如 DeiT-S、ResNet-50 和 ResNet-101,可以看出,在相似的模型参数和相似的 Flops 之下,Swin Transformer 都是比之前的骨干网络要表现好的。

3.语义分割

 

 可以看到swin-L的效果最好两个“+”号的,意思是backbone在ImageNet-22K 数据集上做了预训练,所以结果才这么好)

4.消融实验

 上表可以看出,在Imagenet数据集上如果不使用任何位置偏执,top-1为80.1,但使用了相对位置偏执(rel. pos.)后top-1为83.3,提升还是很明显的。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值