Swin Transformer: Hierarchical Vision Transformer using Shifted Windows(ICCV2021)

本文主要是介绍Swin Transformer: Hierarchical Vision Transformer using Shifted Windows(ICCV2021),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Swin Transformer

  • 摘要
  • 引言
  • 方法
  • 实验

在这里插入图片描述

摘要

本文提出了一种新的Vision Transformer,称为Swin Transformer,可以作为计算机视觉领域的通用主干。将Transformer从NLP应用到CV会面临一些挑战,这些挑战主要来自两个方面:一个是尺度问题,视觉领域中的目标往往尺度差异很大(比如一张街景图像,里面的行人和汽车有大有小),而NLP中的Transformer并不需要考虑这个问题;另一个是图像分辨率高的问题,需要对其进行预处理缩小序列长度。针对这些挑战,作者提出了一种hierarchical transformer,其特征表示通过移动窗口(Shifted windows)计算得到。移动窗口设计一方面将自注意力计算限制在非重叠的局部窗口,序列长度大大降低,从而带来了更高的效率;另一方面shift操作可以让两个窗口之间实现信息交互,因此上下层之间就可以通过跨窗口连接,变相的达到一种全局建模的能力。这种层级式结构不仅非常灵活,可以提供各种尺度的特征信息,而且计算复杂度只会随着图像大小的变化进行线性增长,而不是平方级增长。Swin Transformer的这些特性,使其能够很好地被应用于计算机视觉的下游任务。

引言

在本文中,作者试图拓展Transformer的适用性,使其可以作为视觉领域的通用主干,不光在分类任务上,在检测、分割等其他任务上也能取得很好的效果。Transformer应用于视觉领域会面临两大挑战:(1)现有的基于Transformer的模型中,token都是固定维度的,这一特性并不适合视觉应用;(2)与句子中的单词相比,图像像素分辨率要高得多,对于许多视觉任务(如语义分割),需要在像素级上进行密集预测,而这对于Transformer来说是困难的,因为其自注意力的计算复杂度会达到图像大小的平方级。

在这里插入图片描述

为了克服上述挑战,作者提出了Swin Transformer。如上图(b)所示,ViT将图像分割成许多个16×16大小的patch,这些patch的尺寸从始至终都是固定的,虽然能达到全局建模的能力,但对多尺度特征的把握会相对弱一些。在目标检测和目标分割等下游任务中,多尺度特征至关重要。比如对于目标检测中的多尺度而言,应用最广的一个方法是Feature Pyramid Network(FPN),当有一个分层式的卷积神经网络,每一个卷积层出来的特征所具有的感受野是不一样的,因此能抓住物体不同尺寸的特征,从而能够很好地处理物体不同尺寸的问题。在ViT中,它产生的是单一尺寸且低分辨率的特征图,不适合处理密集预测型任务;而且它始终是在全局做自注意力计算,因此它的计算复杂度是以图像尺寸平方级的形式增长。上图(a)就是作者提出的Swin Transformer,它借鉴了很多卷积神经网络的设计理念和先验知识。比如为了减少序列长度,降低计算复杂度,Swin Transformer采取了在小窗口中计算自注意力,而不是像ViT一样在整图上进行计算,这样的话只要窗口大小是固定的,自注意力的计算复杂度就是固定的,整张图的计算复杂度就会跟图像大小成线性增长关系。Swin Transformer的这一计算方式其实就是借鉴了CNN中的locality这个归纳偏置,即利用了局部性的这个先验知识。同一个物体的不同部位或者语义相近的不同物体还是大概率会出现在相邻的地方,因此在小范围窗口中计算自注意力也是差不多够用的,全局计算自注意力对于视觉任务来说有点浪费资源。

对于多尺度特征,CNN之所以能够提取多尺度特征,主要在于池化操作,池化能够增大每一个卷积核看到的感受野,从而使得每一次池化后的特征能够抓住物体的不同尺寸。受此启发,Swin Transformer也提出了类似于池化的操作,叫做patch merging,就是把相邻的小patch合成一个大patch,合并后的大patch就能看到之前四个小patch看到的东西,从而增大了感受野,同时还能抓住多尺寸的特征。Swin Transformer的一个关键设计元素就是移动窗口操作,如下图所示。

在这里插入图片描述

