【CVPR2022】CSWin Transformer详解

news2024/11/24 19:30:28

【CVPR2022】CSWin Transformer详解

  • 0. 引言
  • 1. 网络结构
  • 2. 创新点
    • 2.1 Cross-Shaped Window Self-Attention
    • 2.2 Locally-Enhanced Positional Encoding(LePE)
  • 3. 实验
  • 总结

0. 引言

Transformer设计中一个具有挑战性的问题是,全局自注意力的计算成本非常高,而局部自注意力通常会限制每个词向量的交互域。为了解决这个问题,作者提出了CSWin TransformerCSWin Transformer 在常见的视觉任务上展示了非常好的性能。具体来说,它在没有任何额外训练数据或标签的情况下,在 ImageNet-1K 分类任务上达到了 85.4% Top-1 准确率,在 COCO 检测任务上达到了 53.9 box AP46.4 mask AP,在 ADE20K 语义分割任务上达到了 51.7 mIOU均超过了SwinT。通过在更大的数据集 ImageNet-21K 上进一步预训练,在 ImageNet-1K 上达到了 87.5%Top-1 准确率,在 ADE20K 上达到了最先进的分割性能,达到了 55.7 mIoU

创新点:

  1. Cross-Shaped Window Self-Attention(交叉形状窗口注意力机制)
  2. Locally-Enhanced Positional Encoding(局部增加位置编码)

论文名称:CSWin Transformer: A General Vision Transformer Backbone with Cross-Shaped Windows
论文地址:https://arxiv.org/pdf/2107.00652.pdf
代码地址:https://github.com/microsoft/CSWin-Transformer

1. 网络结构

在这里插入图片描述
图左为CSWin Transformer整体结构,与Swin Transformer 结构进行对比可以发现:两个网络结构整体是类似的,CSWin TransformerSwin Transformer Block 变为了 CSwin Transformer Block,另外将Patch Merging 下采样 变为了 Conv下采样。图右为 CSwin Transformer Block 的具体结构,包含两个部分,一个是做LayerNormCross-shaped window self-attention,另一个则是做LayerNormMLP

数据经过模型的流程介绍:首先,输入数据是一个3通道彩色图像,尺寸为 H × W × 3 H\times W \times 3 H×W×3。图像首先经过一组步长 4 4 4卷积核 7 × 7 7\times 7 7×7 的卷积,得到的Feature Map的尺寸为 H 4 × W 4 × C \frac{H}{4}\times \frac{W}{4} \times C 4H×4W×C。之后CSWin Transformer分成4StageStage之间通过步长 2 2 2 的卷积对Feature Map来进行下采样。和典型的Resnet 50设计类似,每次下采样后,会减少token的数量,并将dimension增加一倍。一是为了提升感受野,二是为了增加特征

2. 创新点

2.1 Cross-Shaped Window Self-Attention

在这里插入图片描述

criss-cross 注意力机制

在全局注意力中,整个特征图被统一计算,计算成本非常高;而在Swin Transformer Block 中,SW-MSA被提出用来计算窗口注意力,在减少计算成本的基础上,通过对窗口进行平移重新计算注意力来打破不同窗口之间的限制,从而获取到全局信息。同样地,为了解决全局自注意力的计算成本非常高,而局部自注意力通常会限制每个词向量的交互域的问题。作者在基于criss-cross基础如上图所示)上对swin transformer进行了改进,将原有的非重叠和移动窗口改为了交叉型窗口,即Cross-Shaped Window Self-Attention
在这里插入图片描述
上图为Cross-Shaped Window Self-Attention 的计算流程。整体而言,整个特征图的计算分为横向计算纵向计算,并将计算得到的特征进行合并作为Cross-Shaped Window Self-Attention 的结果。
具体而言:根据多头自注意机制,对于输入特征 X ∈ R ( H × W ) × C X\in R^{(H×W)×C} XR(H×W)×C 。首先,将其线性投影到 K K K 个头部,然后每个头部将在水平或垂直条纹内执行局部自注意。

