【深度学习】深刻理解Swin Transformer
Swin Transformer 是一种基于 Transformer 的视觉模型,由 Microsoft 研究团队提出,旨在解决传统 Transformer 模型在计算机视觉任务中的高计算复杂度问题。其全称是 Shifted Window Transformer,通过引入分层架构和滑动窗口机制,Swin Transformer 在性能和效率之间取得了平衡,广泛应用于图像分类、目标检测、分割等视觉任务,称为新一代的backbone,可直接套用在各项下游任务中。在Swin Transformer中,提供大、中、小不同版本模型,可以进行自由选择合适的使用。
论文原文:Swin Transformer: Hierarchical Vision Transformer using Shifted Windows
1. 介绍
Transformer 最初在自然语言处理(NLP)领域大获成功,但直接将 Transformer 应用于计算机视觉任务存在很多挑战。传统Transformer中,拿到了图像数据,将图片进行划分成一个个patch,尽可能patch细一些。但是图像中像素点太多了,如果需要更多的特征,就必须构建很长的序列。而越长的序列算起注意力肯定越慢,自注意力机制的计算复杂度是,当处理高分辨率图像时,这种复杂度会快速增长,这就导致了效率问题。
而且图像中许多视觉信息依赖于局部关系,而标准 Transformer 处理的是全局关系,可能无法有效捕获局部特征。Swin Transformer便采用窗口和分层的形式来替代长序列的方法,CNN中经常提到感受野,在Transformer中对应的就是分层。也就是说,我们可以将当前这件事做L次(Lx),每次都会两两进行合并,向量数越来越小(400个token-200个token-100个token),窗口的大小也会增大。分层操作也就是,第一层的时候token很多,第二层合并token,第三层合并token,就像我们的卷积和池化的操作。而在传统的Transformer中,第一层怎么做,第二层第三层也会采用同样的尺寸进行,都是一样的操作。
2. Swin Transformer 整体架构
2.1. Patch Embedding
在 Swin Transformer 中,Patch Embedding 负责将输入图像分割成多个小块(patches),并将这些小块的像素值嵌入到一个高维空间中,形成适合 Transformer 处理的特征表示。在传统的卷积神经网络(CNN)中,卷积操作可以用来提取局部特征。在 Swin Transformer 中,为了将输入图像转化为适合 Transformer 模型处理的 patch 序列,首先对输入图像进行分块。假设输入图像的大小为 224x224x3
,其通过一个卷积操作实现。卷积操作可以将每个局部区域的像素值映射为一个更高维的特征向量。假设输入图像大小为 224x224x3
,应用一个卷积层,参数为 Conv2d(3, 96, kernel_size=(4, 4), stride=(4, 4))
,这表示卷积核的大小是 4x4
,步长是 4
,输入的通道数是 3
(RGB图像),输出的通道数是 96
。卷积后,图像的空间维度会变小,输出的特征图的尺寸会变为 56x56
(通过计算:(224 - 4) / 4 + 1 = 56
)。所以,卷积后的输出大小是 56x56x96
,这表示每个空间位置(56x56)都有一个96维的特征向量。
在 Swin Transformer 中,通常将图像通过卷积操作分割成不重叠的小块(patches)。每个小块对应一个特征向量。例如,56x56x96
的输出可以视为有 3136
个 patch,每个 patch 是一个 96 维的向量。这些特征向量将作为 Transformer 模型的输入序列。根据不同的卷积参数(如 kernel_size 和 stride),你可以控制生成的 patch 的数量和每个 patch 的维度。例如,如果使用更小的卷积核和步长,可以得到更细粒度的 patch,反之则可以得到较大的 patch。
kernel_size
决定了每个 patch 的空间大小。stride
决定了每个 patch 之间的间隔,即步长。
2.2. window_partition
在 Swin Transformer 中,图像的特征表示不仅仅是通过 Patch Embedding
来获得,还通过 窗口划分(Window Partition) 来进一步细化和处理,通过窗口内的局部注意力机制来增强计算效率并捕捉局部特征。
假设输入的图像经过卷积处理后得到了大小为 56x56x96
的特征图,将这个特征图划分为多个小窗口(window),每个窗口包含一部分局部信息,其中窗口大小为7x7
,特征图大小为56x56。
为了将特征图划分成大小为 7x7
的窗口,我们首先计算在空间维度(高和宽)上可以分成多少个窗口,水平和垂直方向上,每个 7x7
窗口可以覆盖 56 / 7 = 8
个窗口(总共 8x8 = 64
个窗口),窗口内部的特征图由 96
个通道组成。因此,在划分后,特征图的维度将变为 (64, 7, 7, 96)
,其中:
64
表示窗口的数量(即8x8 = 64
个窗口)。7x7
是每个窗口的空间维度。96
是每个窗口内的特征通道数。
在 Swin Transformer 中,Token 通常指的是图像中的局部特征,每个 Token 是图像的一个小区域。在 Window Partition 过程中,我们将整个图像的 Token 重新组织成窗口(Window)。之前每个 Token 对应一个图像位置,现在每个 Token 对应一个窗口的内部特征。所以,原来每个 Token(如卷积后的每个空间位置)代表了图像的一部分信息,现在我们通过窗口划分来捕捉更大范围的局部信息。这种划分有助于模型专注于图像的局部结构,同时减少计算量,因为每个窗口只在局部范围内进行注意力计算。
2.3. W-MSA(Windwow multi-head self attention)
在 Swin Transformer 中,W-MSA (Window Multi-Head Self Attention) 是关键的注意力机制,它通过在每个窗口内部独立地计算自注意力(Self-Attention)来减少计算复杂度,并捕捉局部特征。
通过 Window Partition 将特征图划分为 64
个窗口,每个窗口的尺寸为 7x7
,并且每个位置的特征通道数为 96
,因此每个窗口的形状为 (7, 7, 96),
这些窗口将作为 W-MSA 的输入。在 Multi-Head Self-Attention 中,首先需要将输入特征矩阵(窗口内的特征)通过三个不同的矩阵进行线性变换,得到 查询(Q)、键(K) 和 值(V),这三个矩阵用于计算注意力得分。对于每个头(Head),计算过程是独立的。假设有 3
个头,那么每个头的输入特征维度为 96 / 3 = 32
,因为 96
维的输入被平均分成了 3 个头,每个头负责 32 维的特征。在 W-MSA 中,针对每个窗口独立计算自注意力得分,计算方法如下:
-
对每个窗口中的
49
个像素点(即每个位置的特征向量)进行查询Q、键K、值V的计算。 -
自注意力得分(Attention Score) 是通过计算查询与键的点积(或者其他相似度度量)得到的,这可以表示为:
其中,
是每个头的维度(在这里是 32),Q 和 K 的乘积衡量了每个位置之间的相似性。
-
Softmax:通过 Softmax 操作将得分归一化,使其成为概率分布,得到每个位置与其他位置的相关性。
-
加权值(Weighted Sum):使用得分对值V进行加权求和,得到每个位置的最终输出表示。
每个头的自注意力计算都会产生一个形状为 (64, 3, 49, 49)
的结果,其中,64
表示窗口的数量,3
表示头的数量,49
是每个窗口中位置的数量(7x7
),49
代表每个位置对其他位置的注意力得分(自注意力矩阵)。因此,每个头会计算出每个窗口内所有位置之间的自注意力得分,输出的形状为 (64, 3, 49, 49)
。
2.4. window_reverse
Window Reverse
操作的目的是将计算得到的 (64, 49, 96)
特征图恢复回原始的空间维度 (56, 56, 96)
。为此,我们需要将每个窗口的 49
个位置(7x7
)重新排列到原始的图像空间中。步骤:
-
Reshape 操作: 每个窗口的特征图形状是
(49, 96)
,我们将其转换成(7, 7, 96)
的形状,表示每个窗口中的每个像素点都有一个96
维的特征向量。 -
按窗口拼接: 将所有
64
个窗口按照它们在特征图中的位置重新排列成56x56
的大特征图。原始的输入特征图大小是56x56
,这意味着64
个窗口将按照8x8
的网格排列,并恢复到一个(56, 56, 96)
的特征图。
在 Window Reverse 操作后,恢复得到的特征图形状是 (56, 56, 96)
,这与卷积后的特征图的形状一致。56x56
是恢复后的空间维度,代表每个像素点在特征图中的位置;96
是每个像素点的特征维度,表示每个位置的特征信息。
2.5. SW-MASA
为什么要滑动窗口(Shifted Window)?
原始的 Window MSA 将图像划分为固定的窗口(例如 7x7
),并在每个窗口内计算自注意力。这样做的一个问题是每个窗口内部的信息相对封闭,没有与相邻窗口之间的信息交流。因此,模型容易局限于各自的小区域,无法充分捕捉不同窗口之间的关联。
通过引入 滑动窗口(Shifted Window)机制,窗口在原来位置的基础上向四个方向移动一部分,重叠区域与原窗口有交集。这样,原本相互独立的窗口就可以共享信息,增强了模型的表达能力和全局感知。
位移操作(Shift Operation)
位移操作的细节如下:
- 初始的窗口被划分为
4x4
的块(例如7x7
窗口),每个块进行独立的自注意力计算。 - 在进行位移时,原来
4x4
的窗口将被平移,变成新的大小为9x9
的窗口,窗口重叠区域包含了不同窗口之间的信息。 - 通过平移,模型能获取到更广泛的信息,使得窗口之间能够通过共享信息来融合彼此的特征,避免局部化。
Shifted Window MSA 会导致计算量的增加,特别是在窗口滑动后,窗口数量从 4x4
变为 9x9
,计算量几乎翻倍。为了控制计算量的增长,可以通过 mask 操作 来减少不必要的计算。在位移后,窗口之间会重叠。为了避免重复计算,我们可以使用 mask 来屏蔽掉不需要计算的部分。在计算注意力时,对于每个位置的 Q 和 K 的匹配,使用 softmax 时,设置不需要计算的位置的值为负无穷,这样对应位置的注意力值将接近零,不会对结果产生影响。
在进行 SW-MSA 后,输出的特征图的形状仍然是 56x56x96
,与输入特征图的大小一致。通过 shifted window 和 mask 操作,模型不仅保留了原始的窗口内的自注意力计算,还增强了窗口之间的信息交换和融合。即使窗口被移动了,经过计算后的特征也需要回到其原本的位置,也就是还原平移,保持图像的完整性。
2.6. PatchMerging
PatchMerging 是 Swin Transformer 中的一种下采样操作,但是不同于池化,这个相当于间接的(对H和W维度进行间隔采样后拼接在一起,得到H/2,W/2,C*4),目的是将输入特征图的空间维度(即高和宽)逐渐减小,同时增加通道数,从而在保持计算效率的同时获得更高层次的特征表示。它是下采样的过程,但与常规的池化操作不同,PatchMerging 通过将相邻的 patch 拼接在一起,并对拼接后的特征进行线性变换,从而实现下采样。具体来说,在 Swin Transformer 中,随着网络层数的加深,输入的特征图会逐渐减小其空间尺寸(即 H 和 W 维度),而同时增加其通道数(即 C 维度),以便模型可以捕捉到更为复杂的高层次信息。
假设输入的特征图形状为 H x W x C
,PatchMerging
通过以下步骤来实现下采样和通道数扩展:
-
分割和拼接(Splitting and Concatenation):
- 输入的特征图会按照一定的步长(通常是 2)进行分割,即对每个
2x2
的 patch 进行合并。 - 这样原本的
H x W
的空间尺寸会缩小一半,变成H/2 x W/2
。 - 然后,将每个
2x2
的 patch 内部的特征进行拼接,得到新的特征维度。假设原始通道数为C
,拼接后的通道数为4C
。
- 输入的特征图会按照一定的步长(通常是 2)进行分割,即对每个
-
卷积操作:
- 对拼接后的特征进行 卷积,以进一步增强特征表达。卷积操作用于转换特征空间,虽然通道数增加了,但通过卷积,特征能够更加丰富。
2.7. 分层计算
在 Swin Transformer 中,模型的每一层都会进行下采样操作,同时逐步增加通道数。每次 PatchMerging 后的特征图会作为输入进入下一层的 Attention 计算。通过这种方式,Swin Transformer 能够逐渐提取到越来越复杂的特征,同时保持计算效率。每一层的 PatchMerging 操作实际上是将输入的特征图通过 线性变换(通常是卷积)合并成更高维度的特征图,从而为后续的注意力计算提供更丰富的表示。
从图中可以得到,通道数在每层中并不是从C变成4C而是2C,这是因为中间又加了一层卷积操作。
3. 实验结果
在ImageNet22K数据集上,准确率能达到惊人的86.4%。另外在检测,分割等任务上表现也很优异。
参考资料:
【深度学习】详解 Swin Transformer (SwinT)-CSDN博客
深度学习之Swin Transformer学习篇(详细 - 附代码)_swintransformer训练-CSDN博客
图解Swin Transformer - 知乎
【论文精读】Swin Transformer - 知乎
ICCV2021最佳论文:Swin Transformer论文解读+源码复现,迪哥带你从零解读霸榜各大CV任务的Swin Transformer模型!_哔哩哔哩_bilibili
相关文章:

【深度学习】深刻理解Swin Transformer
Swin Transformer 是一种基于 Transformer 的视觉模型,由 Microsoft 研究团队提出,旨在解决传统 Transformer 模型在计算机视觉任务中的高计算复杂度问题。其全称是 Shifted Window Transformer,通过引入分层架构和滑动窗口机制,S…...

[2015~2024]SmartMediaKit音视频直播技术演进之路
技术背景 2015年,因应急指挥项目需求,我们实现了RTMP推送音视频采集推送(采集摄像头和麦克风数据)模块,在我们做好了RTMP推送模块后,苦于没有一个满足我们毫秒级延迟诉求的RTMP播放器,于是第一…...

redis 使用Lettuce 当redis挂掉重启之后 网络是怎么重新连接
Lettuce是一个高性能的Java Redis客户端,支持同步、异步和反应式编程模式 Lettuce的核心功能包括: 高性能:通过使用Netty作为底层网络通信框架,实现了非阻塞IO,提高了性能。丰富的API:提供了丰富…...

【IntelliJ IDEA 集成工具】TalkX - AI编程助手
前言 在数字化时代,技术的迅猛发展给软件开发者带来了更多的挑战和机遇。为了提高技术开发群体在繁多项目中的编码效率和质量,他们需要一个强大而专业的工具来辅助开发过程,而正是为了满足这一需求,TalkX 应运而生。 一、概述 1…...