图中的每一个灰色小方格都是一个4×4大小的小patch,每个红色的框是一个中型的计算单元(也就是一个窗口),在Swin Transformer中一个窗口默认有7×7=49个小patch的,这里就是画个示意图。从Layer1到Layer1+1就相当于将Layer1中的整个图像向右下角移了两个方格单元。

方法

在这里插入图片描述

Swin Transformer的整体架构如上图所示。假设有一张大小为224×224×3的图像,首先第一步就像ViT一样将图像分割成许多个patch,与ViT不同的是,Swin Transformer的每个patch大小为4×4×3,拉直后就是48维,因此经过patch partition之后,一张图像的尺寸变成了56×56×48,也就是一个3136×48的矩阵。然后将这些patch送入线性投射层,使得向量维度变成预先设置好的值C,Swin Transformer的一个变体Swin-T将这个超参数C设为96,3136×48经过线性投射层后就变成了3136×96。3136的序列长度对于Transformer来说是相当大的,因此Swin Transformer引入了基于窗口的自注意力计算,每个窗口有7×7=49个patch,也就是说序列长度就变成了49,大大降低了计算复杂度。在Stage 1中,Swin Transformer Block的输入是56×56×96,输出也是56×56×96。想获取到多尺寸的特征信息,那么就要构建一个层级式的Transformer,也就是要像卷积神经网络一样,弄一个类似于池化的操作出来。Swin Transformer提出了patch merging的操作,它的操作过程如下图所示。在Stage 2中,经过patch merging后,图像的H、W各缩小2倍,C变成4倍,然后会用一个1×1的卷积将4C降维到2C,Swin Transformer Block的输入为28×28×192,输出也是28×28×192。在Stage 3中,经过patch merging后,Swin Transformer Block的输入为14×14×384,输出也是14×14×384。在Stage 4中,经过patch merging后,Swin Transformer Block的输入为7×7×768,输出也是7×7×768,也就是说在最后一个阶段,只有一个窗口,这个窗口就代表了整个图像特征。

在这里插入图片描述

Swin Transformer特征图的维度跟卷积神经网络(残差网络)很像,而且为了和CNN保持一致,Swin Transformer并没有像ViT一样使用class token,而是在得到最后的特征图之后,用了一个全局平均池化(GAP)操作,将7×7取平均变成1。整体框架图中没有画出GAP,因为Swin Transformer并不是只用来做分类,它还能用于检测、分割等其他下游任务,如果是做分类的话,7×7×768经过GAP操作后就变成了1×768。

全局自注意力和基于窗口的自注意力的计算复杂度如下面公式所示,M=7为一个窗口的边长,假设h和w都是56,则 ( h w ) 2 = 3136 × 3136 (hw)^2=3136×3136 (hw)2=3136×3136 M 2 h w = 49 × 3136 M^2hw=49×3136 M2hw=49×3136,计算复杂度相差64倍,可以说是非常大了。

在这里插入图片描述

基于窗口的自注意力虽然大幅降低了计算复杂度,但是窗口之间没有信息交互了,全局建模的缺失会限制模型性能。针对这一问题,Swin Transformer提出了移动窗口方法,该方法将整幅图像向右下角移动两个窗口单元,而后再根据下图所示过程对移动后的窗口进行处理。在Swin Transformer中,先做一遍基于窗口的多头自注意力,再做一遍基于移动窗口的多头自注意力,这样就能实现窗口与窗口之间的信息交互,从而达到全局建模的能力。

在这里插入图片描述

Swin Transformer有以下几种变体,其中Swin-T的计算复杂度与ResNet50差不多,Swin-S的计算复杂度与ResNet101差不多,Swin-T、Swin-S、Swin-L的模型规模和计算复杂度分别是Swin-B的0.25、0.5、2倍。这几个变体中,不同的地方主要在于超参数C(线性投射后得到的向量维度)的大小和Transformer Block的数量。其中基于窗口的多头自注意力是一个block,基于移动窗口的多头自注意力也是一个block,这两个block连在一起计算,因此layer numbers中的2指的就是一个窗口block和一个移动窗口block。

在这里插入图片描述

实验

Swin Transformer与其他先进算法在图像分类任务上的性能比较:

在这里插入图片描述

相似规模的Swin Transformer与ResNet的性能比较:

在这里插入图片描述

Swin Transformer与其他先进算法在目标检测和实例分割数据集COCO上的性能比较:

在这里插入图片描述

Swin Transformer与其他先进算法在语义分割数据集ADE20K上的性能比较:

在这里插入图片描述

