【论文阅读】Swin Transformer: Hierarchical Vision Transformer using Shifted Windows

Swin Transformer

写在前面:本人科研萌新,编写博客以记录学习过的论文,如有理解错误欢迎大佬指正,同时也欢迎大家在评论区交流。

原文:https://arxiv.org/pdf/2103.14030.pdf
参考视频:【沐神的Swin Transformer论文精读】

摘要

  • 作者提出了一个骨干模型,证明ViT能够用于各类视觉分割任务
  • 将Transformer用于机器视觉的挑战:①不同语义的词大小不一样,比如图像中大中的小不一致的汽车;②图像的高分辨率,如果直接转成序列输入太长了
  • 通过滑动窗口实现提取全局的信息(分层,多尺度),同时计算复杂度随着图像大小线性增长,而不是传统ViT的成平方级增长

引言

  • 首先对比了下ViT,普通ViT就是直接把图片分成16*16个块(进行16倍下采样),然后拉成token,放入Self-attn训练,并且只尝试了分类任务
    • 在这里插入图片描述

    • 这样虽然能获得全局建模能力,但对于多尺度特征的把握就会弱很多,所谓多尺度特征,就是通过小到大的感受野学习到图像中不同尺寸的目标的能力,比如图片中不同大小的汽车。这样的能力在密集预测中比如图像的检测分割尤为重要,比如特征金字塔技术,跳连接技术,空洞卷积,psp和aspp层

  • Swin是首先将图片分割成许多固定大小的patch,然后采用7×7个patch组成一个窗口,在窗口上计算自注意力,这样随着图片的尺寸增大, 窗口的大小不变,只是数量增多,所以计算复杂度线性上升
    • 然后类比CNN如何增大感受野——池化,通过池化提取一个小区域的主要特征,然后送入下一个卷积核达到增大感受野,但不增大计算量的目的,也就是模型中的patch_merge层
    • 同时Swin还有一个滑动窗口操作,能够使窗口获得其他窗口的patch信息,但这个操作对于分类任务的提升不大,对于密集预测类任务提升显著,比如目标检测,语义分割,因为这些任务对于像素的上下文信息和位置更加敏感
    • 最后提取到的token,输入特征金字塔就可以做目标检测,输入Unet就可以做语义分割等等,所以Swin是一个骨干网络
  • 滑动窗口的具体实现:
    • 在这里插入图片描述
    • 这里的例子是一个窗口大小:4×4,然后每次向右下角滑动4/2=2个patch,滑动完的窗口后继续计算注意力,这样不同窗口块之间就可以相互交互,同时随着patch_merge,越后层的滑动窗口意味着越大的感受野,其实就是相当于每次都在不同的位置(角度)感受图像的全局信息。

Swin的前向过程

在这里插入图片描述
这里举一个具体的例子:

  1. 输入图片224×224×3

  2. Patch Partition层,用于分割图片的最小处理单位patch,论文中是4×4,分割后矩阵为56×56×48,代表有56×56=3136个patch,每个patch大小是4×4,3通道RGB,所以是4×4×3=48

    • 这里区分一个概念patch size和window size,这一步处理的是patch size,就是将这张图片切成3136个小图块,作为处理的最小单元,然后论文中是7×7个patch组成一个window
  3. Linear Embedding层,处理完后的图像为56×56×C,该层的意义是将图像的维度处理到我们需要的大小,说人话就是,56×56×48代表一个patch用48个数字表示,现在我们需要让他用C个数字来表示,在Swin-Tiny中C=96,所以这一层处理完是56×56×96

  4. Swin Transformer Block层,这一层下一部分展开细说,对于Transformer Block一般输入是多大,输出就是多大,这一层输出还是56×56×96

  5. Patch Merging,这里就是一个类似pixel shuffle上采样的反操作,对于如下图所示的8×8图片,首先将图片划分为16个2×2的小块,同时取每个小块左上角绿色标记的patch,构成一个4×4的特征图,重复这个步骤,就可以得到 H 2 × W 2 × 4 C \frac{H}{2}×\frac{W}{2}×4C 2H×2W×4C的下采样2倍的结果,但一般卷积都是将图像的长宽减半,通道数变为2倍,因此这里通过一个cov1d将输出转变为 H 2 × W 2 × 2 C \frac{H}{2}×\frac{W}{2}×2C 2H×2W×2C,因此输出的结果为28×28×192 在这里插入图片描述

  6. 类似的经过Stage3,矩阵变为14×14×384

  7. 类似的经过Stage4,矩阵变为7×7×768

  8. 最后如果是分类任务,就通过一个avg pooling,将矩阵转为1×1×768,然后转为对应的类别数量,比如ImageNet就是1×1×1000得到结果

基于移动窗口的自注意力

  • 全局自注意力计算代价太昂贵

    • 作者这里用公式大概估计了全局注意力和窗口注意力的计算量
      在这里插入图片描述

    • 在这里插入图片描述

      • 这里直接用沐神视频里的推到过程,输入的矩阵大小hw×C,通过一个线性映射得到qkv,复杂度 3 h w C 2 3hwC^2 3hwC2,计算得到Attn score的复杂度 ( h w ) 2 C {(hw)}^2C (hw)2C,计算Attn×V的复杂度是 ( h w ) 2 C {(hw)}^2C (hw)2C,最后project那一步的复杂度是 h w C 2 hwC^2 hwC2,具体的数值,大家自己画一下矩阵相乘的过程就能理解了
    • 在这里插入图片描述

      • 第二个公式中,输入的图片大小变成一个个M×M的窗口,而不是hw,所以直接带入公式(1)就可以得到单个窗口的计算复杂度,同时一个图片有 H M × W M \frac{H}{M}×\frac{W}{M} MH×MW个窗口,两者相乘即可。
    • 这样非常节省计算量,比如hw=56×56,M×M=7×7,一下就节约了几十上百倍的计算量

  • Swin Transformer

    • 在这里插入图片描述
    • 这里每一个Transformer Block都包含两个部分,窗口和滑动窗口的自注意力计算
    • 在这里插入图片描述
    • 这里的“滑动”其实就是向右下移动窗口大小一半的patch数,比如上图,窗口大小是4,就往右下移动2个patch,但移动完成后的窗口大小不一致同时窗口数量增加,最简单的方法就是通过填充0,让窗口大小一致然后丢进去继续训练,但作者提出了一种高效的掩码方式,下面展开介绍。
  • 窗口掩码:目的,用于保证每次移动完后窗口数量和大小一致,可以直接压成一个向量,通过一次前向过程得到各个窗口的注意力得分:

    • 在这里插入图片描述
    • 首先进行一个cyclic shift(循环平移),将左上角的小块和右下角的拼接起来,形成4个窗口。
      • 注意:对于比如左下角的拼接模块,并不能直接计算自注意力,其相当于把原图中的天空和大地颠倒了,会打乱语义信息,我们只希望这些拼接模块能够在各自的模块内进行自注意力,这里就用到了一种巧妙的掩码方式见下图:
      • 一张官方github中的图(issue 38)
        在这里插入图片描述
  • 我自己的理解和描述,还是参考了沐神的视频
    在这里插入图片描述

实验

这部分值得学习的写作点

  1. 对比模型时选择参数量大小近似的
  2. 可以使用ImageNet 22k的数据集预训练,然后在ImageNet 1k上预测
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨夜闭门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值