Swin Transformer论文笔记

Swin Transformer 翻译

Swin Transformer: Hierarchical Vision Transformer using Shifted Windows

Abstact

本文提出了一种新的视觉转换器,称为Swin Transformer,它可以作为计算机视觉的通用主干。这两个领域之间的差异,比如视觉实体的规模差异很大,图像中的像素与文本中的单词相比分辨率较高,这就给从语言到视觉的转换带来了挑战。为了解决这些差异,我们提出了一种分层Transformer,其表示是用Shifted windows计算的。Shifted windows方案将自我注意计算限制在非重叠的局部窗口上,同时允许跨窗口连接,从而提高了效率。这种分层结构具有在各种尺度下建模的灵活性,并且相对于图像大小具有线性计算复杂性。Swin Transformer的这些特性使其与广泛的视觉任务兼容,包括图像分类(ImageNet-1K上的准确度为87.3 top-1)和密集预测任务,如目标检测(COCO testdev上的58.7 box AP和51.1 mask AP)和语义分割(ADE20K val上的准确度为5350万)。它的性能大大超过了之前的技术水平,COCO上的box AP和mask AP分别为+2.7和+2.6,ADE20K上的mask AP分别为+3.2百万,显示了基于变压器的模型作为视觉支柱的潜力。分层设计和移位窗口方法也被证明对所有MLP架构都是有益的。代码和模型可在 :
官网代码

1. Introduction

计算机视觉中的建模一直由卷积神经网络(CNN)主导。从AlexNet[39]及其在ImageNet图像分类挑战上的革命性表现开始,CNN架构通过以下方式变得越来越大规模[30,76],更广泛的连接[34],以及更复杂的卷积形式[70,18,84]。随着CNN在各个领域的性能提升,整个CNN的性能也随之提升。

另一方面,自然语言处理(NLP)中网络体系结构的演变走了一条不同的道路,今天流行的体系结构是转换器[64]。Transformer是为序列建模和转导任务而设计的,它以关注数据中的长期依赖关系而闻名。最近,研究人员在计算机视觉领域对其进行了研究,并取得了巨大的成功[20],尤其是在图像分类方面[47]。

在本文中,我们寻求扩大变压器的适用性,使其可以作为通用骨干计算机视觉,因为它为NLP和CNNs在视觉上。我们观察到,将其在语言领域的高性能转移到视觉领域的重大挑战可以通过两种模式之间的差异来解释。其中一个差异涉及规模。与作为语言转换器处理基本元素的单词标记不同,视觉元素在规模上可能存在很大差异,这是一个在目标检测等任务中受到关注的问题[42、53、54]。在现有的基于Transformer的模型中[64,20],代币都是固定比例的,这一属性不适合这些vision应用。另一个区别是,与文本段落中的单词相比,图像中的像素分辨率要高得多。存在许多视觉任务,例如需要在像素级进行密集预测的语义分割,而这对于高分辨率图像上的Transformer来说是很困难的,因为它自身注意力的计算复杂性是图像大小的二次方。为了克服这些问题,我们提出了一种通用的转换器主干,称为Swin Transformer,它构造了层次特征映射,并具有与图像大小成线性关系的计算复杂度。如图1(a)所示,Swin Transformer通过从小尺寸的patch(以灰色勾勒)开始,并逐渐将相邻patch合并到更深的Transformer层中来构建层次表示。有了这些分层特征映射,Swin Transformer模型可以方便地利用高级技术进行密集预测,如特征金字塔网络(FPN)[42]或U-Net[51]。线性计算复杂性是通过在分割图像的非重叠窗口(用红色标出)内局部计算自我注意来实现的。每个窗口中的patch数是固定的,因此复杂性与图像大小成线性关系。这些优点使Swin Transformer适合作为各种视觉任务的通用主干,这与以前基于Transformer的体系结构[20]不同,后者生成单一分辨率的特征图,并且具有二次复杂性。

image-20220411144116128

Swin Transformer的一个关键设计元素是在连续的自我关注层之间切换窗口分区,如图2所示。移动的窗口桥接了前一层的窗口,提供了它们之间的连接,显著增强了建模能力(见表4)。这种策略对于真实世界的延迟也是有效的:一个窗口中的所有查询patch都共享相同的密钥集1,这有助于硬件中的内存访问。相比之下,早期基于滑动窗口的自我注意方法[33,50]在通用硬件上的延迟较低,因为不同query pixels的key sets不同。我们的实验表明,该方法是可行的移位窗口方法的延迟比滑动窗口方法低得多,但建模能力相似(见表5和表6)。事实证明,移位窗口方法也适用于所有MLP体系结构[61]。