二叉搜索树Ⅲ【东北大学oj数据结构8-3】C++
二叉搜索树 III B:在二叉搜索树II中加入delete指令,创建程序对二叉搜索树T执行如下指令。 插入 k:将key k 插入到 T 中。 find k:报告T中是否存在key k。 delete k:删除key为 k 的节点。 打印:使用中序树遍…...

【面试笔记】CPU 缓存机制
CPU 缓存机制 1. CPU Cache 与 MMU1.1 MMU 是什么?TLB 又是什么?他们是怎么工作的?2.2 简述 Cache 与 MMU 的协作关系?2.3 简述 Cache 与 MMU 的协作工作流程? 2. CPU 多层次缓存2.1 什么是 CPU 的多层次缓存结构&…...

MySQL基础函数使用
目录 简介 1. 单行函数 1.1 字符串函数 1.2 日期函数 1.3 数值函数 1.4 转换函数 1.5 其他函数 2. 多行函数 示例: 3. 数据分组 示例: 4. DQL单表关键字执行顺序 示例: 5. 多表查询 示例: 6. 表与表的外连接 示例…...

解决docker环境下aspose-words转换word成pdf后乱码问题
描述 环境:docker 部署工具:Jenkins 需求:本地上传的word文档需要转换成pdf 问题:转换之后的pdf文档出现小框框(乱码) 转换成PDF的操作 pom: <dependency><groupId>org.apach…...

