Swin Transformer:用Transformer实现CNN多尺度操作

文本是关于Swin Transformer基础知识的了解

论文:https://arxiv.org/pdf/2103.14030

项目:https://github. com/microsoft/Swin-Transformer.

实现一个Swin Transformer:Swin Transformer模型具体代码实现-CSDN博客

Swin Transformer mlp版本实现:Swin Transformer 变体1:使用MLP代替多头注意力机制-CSDN博客

Swin Transformer v2版本实现:Swin Transformer变体2:Swin Transformerv2模型-CSDN博客

原理总览:

1、总述:

Swin Transformer和Vision Transformer很像,他们都是将NLP领域的Transformer架构引入计算机视觉领域期待大力出奇迹的产物,不同的是,Vision Transformer由于它固定的尺度(16x16大小的patch),它并不适合密集预测,比较适合于图像分类任务,对于目标检测、语义分割这种任务就有点困难,而且最主要的问题是,ViT使用的是全局注意力机制,这种注意力的最大问题是计算成本和内存消耗太大。而Swin transformer的目标不是做一类任务,它想做视觉任务的骨干模型。

Swin Transformer 做出的第一大改进就是在窗口内计算注意力,这样的话就把复杂度从与图片大小的平方关系改进到了线性关系,因为窗口内计算注意力的计算量相比全局注意力的计算量差距很大,很多个窗口完全可以并行在batch中计算。

第二大改进就是引入了移动窗口,因为Swin Transformer 使用窗口注意力,那么就有一个问题,不同窗口之间的信息怎么交互呢,作者引入了窗口移动机制,使用两个block层,第一个block层中使用现有的窗口做自注意力计算,之后移动窗口,具体来说就是将patch矩阵沿着右下角移动window_size//2个单位,之后在第二个block中计算新的窗口中的注意力计算,在计算完成之后进行反向移动操作,将之前的移位操作复原。

第三大改进就是学习CNN的pooling机制,实现了层次化的多尺度建模,这样的话有助于学习不同尺度的特征,对密集预测十分有帮助,这点在论文的实验结果部分表现得很清楚。

Swin Transformer的这些特性使其与广泛的视觉任务兼容,包括图像分类(在ImageNet-1K上达到87.3%的top-1准确率)和密集预测任务,如目标检测(在COCO测试集上达到58.7的box AP和51.1的mask AP)和语义分割(在ADE20K验证集上达到53.5的mIoU)。其性能超越了之前的最先进水平,COCO上提高了+2.7 box AP和+2.6 mask AP,ADE20K上提高了+3.2 mIoU,展示了基于Transformer的模型作为视觉骨干网络的潜力。层次化设计和移动窗口方法也证明了对全MLP架构的益处。

2、总体架构:

Swin Transformer总体来说分为4个阶段:

首先,对于输入的图像数据,需要先进行Patch Partition操作,也就是分块,这里的patch大小为4x4,相比于ViT的patch大小16x16,Swin Transformer的每个patch可以保留更细节的信息。如上图,(H//4)*(W//4)表示的是patch数量,48表示的是3x4x4,也就是一个patch的三个通道的所有像素的拼接,以此作为每个patch的特征,之后经过嵌入,将48映射为C(tiny和small模型中默认为96,big和large模型默认为192),这里所有的操作其实在代码实现中都是通过一个卷积层实现的,具体可以参考ViT的实现。

2.1、stage 1:

上图架构是Swin Transformer-T模型的架构图,他的第一阶段有2个block层,在Swin Transformer中,2个block作为一组同时出现,所以每个阶段的block数量都为偶数:

在第一个阶段中,对于输入的数据【B,H//4*W//4,C】:

在第一个block中不进行窗口移动,只进行窗口自注意力计算,我们可以详细分析一下这中间的特征形状变化:对于输入数据形状 :【B,H//4*W//4,C】,首先将一维序列展开为二位序列:【B,H//4,W//4,C】,之后划分窗口:【B*num_windows,windows_size,windows_size,C】,其中windows_size是窗口大小,默认为7,num_windows为窗口数量=(H//4//windows_siz,W//4//windows_size),之后根据每个block的注意力头的数量重塑形状为:【B*num_windows,head,windows_size*windows_size,C//head】,其中,windows_size*windows_size就是一个窗口内的序列长度,C//head就是每个元素的特征,这样的话,就把原本ViT的全局注意力计算变为了窗口注意力计算(ViT:【B,head,(H//16)*(W//16)+1,C//head】),这里需要注意,在计算完计算力得分之后,还有一个相对位置偏移需要相加,这一点将在本章的第5节讲解。计算完注意力,需要将窗口合并,即形状变为【B,H//4,W//4,C】,之后将数据形状重塑回到原始形状【B,H//4*W//4,C】即可进入下一个block。

在第二个block中,需要进行窗口的移动,这个操作在划分窗口前进行,只需要调用torch.roll函数即可。在注意力计算阶段,由于窗口发生了变化,相对应的注意力计算区域也发生了变化,为了保证窗口数量不变以及不计算不应该计算位置的注意力得分,这里对于QK^{T}的结果要进行掩码处理,具体操作在本章的第6节讲解。进行完注意力计算之后,需要进行窗口合并,即形状变为【B,H//4,W//4,C】,然后将之前移动的窗口还原,之后将数据形状重塑回到原始形状【B,H//4*W//4,C】

2.2、stage 2:

stage 2第一个操作是降采样操作,也就是patch_merging,这个将在本章的第三节进行讲解,降采样的结果就是将图像尺寸减半,将通道加倍,这个操作是在模仿CNN中的池化操作,经过该操作输入数据变为【B,H//8*W//8,2C】

stage 2 的Swin Transformer block的流程和stage1 完全一致,就是输入数据形状不一样。

2.3、stage 3:

stage 3第一个操作和stage 2一样,都是降采样把图像尺寸减半,将通道加倍,这个操作是在模仿CNN中的池化操作,经过该操作输入数据变为【B,H//16*W//16,4C】

stage 3 的Swin Transformer block的流程和stage1 完全一致,就是输入数据形状不一样,同时stage 3有6个block。

2.4、stage 4:

stage 4第一个操作和stage 2一样,都是降采样把图像尺寸减半,将通道加倍,这个操作是在模仿CNN中的池化操作,经过该操作输入数据变为【B,H//32*W//32,8C】

stage 4 的Swin Transformer block的流程和stage1 完全一致,就是输入数据形状不一样。

2.5、输出处理:

stage 4的输出经过平均池化和压缩之后,得到输出结果,形状为:[B, num_features],之后经过Swin Transformer head的映射,输出结果[B, num_classes]

3、patch_merging:

该模块是模型的降采样模块,是把图像尺寸减半,将通道加倍,这个操作是在模仿CNN中的池化操作。下面的图可以简要描述这种操作:

上图中的1,2,3,4代表的是应该在分割后归属的图的标号而不是真实值,按照上图所示的逻辑,将原始数据分割为4部分,每一部分形状为 【B,H//2,W//2,C】,在C通道维度拼接为【B,H//2,W//2,4C】,之后将4C维度映射为2C:【B,H//2,W//2,2C】

4、窗口自注意力机制和全局自注意力机制运算量:

\Omega (MSA)=4hwC^{2}+2(hw)^{2}C

\Omega (WMSA)=4hwC^{2}+2M^{2}hwC 

其中,h和w是图像的高和宽,C是通道数量,M是窗口大小。

我们知道全局多头自注意力机制的运算包括4个矩阵映射、2个矩阵乘法,其中,矩阵映射是K、Q、V(h*w*C)与C*C的矩阵的相乘,运算量为3hwC^{2},当计算完注意力分数之后,要将attn经过映射输出,这部分也是h*w*C与C*C的矩阵的相乘,运算量为hwC^{2}。两个矩阵乘法是QK^{T}AV,他们都是h*w*C与C*h*w矩阵乘法,运算量都为(hw)^{2}C,所以全局注意力运算量总和为4hwC^{2}+2(hw)^{2}C

窗口多头自注意力机制的运算也包括4个矩阵映射、2个矩阵乘法,其中,矩阵映射是K、Q、V(M*M*C)与C*C的矩阵的相乘,运算量为3M^{2}C^{2},当计算完注意力分数之后,要将attn经过映射输出,这部分也是M*M*C与C*C的矩阵的相乘,运算量为M^{2}C^{2}。两个矩阵乘法是QK^{T}AV,他们都是M*M*C与C*M*M矩阵乘法,运算量都为M^{4}C,所以一个窗口注意力运算量总和为4M^{2}C^{2}+2M^{4}C,总的窗口个数是(h//M)*(w//M),相乘得到窗口注意力运算量总和为4{hw}C^{2}+2M^{2}hwC

5、相对位置偏移:

为什么要采用相对位置?ViT的结果表明使用相对位置和绝对位置对最后的分类结果影响不大,但是Swin Transformer它的用途不局限于图像分类,在目标检测、语义分割等密集预测任务中,使用相对位置比使用绝对位置的效果要好很多,这一点作者做了消融实验,结果如下:

Swin Transformer的相对位置偏移表大小为【(2M-1)*(2M-1),head_num】,其中,2M-1是窗口的高和宽的相对位置范围,即如果M=3,那么(-2,-1,0,1,2)就是相对位置范围。相对位置偏移表是一个可学习的参数表。

然后使用窗口的高和宽堆叠形成二维网格,之后压缩形成【2,M*M】的网格坐标,之后计算第一个M*M坐标和第二个M*M坐标每一对之间的相对坐标差,得到【2,M*M,M*M】,之后重塑形状为【M*M,M*M,2】并给每一个元素加上M-1使得所有元素均不为负,这是因为这些坐标差之后要作为index在相对位置偏移表中取值,之后将最后一维求和得到【M*M,M*M】,将其作为相对位置索引表

当计算完QK^{T}之后,将相对位置索引表中所有元素对应于相对位置偏移表中的head_num维向量取出并重塑形状为【head_num,M*M,M*M】。

我们可以回忆一下QK^{T}的形状:【B,head_num,patch_num,patch_num】,其中patch_num=M*M,那么我们给【head_num,M*M,M*M】扩充第零维之后利用广播就可以实现相对位置偏移和QK^{T}的相加。

6、窗口移动:

我们知道Swin Transformer的特殊点就在于其可以移动的窗口,但是移动窗口就会出现一个问题:

一个原始特征图如果有4个窗口,沿着右下角移动window_size//2个单位后会发现出现了9个窗口,我们知道如果窗口高和宽不一致,我们无法使用注意力机制,这时最简单的办法就是填充,将高和宽不一致的窗口用0填充至高和宽一致,这样做很简单,但是相应的计算量就上升了,这对于我们来说是不利的,所以我们换一种思路,引入掩码操作:

上图中,每种颜色覆盖范围代表一个逻辑上形式上的窗口(4个),每种数字标识一个实际的窗口(9个),在同一个颜色的逻辑窗口内可能会存在不同的实际窗口,我们可以给一个逻辑窗口内的所有实际窗口做差值,使得掩码中同一个实际窗口中的元素为0,非该实际窗口中的元素为-100,计算注意力时使用的是逻辑上的窗口,这样能保证窗口数量不变。把这个掩码值加入到QK^{T}结果中,做softmax操作就可以不需要计算注意力的地方置为0。

实验结果:

1、分类任务:

2、目标检测任务:

3、语义识别任务:

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

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

相关文章

系列2:基于Centos-8.6Kubernetes 集成GPU资源信息

每日禅语 自省,就是自我反省、自我检查,自知己短,从而弥补短处、纠正过失。佛陀强调自觉觉他,强调以达到觉行圆满为修行的最高境界。要改正错误,除了虚心接受他人意见之外,还要不忘时时观照己身。自省自悟之…

flutter控件buildDragTargetWidget详解

文章目录 1. DragTarget 的核心概念基本属性 2. 基本用法3. 使用 buildDragTargetWidget4. 常见场景5. 注意事项 buildDragTargetWidget 不是 Flutter 中的内置 API 或方法,但根据命名习惯,它很可能是您正在实现或使用的一个方法,用于在 Flut…

【数据结构——内排序】二路归并排序(头歌实践教学平台习题)【合集】

目录😋 任务描述 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现二路归并算法。 测试说明 平台会对你编写的代码进行测试: 测试输入示例: 11 18 2 20 34 12 32 6 16 5 8 1 (说明:第一行是元…

【FFmpeg】FFmpeg 内存结构 ⑥ ( 搭建开发环境 | AVPacket 创建与释放代码分析 | AVPacket 内存使用注意事项 )

文章目录 一、搭建开发环境1、开发环境搭建参考2、项目搭建 二、AVPacket 创建与释放代码分析1、AVPacket 创建与释放代码2、Qt 单步调试方法3、单步调试 - 分析 AVPacket 创建与销毁代码 三、AVPacket 内存使用注意事项1、谨慎使用 av_init_packet 函数2、av_init_packet 函数…

2024首届世界酒中国菜国际地理标志产品美食文化节成功举办篇章

2024首届世界酒中国菜国际地理标志产品美食文化节成功举办,开启美食文化交流新篇章 近日,首届世界酒中国菜国际地理标志产品美食文化节在中国国际地理标志大厦成功举办,这场为期三天的美食文化盛会吸引了来自世界各地的美食爱好者、行业专家…

AI发展与LabVIEW程序员就业

人工智能(AI)技术的快速发展确实对许多行业带来了变革,包括自动化、数据分析、软件开发等领域。对于LabVIEW程序员来说,AI的崛起确实引发了一个值得关注的问题:AI会不会取代他们的工作,导致大量失业&#x…

展柜设计公司平面布置小程序的分析与设计springboot+论文源码调试讲解

3系统的需求分析 需求分析的任务是通过详细调查展柜设计公司平面布置小程序软件所需的对象,充分了解系统的工作概况,明确功能实现的各种需求,然后在此基础上确定系统的功能。系统必须充分考虑今后可能的扩充和改变。 3.1可行性分析 通过对…

家校通小程序实战教程10部门管理前后端连接

目录 1 加载后端的数据2 为什么不直接给变量赋值3 保存部门信息4 最终的效果5 总结 现在部门管理已经完成了后端功能和前端开发,就需要在前端调用后端的数据完成界面的展示,而且在录入部门信息后需要提交到数据库里,本篇我们介绍一下前后端如…

Java并发编程学习(二)

线程的状态 有说5种的,有说6种的 5种的,从操作系统层面来讲 初始状态:也就是语言层面创建了线程对象,还未与操作系统线程关联。Java中也就是new了一个线程,还未调用。可运行状态:(就绪状态&a…

Docker方式安装人人影视离线完整安装包

本文软件由网友 ルリデ 推荐; 上周,人人影视创始人宣布将人人影视二十年字幕数据开源分享 目前提供了两种使用方式: “在线应用” :意味着需要有互联网才可以使用。官方提供了网站:https://yyets.click “离线使用” …

SpringBoot 学习

SpringBoot 学习 什么是 Springboot Spring Boot 是 Spring 提供的一个子项目,用于快速构建 Spring 应用程序 传统的问题: 导入依赖繁琐项目配置繁琐 SpringBoot 的特性 起步依赖:整合所有 web 的依赖配置好了自动配置:bean…

最新全开源IM即时通讯系统源码(PC+WEB+IOS+Android)部署指南

全开源IM(即时通讯)系统源码部署是一个复杂但系统的过程,涉及多个组件和步骤。以下是一个详细的部署指南,旨在帮助开发者或系统管理员成功部署一个全开源的IM系统,如OpenIM。      IM即时通讯系统源码准备工作   …

CAD c# 生成略缩图预览

代码如下: using (Transaction tr currentdb.TransactionManager.StartTransaction()){//当前数据库开启事务using (Database tempdb new Database(false, true)) //创建临时数据库(两个参数:是否创建符号表,不与当前文档关联){try{Bitmap …

[面试题]--索引用了什么数据结构?有什么特点?

答:使用了B树: 时间复杂度:O(logN),可以有效控制树高 B树特点: 1.叶子节点之间有相互链接的作用,会指向下一个相近的兄弟节点。 MySQL在组织叶子节点使用的是双向链表 2.非叶子节点的值都保存在叶子节点当中 MySQL非叶…

ansible自动化运维(五)roles角色管理

Roles角色管理 角色(roles)是ansible自1.2版本开始引入的新特性,用于层次性,结构化地组织playbook。 roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单的…

操作系统:文件系统

目录 1、文件 概念: UNIX文件分类: 2、文件系统 3、文件的访问方式 顺序访问 随机访问 4、文件的组织 逻辑组织 物理组织 5、倒排结构(了解) 5、文件目录 文件控制块(FCB) ​编辑 目录项 单…

单元测试-FATAL ERROR in native method: processing of -javaagent failed

文章目录 前言单元测试-FATAL ERROR in native method: processing of -javaagent failed1. 报错信息2. 解决方案 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运…

决策曲线分析(DCA)中平均净收益用于评价模型算法(R自定义函数)

决策曲线分析(DCA)中平均净收益用于评价模型算法 DCA分析虽然不强调用来评价模型算法或者变量组合的优劣,但是实际应用过程中感觉DCA曲线的走势和模型的效能具有良好的一致性,其实这种一致性也可以找到内在的联系,比如…

在Ubuntu服务器上备份文件到自己的百度网盘

文章目录 概述安装bypy同步文件定时任务脚本 概述 之前自购了一台阿里云服务器,系统镜像为Ubuntu 22.04, 并且搭建了LNMP开发环境(可以参考:《Ubuntu搭建PHP开发环境操作步骤(保姆级教程)》)。由于项目运行中会产生附…

safe area helper插件

概述 显示不同机型的必能显示的区域 实现步骤 引入safearea,引入其中的safearea的csharp 为cancas加入gameobject gameobject中加入safearea脚本 将UI作为这个gameobject的子物体,就可以完成显示