对于水平条纹自关注, X X X 被均匀拆分为 M = H S W M=\frac{H}{SW} M=SWH 个横条的数据,其中 S W SW SW 表示横条的宽度,可以调整以平衡学习能力和计算复杂度; X = [ X 1 , . . . , X M ] X=[X^1,...,X^M] X=[X1,...,XM]

对于每个条状特征 X i , i = 1 , 2 , . . . , M X^i,i=1,2,...,M Xi,i=1,2,...,M,使用Transformer可以得到它的特征 Y i Y^i Yi ,最后将这 M M M 个特征拼接到一起便得到了这个head的输入。假设它属于第 k k khead,那么横向自注意力 H − A t t e n t i o n k ( X ) H-Attention_k(X) HAttentionk(X) 的计算方式为:
X ∈ R ( H × W ) × C   X = [ X 1 , X 2 , . . . , X M ] , w h e r e   X i ∈ R ( S W × W ) × C   a n d   M = H S W   Y k i = A t t e n t i o n ( X i W k Q , X i W k K , X i W k V ) , w h e r e   i = 1 , . . . , M   H − A t t e n t i o n k ( X ) = [ Y k 1 , Y k 2 , . . . , Y k M ] X\in R^{(H×W)×C} \\\ X = [X^1,X^2,...,X^M], where\ X^i\in R^{(SW×W)×C}\ and \ M=\frac{H}{SW} \\\ Y^i_k = Attention(X^iW^Q_k, X^iW^K_k, X^iW^V_k), where \ i=1,...,M\\\ H-Attention_k(X) = [Y^1_k, Y^2_k,...,Y^M_k] XR(H×W)×C X=[X1,X2,...,XM],where XiR(SW×W)×C and M=SWH Yki=Attention(XiWkQ,XiWkK,XiWkV),where i=1,...,M HAttentionk(X)=[Yk1,Yk2,...,YkM]

纵向自注意力 V − A t t e n t i o n V-Attention VAttention H − A t t e n t i o n H-Attention HAttention 的计算方式类似,不同的是它是取的宽度为 S W SW SW 的竖条。

