作者:陀飞轮@知乎(已授权)

来源:https://zhuanlan.zhihu.com/p/360513527

编辑:智源社区

近日,Swin Transformer拿到2021 ICCV Best Paper,青源研究组成员MSRA曹越也是重要作者之一。Transformer 如今在 CV 领域风生水起,从图像分类的 ViT,到目标检测的 DETR,再到图像分割的SETR等不一而足,那么此番屠榜各大CV任务的Swin Transformer到底做对了什么呢?

最近Transformer的文章眼花缭乱,但是精度和速度相较于CNN而言还是差点意思,直到Swin Transformer的出现,让人感觉到了一丝丝激动,Swin Transformer可能是CNN的完美替代方案。

作者分析表明,Transformer从NLP迁移到CV上没有大放异彩主要有两点原因:

1. 两个领域涉及的scale不同,NLP的scale是标准固定的,而CV的scale变化范围非常大。

2. CV比起NLP需要更大的分辨率,而且CV中使用Transformer的计算复杂度是图像尺度的平方,这会导致计算量过于庞大。

为了解决这两个问题,Swin Transformer相比之前的ViT做了两个改进:

1.引入CNN中常用的层次化构建方式构建层次化Transformer

2.引入locality思想,对无重合的window区域内进行self-attention计算。

相比于ViT,Swin Transfomer计算复杂度大幅度降低,具有输入图像大小线性计算复杂度。Swin Transformer随着深度加深,逐渐合并图像块来构建层次化Transformer,可以作为通用的视觉骨干网络,应用于图像分类、目标检测和语义分割等任务。

01

Swin Transformer 

整个Swin Transformer架构,和CNN架构非常相似,构建了4个stage,每个stage中都是类似的重复单元。和ViT类似,通过patch partition将输入图片HxWx3划分为不重合的patch集合,其中每个patch尺寸为4x4,那么每个patch的特征维度为4x4x3=48,patch块的数量为H/4 x W/4;stage1部分,先通过一个linear embedding将输划分后的patch特征维度变成C,然后送入Swin Transformer Block;stage2-stage4操作相同,先通过一个patch merging,将输入按照2x2的相邻patches合并,这样子patch块的数量就变成了H/8 x W/8,特征维度就变成了4C,这个地方文章写的不清楚,猜测是跟stage1一样使用linear embedding将4C压缩成2C,然后送入Swin Transformer Block。

另外有一个细节,Swin Transformer和ViT划分patch的方式类似,Swin Transformer也是先确定每个patch的大小,然后计算确定patch数量。不同的是,随着网络深度加深ViT的patch数量不会变化,而Swin Transformer随着网络深度的加深数量会逐渐减少并且每个patch的感知范围会扩大,这个设计是为了方便Swin Transformer的层级构建,并且能够适应视觉任务的多尺度。

上图是两个连续的Swin Transformer Block。一个Swin Transformer Block由一个带两层MLP的shifted window based MSA组成。在每个MSA模块和每个MLP之前使用LayerNorm(LN)层,并在每个MSA和MLP之后使用残差连接。

02

Shifted Window based MSA 

上图中红色区域是window,灰色区域是patch。W-MSA将输入图片划分成不重合的windows,然后在不同的window内进行self-attention计算。假设一个图片有hxw的patches,每个window包含MxM个patches,那么MSA和W-MSA的计算复杂度分别为:

(复杂度计算,计算  需要    ,计算    需要    ,与    相乘需要    ,然后得到的    需要乘以    需要    ,所以MSA总共需要    ;而W-MSA在windows内做self-attention,所以    需要    个windows且每个复杂度为    ,那么    总共计算复杂度为    ,同理与    相乘需要   ,所以W-MSA总共需要    )

由于window的patch数量远小于图片patch数量,W-MSA的计算复杂度和图像尺寸呈线性关系。

另外W-MSA虽然降低了计算复杂度,但是不重合的window之间缺乏信息交流,于是作者进一步引入shifted window partition来解决不同window的信息交流问题,在两个连续的Swin Transformer Block中交替使用W-MSA和SW-MSA。以上图为例,将前一层Swin Transformer Block的8x8尺寸feature map划分成2x2个patch,每个patch尺寸为4x4,然后将下一层Swin Transformer Block的window位置进行移动,得到3x3个不重合的patch。移动window的划分方式使上一层相邻的不重合window之间引入连接,大大的增加了感受野。

但是shifted window划分方式还引入了另外一个问题,就是会产生更多的windows,并且其中一部分window小于普通的window,比如2x2个patch -> 3x3个patch,windows数量增加了一倍多。于是作者提出了通过沿着左上方向cyclic shift的方式来解决这个问题,移动后,一个batched window由几个特征不相邻的sub-windows组成,因此使用masking mechanism来限制self-attention在sub-window内进行计算。cyclic shift之后,batched window和regular window数量保持一致,极大提高了Swin Transformer的计算效率。这一部分比较抽象复杂,不好理解,等代码开源了再补上。

03

实验结果

 

放一些实验结果,感受一下Swin Transformer对之前SOTA的降维打击。

图像分类上比ViT、DeiT等Transformer类型的网络效果更好,但是比不过CNN类型的EfficientNet,猜测Swin Transformer还是更加适用于更加复杂、尺度变化更多的任务。

目标检测碾压

语义分割碾压

目标检测在COCO上刷到58.7 AP(发表时第一)