image-20220411145337105

所提出的 Swin Transformer在图像分类、目标检测和语义分割等识别任务上具有很强的性能。它的性能明显优于ViT/DeiT[20,63]和ResNe(X)t模型[30,70],在这三项任务上的延迟相似。COCO测试设备上的58.7 box AP和51.1掩码AP超过了之前的最新结果,分别为+2.7 box AP(复制粘贴[26]无外部数据)和+2.6掩码AP(检测器[46])。在ADE20K语义分割中,它在val集合上获得了5350万,比之前的最新技术(SETR[81])提高了+320万。在ImageNet-1K图像分类中,它还实现了87.3%的最高精度。

我们相信,跨计算机视觉和自然语言处理的统一体系结构可以使这两个领域受益,因为它将促进视觉和文本信号的联合建模,并且来自这两个领域的建模知识可以更深入地共享。我们希望Swin Transformer在各种视觉问题上的出色表现能够加深社区的这种信念,并鼓励视觉和语言信号的统一建模。

2. Related Work

CNN and variants:CNN是贯穿计算机视觉的标准网络模型。虽然CNN已经存在了几十年[40],但直到AlexNet[39]的引入,CNN才开始发展并成为主流。此后,人们提出了更深入、更有效的卷积神经结构,以进一步推动计算机视觉中的深度学习浪潮,例如VGG[52]、GoogleNet[57]、ResNet[30]、DenseNet[34], HRNet[65]和EfficientNet[58]。除了这些架构上的进步,在改进单个卷积层方面也做了很多工作,例如深度卷积[70]和可变形卷积[18,84]。虽然CNN及其变体仍然是计算机视觉应用的主要主干架构,但我们强调了Transformer-like在视觉和语言之间统一建模方面的巨大潜力。我们的工作在几个基本的视觉识别任务上取得了很好的表现,我们希望这将有助于建模的转变。

Self-attention based backbone architectures:同样受NLP领域中自我关注层和转换器架构的成功启发,一些作品使用自我关注层来取代流行的ResNet中的部分或全部空间卷积层[33,50,80]。在这些作品中,自我注意是在每个像素的局部窗口内计算的,以加快优化[33],与对应的ResNet架构相比,它们实现了略好的精度/失败权衡。然而,它们昂贵的内存访问导致它们的实际延迟明显大于卷积网络[33]。我们建议在连续层之间切换窗口,而不是使用滑动窗口,这允许在一般硬件中更有效地实现。

Self-attention/Transformers to complement CNNs:另一项工作是用self-attention或Transformers来增强标准CNN架构。自我关注层可以补充主干[67,7,3,71,23,74,55]或头部网络[32,27],提供编码远程依赖或异构交互的能力。最近,Transformer中的编码器-解码器设计已应用于对象检测和实例分割任务[8,13,85,56]。我们的工作探索了变压器对基本视觉特征提取的适应性,是对这些工作的补充。

Transformer based vision backbones:与我们的工作最相关的是视觉转换器(ViT)[20]及其后续产品[63,72,15,28,66]。ViT的开创性工作直接将Transformer架构应用于非重叠的中等大小图像块,用于图像分类。与卷积网络相比,它在图像分类上实现了令人印象深刻的速度-精度折衷。虽然ViT需要大规模的训练数据集(即JFT-300M)才能表现良好,但DeiT[63]引入了几种训练策略,使ViT也能有效地使用较小的ImageNet-1K数据集。ViT在图像分类方面的结果令人鼓舞,但其体系结构不适合用作密集视觉任务的通用主干网络,或者当输入图像分辨率较高时,因为其低分辨率特征映射和复杂度随图像大小的二次增加。有几项工作将ViT模型应用于通过直接上采样或反卷积进行的目标检测和语义分割的稠密视觉任务,但性能相对较低[2,81]。与我们的工作同时进行的还有一些修改ViT体系结构[72,15,28],以实现更好的图像分类。根据经验,我们发现我们的Swin Transformer体系结构在这些图像分类方法中实现了最佳的速度精度权衡,尽管我们的工作侧重于通用性能,而不是专门针对分类。另一项并行工作[66]探索了在变压器上构建多分辨率特征图的类似思路。它的复杂度仍然是图像大小的二次方,而我们的是线性的,并且在局部操作,这在建模视觉信号中的高度相关性方面已被证明是有益的[36,25,41]。我们的方法既高效又有效,在COCO目标检测和ADE20K语义分割方面都达到了最先进的精度。