最终,这个block的输出表示为:
C S W i n − A t t e n t i o n ( X ) = C o n c a t ( h e a d 1 , . . . , h e a d K ) W O   h e a d k = { H − A t t e n t i o n k ( X )    k = 1 , . . . , K / 2 V − A t t e n t i o n k ( X )    k = K / 2 + 1 , . . . , K CSWin-Attention(X) = Concat(head_1,...,head_K)W^O \\\ head_k = \begin{cases} H-Attention_k(X) \ \ k=1,..., K/2 \\ V-Attention_k(X) \ \ k=K/2+1,...,K \end{cases} CSWinAttention(X)=Concat(head1,...,headK)WO headk={HAttentionk(X)  k=1,...,K/2VAttentionk(X)  k=K/2+1,...,K
其中 W O ∈ R C × C W^O\in R^{C\times C} WORC×C 用来调整Feature Map的通道数,并可以将两个不同方向的自注意特征进行融合。

如上所述,我们的自注意机制设计的一个关键见解是将多头分成不同的组,并相应地应用不同的自注意操作。换句话说,通过多头分组扩大了一个Transformer块中每个令牌的关注区域。相比之下,现有的自注意机制在不同的多头中应用相同的自注意操作。在实验部分,我们将证明这种设计将带来更好的性能。

计算复杂度分析
CSWin自关注的计算复杂度为:
Ω ( C S W i n ) = H W C ∗ ( 4 C + S W ∗ H + S W ∗ W ) Ω(CSWin) = HW C∗(4C + SW∗H + SW∗W) Ω(CSWin)=HWC(4C+SWH+SWW)
对于高分辨率输入,考虑H, W在前期大于C后期小于C,我们选择前期较小的SW,后期较大的SW。换句话说,调整SW提供了灵活性,可以在后期以有效的方式扩大每个令牌的关注区域。此外,为了使224 × 224输入的中间特征映射大小可以被SW整除,我们经验地将SW设置为1、2、7、7

2.2 Locally-Enhanced Positional Encoding(LePE)

在这里插入图片描述
因为Transformer是输入顺序无关的,因此需要向其中加入位置编码。上图左边为ViT模型的PE,使用的绝对位置编码或者是条件位置编码,只在embedding的时候与token一起进入transformer,中间的是SwinCrossFormer等模型的PE,使用相对位置编码偏差,通过引入token图的权重来和attention一起计算,灵活度更好相对APE效果更好。

本文所提出的LePE,相比于RPE更加直接,直接将位置编码添加加到了Value向量上,它的添加方式是通过将位置编码 E E E V V V 相乘完成的。然后通过一个short-cut将添加了位置编码 V V V 的和通过自注意力加权的 V V V 单位加到一起,公式如下:
A t t t e n t i o n ( Q , K , V ) = S o f t M a x ( Q K T / d ) V + E V Atttention(Q,K,V) = SoftMax(QK^T/\sqrt{d})V + EV Atttention(Q,K,V)=SoftMax(QKT/d )V+EV

这里作者基于一个假设:对于一个输入元素,他附近的元素提供最重要的位置信息。所以对V做一个深度卷积 E E E ,加到softmax之后的结果上。公式为:
A t t t e n t i o n ( Q , K , V ) = S o f t M a x ( Q K T / d ) V + D W C o n v ( V ) Atttention(Q,K,V) = SoftMax(QK^T/\sqrt{d})V + DWConv(V) Atttention(Q,K,V)=SoftMax(QKT/d )V+DWConv(V)

这样,LePE可以友好地应用于将任意输入分辨率作为输入的下游任务。从另一个角度看,CSWin-Transformer block是一个由十字形窗口自注意力和CNN组成的多分支的结构。

3. 实验

为了与类似设置下的其他Transformer进行公平的比较,作者构建了四种模型,CSWin-T, CSWin-S, CSWin-B, CSwin-L,这里的FLOPs都是在224x224条件下计算的。
在这里插入图片描述
为了证明有效性,作者对ImageNet- 1K 分类、COCO 目标检测和ADE20K 语义分割进行了实验。
在这里插入图片描述

不同模型对ImageNet-1K分类的比较。*表示用不同输入大小进行训练。这里的模型是根据计算复杂度进行分组的。

CSWin-T仅4.3GFLOPs达到82.7%的Top-1准确度,超过CvT-13、Swin-T和DeiT-S。CSWin-S和CSWin-B也取得了最好的性能。当对384×384输入进行微调时,也观察到一样的趋势。作者发现CSWin是唯一一种基于Transformer架构并且在small和base设置下取得了和Effificient Net相当甚至更好的结果,同时计算复杂度更低。
在这里插入图片描述

使用Mask R-CNN框架在COCO val2017上的目标检测和分割性能

Mask R-CNN的结果,CSWin Transformer优于所有的CNN和Transformer同行。
在这里插入图片描述

使用Cascade Mask R-CNN框架在COCO val2017上的目标检测和实例分割性能

表5报告了使用Cascade Mask R-CNN 框架的结果。
在这里插入图片描述

在ADE20K分割任务上的性能比较

使用ImageNet-21K预训练模型时,CSWin-L进一步达到55.7 mIoU,超过之前的最佳模型,计算复杂度更小。

消融实验:
在这里插入图片描述

基于条纹的attention机制的比较

当用用顺序的多头注意力机制替换并行方式时,CSWin在所有任务上的性能都会下降。CSWins w = 1 在ImageNet上的表现略优于Axial,但在下游任务上明显优于它。sw = 2 CSWin的表现略优于 Criss-Cross,而CSWin的速度比它在不同任务上的速度快2∼5,进一步证明了“并行”设计更有效。
在这里插入图片描述

条纹宽度的消融实验

在图4中,随着条纹宽度的增加,计算成本(FLOPS)增加,Top-1的分类准确度在开始时大大提高,当宽度足够大时则减慢。默认设置[1,2,7,7]在准确度和FLOPs之间实现了一个很好的权衡。

在这里插入图片描述

不同的Self-Attention机制的比较

使用Swin-T作为主干,只改变了Self-Attention。
在这里插入图片描述

不同位置编码机制的比较

用CSWin-T作为主干,并且只使用位置编码。LePE与其他位置编码机制(APE、CPE 和RPE)进行了比较,用于图像分类、目标检测和图像分割。此外,还测试了没有PE和CPE*的变量。

根据比较结果,可以看到: 1)位置编码可以通过引入局部归纳偏置带来性能增益;2)虽然RPE在固定输入分辨率的分类任务中取得了相似的性能,但LePE在输入分辨率不同的下游任务上表现更好