实例分割在COCO上刷到51.1 Mask AP(发表时第一)

语义分割在ADE20K上刷到53.5 mIoU(发表时第一)

paper: https://arxiv.org/abs/2103.14030

code: https://github.com/microsoft/Swin-Transformer

一作解读: https://www.zhihu.com/question/437495132/answer/1800881612

04

总结

网络架构设计:CNN based和Transformer based

上一篇文章讨论了一下网络架构设计是以CNN为主好还是Transformer为主好的问题,Swin Transformer给出了答案。Swin Transformer 吸收了CNN的locality、translation invariance和hierarchical等优点,形成了对CNN的降维打击。

Swin Transformer改进思路还是源于CNN,Transformer站在巨人的肩膀上又迎来了一次巨大的飞跃,未来Transformer会接过CNN手中的接力棒,把locality、translation invariance和hierarchical等思想继续发扬光大。

了解更多信息请加入「计算机视觉」交流群

ICCV 2021 Best Paper | Swin Transformer何以屠榜各大CV任务!相关推荐

  1. 屠榜各大CV任务!最强骨干网络:Swin Transformer来了

    原文地址:https://mp.weixin.qq.com/s/z91JuI2w1QZg-3ZxN-OmwQ paper: https://arxiv.org/abs/2103.14030 code: ...

  2. 屠榜各大CV任务!最强骨干网络:Swin Transformer V2来了

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 转载自丨极市平台   作者丨happy 导读 针对SwinV1在更大模型方面存在的几点问题,Swin tra ...

  3. 重磅开源!屠榜各大CV任务!最强骨干网络:Swin Transformer来了

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 本文转载自:Smarter Swin Transformer 代码于2021年4月13日凌晨刚刚开源! ht ...

  4. 霸榜各大CV任务榜单,Swin Transformer横空出世!

    1. ImageNet-1K的图像分类 Swin Transformer: Hierarchical Vision Transformer using Shifted Windows 一元@炼丹笔记 ...

  5. ICCV 2021 Oral | 金字塔视觉Transformer(PVT):用于密集预测的多功能backbone

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 本文作者:whai362 |  来源:知乎(已授权) https://zhuanlan.zhihu.com/ ...

  6. ICCV 2021 | LeViT: a Vision Transformer in ConvNet‘s Clothing for Faster Inference论文阅读笔记

    论文:https://arxiv.org/abs/2104.01136 代码(刚刚开源): https://github.com/facebookresearch/LeViT ABSTRACT 我们设 ...

  7. 【读点论文】A ConvNet for the 2020s,结合swin transformer的结构设计和训练技巧调整resnet网络,在类似的FLOPs和参数量取得更好一点的效果

    A ConvNet for the 2020s Abstract 视觉识别的"咆哮的20年代"始于视觉transformer(ViTs)的问世,它迅速取代ConvNets成为最先进 ...

  8. 站在CNN肩膀上的巨大腾飞,Swin Transformer:实现对各类SOTA的降维打击

    作者丨陀飞轮@知乎(已授权) 来源丨https://zhuanlan.zhihu.com/p/360513527 导读 本文介绍了一种称为Swin Transformer的新型transformer, ...

  9. Swin Transformer理论讲解

    Swin Transformer: Hierarchical Vision Transformer using Shifted Windows Ze Liu, Yutong Lin, Yue Cao, ...

最新文章

  1. AJAX安全-Session做Token
  2. python画三维温度散点图-python 绘制三维图形、三维数据散点图
  3. 一个好用的ODBC数据库类CMYODBC
  4. Weblogic服务端请求伪造漏洞(SSRF)和反射型跨站请求伪造漏洞(CSS)修复教程...
  5. 正确地kill java历程
  6. 使用X.509数字证书加密解密实务(一)-- 证书的获得和管理
  7. 解决 安装或卸载软件时报错Error 1001 的问题
  8. 【NOIP2015】【Luogu2669】金币(模拟)
  9. Java:List判空的条件:List=null 和 List.size = 0 当需要对一个LIst进行判空操作时我们可使用如下两个语句:
  10. python爬取去哪网数据_Python爬虫入门:使用Python爬取网络数据
  11. 在CentOS6.5上安装/启动PostgreSQL
  12. Linux嵌入式系统的电子相册代码,基于嵌入式Linux和Qt编程实现数码相框的设计
  13. 基于Maven的SSM总体架构设计(四)
  14. We're on the cusp of deep learning for the masses. You can thank Google later
  15. 以太网 VLAN简介、MAC地址表与VLAN的关联内容
  16. 客户流失预测模型python_教你用Python快速上手构建客户流失模型分析
  17. 吐槽:某云待了三年,见证了我云的发展
  18. 易盾sdk引起项目的整体耗时问题?
  19. 混合A*算法(Hybrid A*)
  20. IoT设备如何“守门”?厂商拖慢修复节奏,设备出厂设置弱密码

热门文章

  1. efcore多表查询出错_如何提高sql查询的效率?
  2. python有多态特性吗_Python:多态、协议和鸭子类型
  3. url+用户名+密码_URI和URL详解
  4. hello world!!(Java)
  5. 使用 Java Native Interface 的最佳实践
  6. 基于PU-Learning的恶意URL检测——半监督学习的思路来进行正例和无标记样本学习...
  7. NGINX由入门到精通:Nginx介绍
  8. window下实现在线预览功能
  9. Ios上任意控件上添加自定义Badge
  10. IOS个人开发者账号注册