学习Swin变压器的概述

464 阅读7分钟

Swin Transformer的概述

2021年,在解决计算机视觉任务方面,变压器被引入以取代流行的卷积神经网络(CNN)。他们把这个模型称为视觉变压器(ViT)。

它产生了最先进的性能--超过了CNNs。然而,该模型只能很好地解决简单的分类任务,不能很好地概括复杂的视觉任务,如语义分割和物体检测。

研究人员引入了Swin Transformer模型来解决这个问题。它将滑动窗口(在CNN中使用)引入变形器,使其类似于ConvNets。本文将对这个模型进行概述。

视觉变形器(ViT)的问题

在2020年初,谷歌研究团队发布了视觉变形器模型。

这项研究在研究界被炒得沸沸扬扬,因为该模型引入了自然语言处理(NLP)中常用的变形器来解决计算机视觉任务。

给定一个输入图像,即1920px乘1080px,该模型将图像分解为16乘16px的斑块,然后再将它们送入输入层。

这些斑块通过线性变换被转化为斑块向量。在生成的线性投影上添加一个位置嵌入(以保持位置信息),然后送入一个标准的变形器编码器。

这个过程与NLP中变形器处理单词向量的方式相同。此后,对图像进行分类。

ViT是一个巨大的成功,它能够在解决计算机视觉任务方面超过大多数最先进的架构,如CNN。但是,这个模型并不完美。ViT有几个问题。

  • 四次方计算的复杂性。这种复杂性是由于ViT模型在全球范围内计算自我注意。当你增加图像大小时,计算时间会呈四次方增加。
  • ViT首先将图像分割成斑块,以保持序列长度在计算范围内。在解决分类任务时不会出现很多问题。但对于需要对每个像素进行详细处理的任务,如在物体检测和语义分割中,这个过程是有问题的。由于其计算的复杂性,该模型在解决更加通用和密集的计算机视觉任务时面临困难。

什么是Swin变换器

Swin Transformer模型是由亚洲的微软研究团队研究的一个模型。Swin (在Swin Transformer中)这个词是一个缩写,代表Shifted window 。这个shifted window 的概念对研究界来说并不新鲜。它已经在CNN中使用了很多年了。它是使CNN在计算机视觉领域出类拔萃的功能之一,因为它带来了巨大的效率。然而,它之前还没有被用于变形金刚。

ViT模型将变形金刚引入了计算机视觉。但正是Swin Transformer为变形金刚增加了这个功能。

这个模型仍然像ViT模型那样使用补丁。然而,Swin Transformer并不像ViT那样使用一种尺寸(16 x 16px),而是首先从第一个变形器层中的小补丁开始。

该模型将这些层合并成更深层的大补丁。它取一个图像并将其分割成4px乘4px的斑块。每个补丁是一个有三个通道的彩色图像。因此,一个补丁总共有48个特征维度。也就是说,4 x 4 x 3 = 48 。然后,它被线性转换为一个维度,称为C ,由你选择。

到目前为止,与ViTs相比,图像补丁的尺寸较小。这个值,C ,决定了你的转化器模型的大小。例如,我们有不同的BERT模型变体。

一个有748个维度的BERT-Base变体,和一个有1024个维度的BERT-Large变体。在这种情况下,C是748和1024。该值,C ,决定了全连接层中隐藏参数的数量。Swin变换器也有其变体。带有C=96 的Swin-Tiny ,和带有C=192 的Swin-Large 。

基本上,4 x 4 px的初始斑块被作为输入送入。这些斑块被线性转换为C维向量。与ViT模型不同的是,Swin Transformer在处理这些矢量输入时采用了一种巧妙的方法(移窗法),防止复杂性问题的产生。

它在图像输入大小的基础上增加了一个线性计算的复杂性。它只在局部窗口内计算自我注意,而不是像ViT模型那样全局计算。这一特点使该模型能够执行密集的识别任务,并使其能够用于更多的通用计算机视觉任务。

然后,输出结果由一个merging layer 。它将图像中2x2 相邻斑块组的向量连接起来。

每一次注意力窗口都会相对于前一层发生转变。例如,如果在第一层中,注意力被限制在这些区域的附近,在下一层中,这些区域被转移(就像在分层卷积中)。

在第一层中落在不同窗口的斑块无法沟通,现在可以在第二层中这样做。这些产生的斑块由合并层合并。这个过程会根据所选择的层数而重复进行。

下面是Swin Transformer的一个总结性架构。

Architecture of the Swin Transformer

图片来源。GitHub

Swin Transformer在图像分类、语义分割和物体检测任务上的表现优于ViT。在每个像素都必须被标记的情况下,比如在语义分割中,我们看到Swin Transformer的优势。

使用Swin Transformer进行图像分类的实施实例

Hugging团队预先建立了Swin Transformer模型,以演示如何使用PyTorch来使用该模型。

我们首先要安装变形器。

!pip install transformers

接下来,我们需要导入模型工作所需的库。

from transformers import AutoFeatureExtractor, SwinForImageClassification
from PIL import Image
import requests
  • 我们已经导入了AutoFeatureExtractor ,以帮助进行特征提取,而SwinForImageClassification ,将实际的Swin Transformer模型导入我们的代码中。
  • PIL 是Python图像库,它为Python解释器提供了图像编辑功能。
  • requests 允许你使用Python发送HTTP请求。
url = "https://images.unsplash.com/photo-1543466835-00a7907e9de1?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1074&q=80"
image = Image.open(requests.get(url, stream=True).raw)

上面的URL为我们提供了Unsplash上的小猎犬图片的链接。我们使用requests 发送一个HTTP请求来打开图片。图片被保存在一个叫做img 的变量中。

使用AutoFeatureExtractor ,我们将在HuggingFace的预训练模型上提取特征。我们使用的是前面提到的swin-tiny-patch4-window7-224 变量,其C(隐藏层的数量)为96。我们将这些特征保存在feature_extractor variable 。此外,我们加载预训练的模型并将其保存在变量model

feature_extractor = AutoFeatureExtractor.from_pretrained("microsoft/swin-tiny-patch4-window7-224")
model = SwinForImageClassification.from_pretrained("microsoft/swin-tiny-patch4-window7-224")

最后,我们对图像的类别进行预测。

predicted_class_idx = logits.argmax(-1).item()
print("Predicted class:", model.config.id2label[predicted_class_idx])

输出。

Predicted class: beagle

该模型正确地预测了输入该模型的图像。

总结

Swin变换器模型是一个新的视觉变换器模型,它产生了一个分层的特征表示,并且相对于输入图像的大小具有线性计算复杂性。与之前的视觉转化器(ViT)模型相比,它在COCO物体检测和语义分割方面取得了最先进的成果。

这些表现归功于该模型中部署的基于移位窗口的自我注意方法,这是使其发挥作用的关键。你可以采用本文提出的观点,并应用它们来帮助解决你感兴趣的问题。

Swin Transformers是一个改进的ViT模型,用分层的方式处理图像,使其更加通用。ConvNets试图从Transformers中借鉴,建立一个最先进的纯卷积模型。请阅读所有三个模型,因为它们都与解决计算机视觉任务有关。