总结

CSWin Transformer的核心设计是Cross-Shaped Window Self-Attention,它通过将Multi-head分成并行组,水平和垂直条纹进行Self-Attention。这种设计可以有效地扩大一个Transformer块内每个token的注意区域,并且随着stage的加深,SW宽度变宽感受野会迅速扩大。另一方面,将局部增强的位置编码引入到CSWin Transformer中,用于下游任务。在有限的计算复杂度下,在各种视觉任务上实现了先进的性能。
如果有什么疑问欢迎在评论区提出,对于共性问题可能会后续添加到文章介绍中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/599616.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python代码怎么敲:了解Python编程语言

Python代码怎么敲:了解Python编程语言 Python是一种高级编程语言,具有易读易用和高效性等优点。这使得Python成为了程序员的最佳选择,并成为了广泛应用于机器学习、Web开发、数据分析等领域。 Python代码敲法:小技巧 Python代码…

chatgpt赋能python:Python主要语句介绍

Python主要语句介绍 Python是一种广泛使用的高级编程语言,其语法简介、易于学习,并有丰富的库和工具支持。在Python中,主要的语句可以帮助开发人员快速编写代码,实现各种各样的任务。在本文中,我们将介绍Python中的主…

性能优化之高Log file sync等待实战案例分享

故障情况 AWR报告如下: 之后他们把大部分业务停掉后,Log file sync等待事件还是非常高。 通过对比昨天跟今天相同时间的AWR,在业务量小非常多的情况,等待时间还是高非常大。 诊断过程 log file sync等待事件首先判断当前系统IO…

“微商城”项目(1环境搭建)

开发工具分享: 百度网盘: 链接:https://pan.baidu.com/s/1lSsCjf-_zx1ymu6uZeG26Q?pwdhuan 提取码:huan 一、环境搭建说明 本项目服务端环境要求为 Windows Apache PHP MySQL。 下面介绍如何搭建环境,部署服…

CW32系列模数转换器(ADC)

模数转换器(ADC)的主要功能是将模拟量转换为数字量,方便MCU进行处理。下面以CW32L083为例介绍CW系列的模数转换器的特点和功能,并提供演示实例。 一、概述 CW32L083 内部集成一个 12 位精度、最高 1M SPS 转换速度的逐次逼近型模…

位操作符的应用

目录 位操作符的概念: 一、&(按位与):两个整数的补码对应的二进制位有0则为0,两个同时为1才为1,得到的数仍为补码。 二、|(按位或):两个整数的补码对应的二进制位…

Effective第三版 中英 | 第2章 创建和销毁对象 | 当面临多个参数的构造器时考虑使用构建器

文章目录 Effective第三版前言第2章 创建和销毁对象当面临多个参数的构造器时考虑使用构建器 Effective第三版 前言 大家好,这里是 Rocky 编程日记 ,喜欢后端架构及中间件源码,目前正在阅读 effective-java 书籍。同时也把自己学习该书时的笔…

【KKT】∇f(x)+λ∇g(x)=0中λ的讨论

Karush-Kuhn-Tucker (KKT)条件 〇、问题背景 在阅读 Karush-Kuhn-Tucker (KKT)条件 时,不太能理解 ∇ f \nabla f ∇f 的方向,以及 ∇ g \nabla g ∇g 的方向: 为什么 ∇ f \nabla f ∇f 是指向可行域内部, ∇ g \nabla g ∇g…

Java多线程方面知识