3. Method

3.1. Overall Architecture

图3给出了Swin Transformer体系结构的概述,它展示了微型版本(SwinT)。它首先通过patch分割模块(如ViT)将输入的RGB图像分割为非重叠patch。每个patch被视为一个“标记”,其特征被设置为原始像素RGB值的串联。在我们的实现中,我们使用4×4的patch大小,因此每个patch的特征维数为4×4×3=48。在该原始值特征上应用线性嵌入层,将其投影到任意维度(表示为C)。

image-20220411145435694

前向推导例子:

image-20220411152150128

在这些patch tokens上应用了几个具有修改的自我注意计算(Swin Transformer blocks)的转换器块。转换器块保持tokens的数量(h4×w4),与线性嵌入一起被称为“阶段1”。

为了产生分层表示,随着网络的深入,通过补丁合并层来减少tokens的数量。第一个面片合并层连接每组2×2相邻面片的特征,并在4C维连接的特征上应用线性层。这将tokens的数量减少了2×2=4的倍数(分辨率的2×降采样),并且输出维度设置为2C。然后应用swi变换块进行特征变换,分辨率保持在h8×w8。第一个斑块合并和特征转换块被称为“阶段2”。该过程重复两次,分别为“阶段3”和“阶段4”,输出分辨率分别为H 16×W 16和H 32×W 32。这些阶段共同产生了一种等级代表, 具有与典型卷积网络相同的特征图分辨率,例如VGG[52]和ResNet[30]。因此,所提出的体系结构可以方便地替代现有方法中用于各种视觉任务的主干网络。

Swin Transformer block

Swin Transformer是通过将Transformer块中的标准多头自关注(MSA)模块替换为基于移动窗口的模块(如第3.2节所述)构建的,其他层保持不变。如图3(b)所示,Swin Transformer block由一个基于移位窗口的MSA模块组成,然后是一个中间带有GELU非线性的两层MLP。在每个MSA模块和每个MLP之前应用LayerNorm(LN)层,在每个模块之后应用residual connection。

3.2. Shifted Window based Self-Attention

标准Transformer架构[64]及其对图像分类的适应[20]都会进行全局自关注,其中会计算tokens和所有其他tokens之间的关系。全局计算导致tokens数量的二次复杂性,这使得它不适用于许多需要大量tokens进行密集预测或表示高分辨率图像的视觉问题。

**Self-attention in non-overlapped windows:**为了有效地建模,我们建议在本地窗口内计算自我注意。窗口被布置成以不重叠的方式均匀地分割图像。假设每个窗口包含M×M个面片,计算了全局MSA模块和基于h×w面片图像的窗口的计算复杂度:

image-20220411150317577

计算复杂度推导:

image-20220411152312063

其中,前者是补丁数hw的二次方,而后者在M固定时是线性的(默认设置为7)。对于大型硬件来说,全局自我注意计算通常是负担不起的,而基于窗口的自我注意是可伸缩的。

Shifted window partitioning in successive blocks:基于窗口的自我关注模块缺乏跨窗口连接,这限制了其建模能力。为了在保持非重叠窗口高效计算的同时引入跨窗口连接,我们提出了一种移位窗口划分方法,该方法在连续的Swin Transformer blocks中交替使用两种划分配置

如图2所示,第一个模块使用从左上角像素开始的常规窗口分割策略,将8×8特征图均匀地分割为大小为4×4(M=4)的2×2窗口。然后,下一个模块通过将窗口从规则分区的窗口置换(bm2c,bm2c)像素,采用与前一层的窗口配置不同的窗口配置。使用移位窗口划分方法,连续的SWN变压器块计算如下:

image-20220411150609579

**其中,ˆzl和zl分别表示块l的(S)WMSA模块和MLP模块的输出特征;**W-MSA和SW-MSA分别表示使用规则和移位窗口分区配置的基于窗口的多头自我注意。

移位窗口分割方法引入了前一层中相邻非重叠窗口之间的连接,并被发现在图像分类、对象检测和语义分割方面是有效的,如表4所示

Efficient batch computation for shifted configuration:(本段将原文放上,翻译的不好)

image-20220411150952459

