点击下方卡片,关注“CVer”公众号
AI/CV重磅干货,第一时间送达
本文转载自:Smarter
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
最近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架构,和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的方式略有不同,ViT是先确定patch的数量,然后计算确定每个patch的尺寸,而Swin Transformer是先确定每个patch的大小,然后计算确定patch数量。这个设计猜测是为了方便Swin Transformer的层级构建。
上图是两个连续的Swin Transformer Block。一个Swin Transformer Block由一个带两层MLP的shifted window based MSA组成。在每个MSA模块和每个MLP之前使用LayerNorm(LN)层,并在每个MSA和MLP之后使用残差连接。
02
上图中红色区域是window,灰色区域是patch。W-MSA将输入图片划分成不重合的windows,然后在不同的window内进行self-attention计算。假设一个图片有hxw的patches,每个window包含MxM个patches,那么MSA和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的降维打击。
图像分类碾压:
目标检测碾压
语义分割碾压
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等思想继续发扬光大。
另外附上原作者团队(曹越)的部分解读:
https://www.zhihu.com/question/437495132/answer/1800881612
在这个问题里潜水已久,借着今天组里放出了Swin Transformer,来回答一下。
在Attention is all you need那篇文章出来之后,就一直在思考一个问题:从建模的基本单元来看,self-attention module到底在vision领域能做什么?从现在回头看,主要尝试的就是两个方向:
1. 作为convolution的补充。绝大多数工作基本上都是从这个角度出发的,比如relation networks、non-local networks、DETR,以及后来的一大批改进和应用。其中一部分是从long-range dependency引入,某种程度上是在弥补convolution is too local;另一部分是从关系建模引入,例如建模物体之间或物体与像素之间的关系,也是在做一些conv做不了的事。
2. 替代convolution。在这个方向上尝试不多,早期有LocalRelationNet、Stand-alone Self-attention Net。如果仅看结果,这些工作基本上已经可以做到替换掉3x3 conv不掉点,但有一个通病就是速度慢,即使是写kernel依然抵不过对conv的强大优化,导致这一类方法在当时并没有成为主流。
到这个时候(2020年左右),我自己其实有一种到了瓶颈期的感觉,作为conv的补充好像做的差不多了,后续的工作也都大同小异,替代conv因为速度的问题难以解决而遥遥无期。
没想到的是,Vision Transformer(ViT)在2020年10月横空出世。
ViT的出现改变了很多固有认知,我的理解主要有两点:1. locality(局部性);2. translation invariance(平移不变性)。从模型本身的设计角度,ViT并不直接具有这两个性质,但是它依然可以work的很好,虽然是需要大数据集的。但DeiT通过尝试各种tricks使得ViT可以只需要ImageNet-1k就可以取得非常不错的性能,使得直接上手尝试变得没那么昂贵。
其实对ViT的accuracy我个人不是特别惊讶,一方面是因为之前在local relation那一系列已经证明了self-attention有替代conv的能力,另一方面是因为19年iclr有一篇paper叫BagNet,证明了直接切patch过网络,在网络中间patch之间没有交互,最后接一个pooling再做classification,结果也已经不错了,在这个的基础上加上self-attention效果更好是可以理解的。
我个人其实惊讶于ViT/DeiT的latency/acc curve,在local relation net里速度是最大的瓶颈,为什么ViT可以速度这么快?仔细对比ViT与local relation可以发现,这里一个很大的区别是,ViT中不同的query是share key set的,这会使得内存访问非常友好而大幅度提速。一旦解决了速度问题,self-attention module在替代conv的过程中就没有阻力了。
基于这些理解,我们组提出了一个通用的视觉骨干网络,Swin Transformer [paper] [code],在这里简单介绍一下。
1. 之前的ViT中,由于self-attention是全局计算的,所以在图像分辨率较大时不太经济。由于locality一直是视觉建模里非常有效的一种inductive bias,所以我们将图片切分为无重合的window,然后在local window内部进行self-attention计算。为了让window之间有信息交换,我们在相邻两层使用不同的window划分(shifted window)。
2. 图片中的物体大小不一,而ViT中使用固定的scale进行建模或许对下游任务例如目标检测而言不是最优的。在这里我们还是follow传统CNN构建了一个层次化的transformer模型,从4x逐渐降分辨率到32x,这样也可以在任意框架中无缝替代之前的CNN模型。
Swin Transformer的这些特性使其可直接用于多种视觉任务,包括图像分类(ImageNet-1K中取得86.4 top-1 acc)、目标检测(COCO test-dev 58.7 box AP和51.1 mask AP)和语义分割(ADE20K 53.5 val mIoU,并在其公开benchmark中排名第一),其中在COCO目标检测与ADE20K语义分割中均为state-of-the-art。
更详细的实验以及其他细节见[paper],感谢阅读~
PDF下载
后台回复:SwinT,即可下载上述论文PDF
后台回复:CVPR2021,即可下载CVPR 2021论文和代码开源的论文合集
重磅!CVer-垂直方向交流群成立
扫码添加CVer助手,可申请加入CVer-垂直方向 微信交流群,方向已涵盖:目标检测、图像分割、目标跟踪、人脸检测&识别、OCR、姿态估计、超分辨率、SLAM、医疗影像、Re-ID、GAN、NAS、深度估计、自动驾驶、强化学习、车道线检测、模型剪枝&压缩、去噪、去雾、去雨、风格迁移、遥感图像、行为识别、视频理解、图像融合、图像检索、论文投稿&交流、PyTorch和TensorFlow等群。
一定要备注:研究方向+地点+学校/公司+昵称(如目标检测+上海+上交+卡卡),根据格式备注,可更快被通过且邀请进群
▲长按加小助手微信,进交流群
▲点击上方卡片,关注CVer公众号