目录 1.程序、进程、线程 2.进程与线程的内存解析 3.并发与并行 4.Java程序的线程 5.多线程的创建:方式一:继承于Thread类 6.start方法的作用 7.使用start()时要注意的问题 8.Thread类中的一些方法 9.线程的优先级 10.多线程的创建&#xff1a…

【JAVA】清缓存(打断点删除 / 新增表或字段无效)

一. 打断点无效 情景 新写了一个获取列表数据接口,前端调用的,获取到的数据为空数组。在数据库中查看,是有数据的,但是调用接口返回数据为空。接下来就打断点啦,发现无效!表现如下 没有可执行的…

【Bio】牙的分类

文章目录 IncisorCentral IncisorLateral Incisor Canine / CuspidPremolarFirst PremolarSecond Premolar MolarFirst MolarSecond MolarThird Molar / Wisdom Tooth Ref Incisor Central Incisor Lateral Incisor Canine / Cuspid Premolar First Premolar Second Prem…

第六十二天学习记录:C语言进阶:C语言预处理2

带副作用的宏参数 当宏参数在宏的定义中出现超过一次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能出现危险,导致不可预测的后果。副作用就是表达式求值的时候出现的永久性效果。例如: x1;//不带副作用 x;//带有副作…

安全认证:

1. 认证概述 为什么要有认证? 防止非法路由器接入企业内网的ospf路由器,保护内网安全 2. 认证方式 认证方式分为接口认证和区域认证,接口认证和区域认证没有本质的区别,接口认证是当区域内链路过多的情况下,接口认证…

Java网络开发(Tomcat)—— Servlet学习 Web相关背景知识 JavaWeb项目初步

本文目录 引出一、软件架构BS和CS二、实现Web服务的条件和步骤三、Tomcat搭建Web项目初步1.pom.xml文件配置2.web.xml文件更新3.Tomcat运行环境配置4.项目文件层级解析 四、JavaWeb项目文件分类(1)静态文件—存放位置(2)动态文件-…

【用人话讲算法】leetcode无重复字符的最长子串

【用人话讲算法】leetcode无重复字符的最长子串 文章目录 【用人话讲算法】leetcode无重复字符的最长子串题目简单思路(暴力)优化思考怎么写代码?怎么到下一个?whilefor 思路总结while和for循环总结 题目 题目的意思是说&#xff…

一台电脑上安装多个版本的python,运行互不干扰,显示位置的一些命令,

首先需要知道一些命令: pip show 包名 可以使用pip show 包名的方式显示位置 pip list pip方式显示的是当前环境下的库 os.environ.get() python中os模块获取环境变量的一个方法 Python os.environ.get()的用法 …

使用Git LFS上传Unity大型资源文件

在使用Unity制作结课作业时,使用到git工具进行版本控制与多人协作。在提交项目至远程仓库的过程中,git bash提示了以下报错: remote: warning: File Assets/Models/Z_India_5.29.fbx is 57.31 MB; this is larger than GitHubs recommended m…

利用环回口建立IBGP邻居

利用环回口建立IBGP邻居 BGP的稳定性 IBGP : 1.一般使用环回口建立IBGP邻居 2.指定建立IBGP邻居的源地址为lookback地址 EBGP : 1.一般使用直连接口建立EBGP邻居关系 2.如果想使用环回口建立EBGP邻居,需要将TTL值修改为大于1,默认TTL1 修改命令…

在win10/11的右键菜单添加电源选项

前言: 今天,博主从网上找到了在右键菜单中添加电源选项的方法,觉得挺实用的所以来教大家 方法: 下载(懒人专用,直接打开文件即可): csdn中下载(启用和关闭文件都有&a…

基于 Docker_redis6.0.8 实现 Redis 集群扩缩容

文章目录 单机部署数据分区方案集群部署集群容错测试集群扩容测试集群缩容测试 LXL:这玩意太枯燥,看完需要耐心 ~~~ 单机部署 通过 dockerhub 查找 redis 镜像,选择 6.0.8 版本。创建挂载目录,并赋予权限。 mkdir -p /var/docker…