移位窗口分区的一个问题是,它将导致更多窗口,在移位配置中从dhme×dwme到(dhme+1)×(dwme+1),并且一些窗口将小于M×m4。一个简单的解决方案是将较小的窗口填充到M×M的大小,并在计算注意力时屏蔽填充值。当常规分区中的窗口数很小时(例如2×2),使用这种原始解决方案增加的计算量相当大(2×2)→ 3×3,即2.25倍大)。在这里,我们提出了一种更有效的批量计算方法,方法是向左上方向循环移位,如图4所示。在这个移位之后,一个批处理窗口可能由几个在特征图中不相邻的子窗口组成,因此使用掩蔽机制将自我注意计算限制在每个子窗口内。通过循环移位,批处理窗口的数量与常规窗口分区的数量相同,因此也是有效的。这种方法的低延迟如表5所示。

image-20220411151004044

image-20220411153647515

image-20220411153729017

关于上图的不相邻的块不计算使用的掩码方式以及计算方式下图给出了可视化的解释:

https://github.com/microsoft/Swin-Transformer/issues/38

image

附上实现代码:

import torch

import matplotlib.pyplot as plt


def window_partition(x, window_size):
    """
    Args:
        x: (B, H, W, C)
        window_size (int): window size

    Returns:
        windows: (num_windows*B, window_size, window_size, C)
    """
    B, H, W, C = x.shape
    x = x.view(B, H // window_size, window_size, W // window_size, window_size, C)
    windows = x.permute(0, 1, 3, 2, 4, 5).contiguous().view(-1, window_size, window_size, C)
    return windows


window_size = 7
shift_size = 3
H, W = 14, 14
img_mask = torch.zeros((1, H, W, 1))  # 1 H W 1
h_slices = (slice(0, -window_size),
            slice(-window_size, -shift_size),
            slice(-shift_size, None))
w_slices = (slice(0, -window_size),
            slice(-window_size, -shift_size),
            slice(-shift_size, None))
cnt = 0
for h in h_slices:
    for w in w_slices:
        img_mask[:, h, w, :] = cnt
        cnt += 1

mask_windows = window_partition(img_mask, window_size)  # nW, window_size, window_size, 1
mask_windows = mask_windows.view(-1, window_size * window_size)

attn_mask = mask_windows.unsqueeze(1) - mask_windows.unsqueeze(2)
attn_mask = attn_mask.masked_fill(attn_mask != 0, float(-100.0)).masked_fill(attn_mask == 0, float(0.0))

plt.matshow(img_mask[0, :, :, 0].numpy())
plt.matshow(attn_mask[0].numpy())
plt.matshow(attn_mask[1].numpy())
plt.matshow(attn_mask[2].numpy())
plt.matshow(attn_mask[3].numpy())

plt.show()

Relative position bias:在计算自我注意时,我们通过包含相对位置偏差来遵循[49,1,32,33] B ∈ RM 2×M 2,在计算相似性时,每个头部:

image-20220411151138440

image-20220411151256899

如表4所示,我们观察到与没有这个偏差项或使用绝对位置嵌入的对应项相比,有显著的改进。在[20]中进一步向输入中添加绝对位置嵌入会略微降低性能,因此我们的实现中不采用绝对位置嵌入。预训练中学习到的相对位置偏差也可用于初始化模型,以便通过双三次插值以不同的窗口大小进行微调[20,63]。

3.3. Architecture Variants

我们建立了我们的基础模型Swin-B,使其模型大小和计算复杂度与ViTB/DeiT-B相似。我们还介绍了Swin-T、Swin-S和Swin-L,它们分别是模型大小和计算复杂度的0.25倍、0.5倍和2倍。请注意,Swin-T和Swin-S的复杂性分别与ResNet-50(DeiT-S)和ResNet-101的复杂性相似。默认情况下,窗口大小设置为M=7。对于所有实验,每个头部的查询维度为d=32,每个MLP的扩展层为α=4。这些型号变体的架构参数包括: (主要就是两个参数,C预设图片维度数,layer numbers每层中transformer的块数

image-20220411151430474

4. Experiments

内容略只放表格

image-20220411151655334

image-20220411151715251

image-20220411151732154

image-20220411151745873

image-20220411151753431

image-20220411151811730

5. Conclusion

本文介绍了一种新的视觉变换器Swin Transformer,它能产生层次化的特征表示与输入图像大小有关,语句和具有线性计算复杂度。Swin Transformer在COCO对象检测和ADE20K语义分割方面实现了最先进的性能,显著超过了以前的最佳方法。我们希望Swin Transformer在各种视觉问题上的出色表现将促进视觉和语言信号的统一建模。

作为Swin Transformer的一个关键元素,基于移动窗口的自我注意被证明是解决视觉问题的有效方法,我们期待着研究它在自然语言处理中的应用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值