C# 生成随机数的方法
C# 提供了一种强大而方便的工具类 Random ,用于生成随机数。这里将分类讨论如何通过 C# 实现随机数生成,以及应用于实际情况中的一些具体方案。 一、Random 类概述 Random 类表示一个伪随机数生成器,用于生成满足随机性统计要求的数字序列。…...

ip_done
文章目录 路由结论 IP分片 数据链路层重谈Mac地址MAC帧报头局域网的通信原理MSS,以及MAC帧对上层的影响ARP协议 1.公司是不是这样呢? 类似的要给运营商交钱,构建公司的子网,具有公司级别的入口路由器 2.为什么要这样呢?? IP地…...

3D可视化引擎HOOPS Visualize与HOOPS Luminate Bridge的功能与应用
HOOPS Visualize HPS / HOOPS Luminate Bridge为开发者提供了强大的工具,用于在CAD应用中集成逼真的渲染能力。本文旨在梳理该桥接产品的核心功能、使用方法及应用场景,为用户快速上手并充分利用产品特性提供指导。 桥接产品的核心功能概述 HOOPS Lumi…...

Docder 搭建Redis分片集群 散片插槽 数据分片 故障转移 Java连接
介绍 使多个 Redis 实例共同工作,实现数据的水平扩展。通过将数据分片到多个节点上,Redis 集群能够在不牺牲性能的前提下扩展存储容量和处理能力,从而支持更高并发的请求。Redis 集群不仅支持数据分片,还提供了自动故障转移和高可…...