移动窗口和相对位置编码带来的性能提升消融实验:

在这里插入图片描述

这篇关于Swin Transformer: Hierarchical Vision Transformer using Shifted Windows(ICCV2021)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/706577

相关文章

在 Windows 上部署 gitblit

在 Windows 上部署 gitblit 在 Windows 上部署 gitblit 缘起gitblit 是什么安装JDK部署 gitblit 下载 gitblit 并解压配置登录注册为 windows 服务 修改 installService.cmd 文件运行 installService.cmd运行 gitblitw.exe查看 services.msc 缘起

Windows如何添加右键新建菜单

Windows如何添加右键新建菜单 文章目录 Windows如何添加右键新建菜单实验环境缘起以新建`.md`文件为例第一步第二步第三步 总结 实验环境 Windows7 缘起 因为我习惯用 Markdown 格式写文本,每次新建一个.txt后都要手动修改为.md,真的麻烦。如何在右键新建菜单中添加.md选项呢? 网上有很多方法,这些方法我都尝试了,要么太麻烦,要么不凑效

Windows下Nginx的安装及开机启动

1、将nginx-1.16.1.zip解压拷贝至D:\web\nginx目录下。 2、启动Nginx,两种方法: (1)直接双击nginx.exe,双击后一个黑色的弹窗一闪而过。 (2)打开cmd命令窗口,切换到nginx目录下,输入命令 nginx.exe 或者 start nginx ,回车即可。 3、检查nginx是否启动成功。 直接在浏览器地址栏输入网址 http://lo

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库,由 WebM 项目开发和维护,专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩,广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速支持以及灵活的接口设计,使其可以轻松集成到各种应用程序中。 libvpx 的安装和配置过程相对简单,用户可以从官方网站下载源代码

C++实现俄罗斯方块(Windows控制台版)

C++实现俄罗斯方块(Windows控制台版) 在油管上看到一个使用C++控制台编写的俄罗斯方块小游戏,源代码200多行,B站上也有相关的讲解视频,非常不错,值得学习。 B站讲解视频地址为:【百万好评】国外技术大神C++游戏编程实战教程,油管580W收藏,新手10小时入门,并快速达到游戏开发能力(中英字幕) B站 CSDN博主千帐灯无此声还为此写了一篇博客:C++实现俄罗斯方块(源码+详解),讲

Windows下php扩展开发c++动态库

PHP扩展开发,从零了解到初步完成一个小项目,经过三天的仔细研究,现整理如下 一、需求介绍 PHP扩展开发,调用自己之前的c++动态库,完成功能 二、项目之前 系统:windows xp  开发工具:vs 2008 web环境:apache2.4  PHP5.3.29-VC9-ts-x86 aphach和PHP 环境之前已经搭建完成 PHP源码:去官网http://www.php.n

OpenStack镜像制作系列4—Windows Server2019镜像

本系列文章主要对如何制作OpenStack镜像的过程进行描述记录  CSDN:OpenStack镜像制作教程指导(全) OpenStack镜像制作系列1—环境准备 OpenStack镜像制作系列2—Windows7镜像 OpenStack镜像制作系列3—Windows10镜像 OpenStack镜像制作系列4—Windows Server2019镜像 OpenStack镜像制作系

Windows与linux中docker的安装与使用

windos中安装使用docker 下载Docker_Desktop 安装包进入docker官网下载Docker_Desktop: https://www.docker.com/ 启用wsl 我们搜索“启用或关闭Windows功能”,打开后勾选适用于Linux的Windows 子系统 Docker_Desktop设置 出现Docker Engine stopped的解决

Windows 10 各版本

对应于服务选项的 Windows 10 当前版本 Version服务选项上市日期OS build最后修订日期1803半年频道7/10/201817134.1917/24/2018Microsoft 建议使用1803半年频道(定向)4/30/201817134.1917/24/20181709半年频道1/18/201816299.5797/24/20181709半年频道(定向)10/17/2017

Windows系统不关机故障的解决方法

当Windows系统出现不关机故障时,首先要查找引起Windows系统不关机的原因,然后根据 具体的故障原因采取相应的解决方法。   Windows系统不关机故障的解决方法如下。   1.检查所有正在运行的程序   检查运行的程序主要包括关闭任何在实模式下加载的TSR程序、关闭开机时从启动组自动启 动的程序、关闭任何非系统引导必需的第三方设备驱动程序。   检查运行的程序并停