校园交友app/校园资源共享小程序/校园圈子集合二手物品交易论坛、交友等综合型生活服务社交论坛
多客校园社交圈子系统搭建 校园交友多功能系统源码: 1、更改学校为独立的模块。整体UI改为绿色,青春色,更贴近校园风格。2、圈子归纳到学校去进行运营。每个学校可建立多个圈子。和其他学校圈子互不干扰。3、增加用户绑定学校,以后进入将默认…...

Chaos Mesh云原生的混沌测试平台搭建
Chaos Mesh云原生的混沌测试平台搭建 一.环境准备 确认已经安装helm,如要查看 Helm 是否已经安装,请执行如下命令: helm version二.使用helm安装 1.添加 Chaos Mesh 仓库 在 Helm 仓库中添加 Chaos Mesh 仓库: helm re…...

Vue3之组合式API详解
Vue 3引入了一种新的API风格——组合式API(Composition API),旨在提升组件的逻辑复用性和可维护性。本文将详细阐述Vue 3中的组合式API,包括其定义、特点、使用场景、优势等,并给出具体的示例代码。 一、定义 组合式…...

大模型的构建与部署(3)——数据标注
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. 数据标注的重要性 1.1 增强数据可解释性 数据标注通过为原始数据添加标签或注释,显著增强了数据的可解释性。在机器学习和深度学习领域,模型的训练依赖于大量带标签的数据。这些标签不仅帮助…...

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

本地事务 + 消息队列事务方案设计
Spring Boot 和 RocketMQ 在Spring Boot项目中实现“本地事务 消息队列事务”的方案,可以按照以下步骤实现: 先执行MySQL本地事务操作(未提交)随后发送消息到消息队列(如RocketMQ事务消息)等待消息队列确…...

pinctrl子系统学习笔记
一、背景 cpu的gpio引脚可以复用成多个功能,如可以配置成I2C或者普通GPIO模式。配置方式一般是通过写引脚复用的配置寄存器,但是不同芯片厂商配置寄存器格式内容各不相同,设置引脚复用无法做到通用且自由的配置,只能在启动初始化…...

使用vue-element 的计数器inputNumber,传第三个参数
使用vue-element 的计数器inputNumber。 其中的change 事件中,默认自带两个参数,currentValue和oldValue,分别代表改变后的数和改变前的数, 如果想要传第三个参数, change"(currentValue, oldValue) > numCha…...

如何从0构建一个flask项目,直接上实操!!!
项目结构 首先,创建一个项目目录,结构如下: flask_app/ │ ├── app.py # Flask 应用代码 ├── static/ # 存放静态文件(如CSS、JS、图片等) │ └── style.css # 示例…...

Mongoose连接数据库操作实践
文章目录 介绍特点:Mongoose 使用:创建项目并安装:连接到 MongoDB:定义 Schema:创建模型并操作数据库:创建文档:查询文档:更新文档:删除文档:使用钩子&#x…...

centos 7.9 freeswitch1.10.9环境搭建
亲测版本centos 7.9系统–》 freeswitch1.10.9 一、下载插件 yum install -y git alsa-lib-devel autoconf automake bison broadvoice-devel bzip2 curl-devel libdb4-devel e2fsprogs-devel erlang flite-devel g722_1-devel gcc-c++ gdbm-devel gnutls-devel ilbc2...

Gitlab服务管理和仓库项目权限管理
Gitlab服务管理 gitlab-ctl start # 启动所有 gitlab 组件; gitlab-ctl stop # 停止所有 gitlab 组件; gitlab-ctl restart # 重启所有 gitlab 组件; gitlab-ctl status …...

LLMs之Llama-3:Llama-3.3的简介、安装和使用方法、案例应用之详细攻略
LLMs之Llama-3:Llama-3.3的简介、安装和使用方法、案例应用之详细攻略 目录 相关文章 LLMs之LLaMA:LLaMA的简介、安装和使用方法、案例应用之详细攻略 LLMs之LLaMA-2:LLaMA 2的简介(技术细节)、安装、使用方法(开源-免费用于研究和商业用途…...

OpenCV函数及其应用
1. 梯度处理的Sobel算子函数 功能 Sobel算子是一种用于边缘检测的离散微分算子,它结合了高斯平滑和微分求导,用于计算图像亮度的空间梯度。 参数 src:输入图像。 dst:输出图像。 ddepth:输出图像的深度。 dxÿ…...

vulnhub靶场【DriftingBlues】之3
前言 靶机:DriftingBlues-3,IP地址192.168.1.60 攻击:kali,IP地址192.168.1.16 都采用虚拟机,网卡为桥接模式 主机发现 使用arp-scan -l或netdiscover -r 192.168.1.1/24 信息收集 使用nmap扫描端口 网站探测 访…...

文件上传—阿里云OSS对象存储
目录 一、OSS简介 二、OSS基本使用 1. 注册账号 2. 基本配置 (1) 开通OSS (2) 创建存储空间 (3) 修改权限 (4) 配置完成,上传一张图片,检验是否成功。 (5) 创建AccessKey 三、Java项目集成OSS 1. 导入依赖 2. Result.java代码: …...

mybatis-plus超详细讲解
mybatis-plus (简化代码神器) 地址:https://mp.baomidou.com/ 目录 mybatis-plus 简介 特性 支持数据库 参与贡献 快速指南 1、创建数据库 mybatis_plus 2、导入相关的依赖 3、创建对应的文件夹 4、编写配置文件 5、编写代码 …...

【Linux】--- 进程的概念
【Linux】--- 进程的概念 一、进程概念二、PCB1.什么是PCB2.什么是task_struct(重点!)3.task_struct包含内容 三、task_struct内容详解1.查看进程(1)通过系统目录查看(2)通过ps命令查看…...