场景文本检测识别学习 day09(Swin Transformer论文精读)

Swin Transformer

Swin Transformer 提出ViT具有两个缺点:
1. 没有多尺度特征 ,不能生成多尺度的特征图传给FPN (检测) \ U-Net (分割),从而对于不同大小的物体都能进行良好感知,即只有16 * 16的patch尺寸
2. 全局计算自注意力浪费资源,并且计算复杂度跟图像增加的大小成平方关系
对于以上缺点,Swin Transformer给出了以下的解决方法:
在这里插入图片描述

  • 将patch size由 16 * 16 变成 4 * 4,从而对小物体,密集预测型任务有更好的性能。
  • 不同于ViT—在整张输入图片上进行自注意力计算。Swin Transformer是在窗口内进行自注意力计算的,同时这个窗口又是包含固定数量的patch,每个patch的尺寸也是固定的。由于在图像领域中,同一个物体的不同部位、或语义相似的不同物体大概率会出现在相邻的地方,所以没必要像ViT那样–对整张图进行自注意力操作,其实可以借鉴CNN卷积的局部性的归纳偏置,在一个小的局部窗口内进行自注意力计算,也是差不多够用的。所以Swin Transformer使用了尺寸不一的窗口来避免序列长度过大,从而节约计算资源。
  • 不同于ViT— 在每个Transformer Encoder Block上都是做相同尺寸的自注意力操作,得到的也是相同尺寸的特征。Swin Transformer在不同尺寸的窗口内做自注意力操作,从而得到不同尺寸的特征图,也就是多尺度的特征图。
  • 在Swin Transformer中,这叫做patch merging。这跟CNN的池化操作很类似,CNN通过池化Pooling,来增大每一个卷积核能看到的感受野,从而使每次池化后的卷积核能够抓住不同尺寸的物体。
    在这里插入图片描述
  • 在Swin Transformer中,灰色的格子叫patch是最小的计算单元(尺寸为4 * 4),红色的格子叫window是中等的计算单元,最小的窗口里有7 * 7个patch,通过将整张图分成不同的窗口,只计算窗口内的自注意力,可以极大程度的减小序列长度,减小计算复杂度。
  • shifted window是指:先将左侧图中的分割线往右下移动两个patch,然后将左上角变大后的窗口重新按中心分割成四个窗口,再将分割线往左上移动两个patch,就变成右图的样子。
  • shifted window 和 patch merging的好处如下:
    1. 当我们进行注意力计算的时候,只在Swin Transformer的局部窗口内进行局部自注意力计算,相比ViT的全局窗口来说,可以减少序列长度,节省内存,加快计算。
    2. 因为自注意力都是只在窗口内进行,所以如果不进行shift,那么某个窗口内的patch就永远无法注意到其他窗口内patch的信息,这就违背了Transformer的初衷—更好的理解上下文,掌握全局信息。但是经过shift之后,比如中间的窗口,就是由之前四个窗口的patch组成的,也就表示中间窗口进行自注意力计算后,可以关注到其他窗口的信息,窗口和窗口之间可以进行交互(Cross-Window Connection)
    3. 再加上之前的patch merging,那么在不断合并的时候,每个patch可以注意到很多其他窗口的patch信息,即每个patch的感受野会不断增大
    4. 因此虽然我们计算的是每个窗口内的局部自注意力,但是实际上它近似等于一个全局的自注意力。
      在这里插入图片描述
  • Swin Transformer 的流程图如上:C是跟模型大小相关的超参数,在Swin-Tiny中为96,表示在Swin小模型中每个patch的经过线性投影后的维度为96
    在这里插入图片描述
  • 具体的维度变换如上图:
    1. 如果输入图片的尺寸为(224 * 224 * 3),经过Patch Partition后,将图片分割成尺寸为4 * 4的patch,那么输入图片的尺寸就变成(56 * 56 * 48),其中 56 = 224 / 4,48 = 4 * 4 * 3,表示输入图片一共有56 * 56 个patch,每个patch的维度为48
    2. 再经过Linear Embedding,将输入图片投影到一个适合当前模型大小的空间上,即将每个patch的维度增大为96,将(56 * 56 * 48)变成(56 * 56 * 96 ),但是由于56 * 56 = 3136的序列长度(patch数量)太大,Transformer无法接受,所以Swin Transformer Block这里采用在局部窗口计算自注意力的方式,每个窗口只有7 * 7 = 49 个 patch,因此它的序列长度只有49,这是一个Transformer可以接受的长度
    3. 如果不对Transformer做过多约束的话,那么由于Transformer Block有残差连接,所以Block的输入维度等于输出维度,那么Stage 1的输出维度就是 56 * 56 * 96
    4. 接下来由于需要构建多尺度的特征,就采用了Patch Merging(类似于卷积中的池化操作),将 56 * 56 * 96 变成了 28 * 28 * 192,即宽高减半,通道数翻倍,跟VGGNet、ResNet相同,即在池化操作之后加入一个 1 * 1 的卷积,使得最后结果的宽高减半,通道数翻倍。
    5. 同时由于Stage 2的Transformer Block也没有做过多约束,所以Block的输入维度也等于输出维度,那么Stage 2 的输出维度就是 28 * 28 * 192
    6. Stage 3、Stage 4和Stage 2类似,同理可得,Stage 3输出维度是 14 * 14 * 384,Stage 4输出维度是 7 * 7 * 768

Window的划分

  • 相比于ViT在全局计算自注意力,Swin Transformer只在窗口内进行自注意力计算,于是整个特征图就会被分成很多没有重叠的窗口。且窗口的尺寸为(7 * 7),即窗口内部有49个patch,而patch是最小的计算单元。在Stage 1中,如上图,整个特征图的尺寸为56 * 56 * 96,一共分成了8 * 8个窗口,每个窗口的尺寸为7 * 7 * 96
    在这里插入图片描述

Multi-head Self-Attention 和 Window Multi-head Self-Attention的计算复杂度对比

在这里插入图片描述

  • 公式如上,其中h * w为当前输入图片一共被分成了多少个patch,C是patch特征的维度,M表示一个窗口的宽或高被分成了多少个patch
  • 如果两个矩阵A、B相乘,A的形状为(M * N),B的形状为(N * P),那么相乘的结果C矩阵的形状为(M * P),整个计算的复杂度为O(M * N * P),由于C矩阵的每一个元素都是经过N次乘法,N-1次加法,总共2N-1次基本操作得来的,而对于O()来说常数不重要,所以C矩阵的每一个元素可以看作:需要N次基本操作,那么整个C矩阵就一共需要M * N * P次基本操作,复杂度就为O(M * N * P)
  • 公式一的推算过程如下:
    1. 输入矩阵的尺寸为 h * w * c,乘以 W q 、 W k 、 W v W_q、W_k、W_v WqWkWv变换矩阵(形状为c * c)之后,得到q、k、v(形状为h * w * c),所需要的计算复杂度为:O(h * w * c * c * 3) ,注意这里需要转换为二维矩阵后再进行矩阵的乘法,即转换后的形状为(h * w) * c
    2. q矩阵乘以k矩阵的转置,注意这里需要先转换为二维矩阵,再进行转置相乘,即转换后的形状为(h * w) * c和c * (h * w),得到A矩阵的形状为(h * w) * (h * w),所需要的计算复杂度为:O(h * w * c * h * w)
    3. 之后A矩阵和V矩阵相乘,得到经过注意力计算后的特征,所需的计算复杂度为O(h * w * h * w * c)
    4. 最后需要经过一层投射层,即乘以一个形状为c * c的变换矩阵,得到最后
      请添加图片描述

Patch & Window和ViT的计算复杂度对比

在这里插入图片描述

  • 在Swin Transformer中,不同层级的窗口内部的补丁数量是固定的,补丁内部的像素数量也是固定的,如上图的红色框就是不同的窗口(Window),窗口内部的灰色框就是补丁(Patch)
  • 如果输入图像的宽W、高H,增加到原来的两倍,那么输入图像的总面积(总像素数量)就增加到原来的四倍(2H * 2W = 4HW)
  • 在ViT中,由于窗口是固定的,且就是整个输入图片,所以当我们将输入图片分割成很多个尺寸为16 * 16 的patch时,如果输入图像的总面积增加到原来的四倍,那么patch的数量也会变成原来的四倍,那么计算复杂度 O ( N 2 ⋅ d ) O( N^2 · d) O(N2d),就变成了 O ( ( 4 N ) 2 ⋅ d ) = O ( 16 N 2 ⋅ d ) O( (4N)^2 · d) = O( 16N^2 · d) O((4N)2d)=O(16N2d),其中d是每个patch的维度,N是patch的数量。因此,对于ViT来说,计算复杂度是跟图像增加的大小成平方关系
  • 在Swin Transformer中,由于窗口不是固定的,但是窗口内部的补丁数量是固定的,补丁的尺寸也是固定的,所以当我们将输入图片的总面积增加到原来的四倍,那么只有窗口的数量增加到原来的四倍,那么计算复杂度 O ( M 2 ⋅ N ⋅ d ) O( M^2 · N · d) O(M2Nd),就变成了 O ( M 2 ⋅ 4 N ⋅ d ) O( M^2 · 4N · d) O(M24Nd),其中M是每个窗口内补丁的数量,N是窗口的数量,d是每个补丁patch的维度。(虽然每个patch的维度都不一样,这里先不管了)

Patch Merging

  • 类似于卷积中的池化操作:我们需要在一个区域中选出一个特征,然后不断移动这个区域,直到走完全图。从而降低特征图分辨率并且不丢失过多的原图信息。
  • 在Swin Transformer中,是下采样两倍,即每间隔一个元素就选一个点,由于我们在第一步已经将输入图片分成一个个的patch,所以这里的元素指的是一个patch
  • 假设原特征图的尺寸为H * W * C,那么每隔一个元素就选一个点,就等价于将原图按2 * 2的元素分为一个块,如果我们把块内的元素标上序号,那么相同序号的点将组成一个新特征图,尺寸为(H/2 * W/2)。随着原特征图的尺寸增大,那么新特征图尺寸也会增大,但是数量仍然是四个
  • 将新特征图按通道拼接在一起后,通道数就变成原特征图的四倍。为了和卷积神经网络保持一致,即池化操作降维之后会使用一个1 * 1的卷积,将通道数翻倍。所以在Patch Merging中经过归一化后,需要经过1 * 1的卷积,来将通道数降低成原特征图的两倍
  • 因此最后的结果就是将原特征图的尺寸由H * W * C ,变成H/2 * W/2 * 2C
  • 综上:Patch Merging相当于是将空间上的维度换成更多的通道数,来达到卷积中池化操作的降低分辨率的效果
    请添加图片描述

池化

在这里插入图片描述

  • 如果使用卷积核大小为(1 * 2)具体为 [1 , -1],由于卷积操作对位置很敏感,所以对最左侧的输入进行卷积之后,得到的结果只有一列是1,即边缘会检测不准,如果当图片发生微小改变后,边缘经过卷积都会发生变化。所以卷积对于位置的敏感性不是一个很好的事。因此最好能具有一定程度的平移不变性,即当图片发生微小的改变,卷积结果不会发生改变。
    在这里插入图片描述
  • 所以往往在卷积之后加入池化操作,以上是二维最大池化的示意过程
    请添加图片描述
  • 池化通常在卷积之后
  • 通过二维最大池化的结果可以看出,池化的操作近似于模糊化,在卷积输出的值附近出现多次同样的值。
  • 池化层和卷积层类似,都有填充和步幅,池化的步幅通常等于池化窗口的大小,但是上图的步幅为1
  • 但是池化层没有可学习的参数,直接从输入中选取值了
  • 池化层的输出通道数等于输入通道数,即在每个输入通道应用池化层来获得相对应的输出通道。(由于卷积层可以改变通道,而池化层往往是跟在卷积层后面,所以池化层就不需要改变通道数了)

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

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

相关文章

大模型LLM:最清晰解读提示工程(Prompt Engineering)

提示工程(Prompt Engineering),也称为上下文提示,是一种通过不更新模型的权重/参数来引导LLM行为朝着特定结果的方法。这是与AI有效交流所需结果的过程。提示工程可以用于各种任务,从回答问题到算术推理乃至各种应用领…

【触摸案例-手势解锁案例-按钮高亮 Objective-C语言】

一、我们来说这个self.btns,这个问题啊,为什么不用_btns, 1.我们说,在懒加载里边儿,经常是写下划线啊,_btns,为什么不写,首先啊,这个layoutSubviews:我们第一次,肯定会去执行这个layoutSubviews: 然后呢,去懒加载这个数组, 然后呢,接下来啊,走这一句话, 第一次…

邮件系统国产化,保障企业信息安全的重要举措

随着信息技术日益发展和成熟,企业信息化建设深入推进,企业信息化管理能力大幅提升,其中邮件系统在企业信息化建设中扮演着至关重要的角色。然而,长期以来,我国企业在邮件系统方面主要依赖于国外的产品,这不…

win11安装SQL Server 2012 企业版

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、硬件要求二、软件安装参考&#xff1…

在windows下使用VS Code、CMake、Make进行代码编译

软件环境 Windows11VS CodeNoneCMake3.26.4-windows-x86_64MinGWNone 电脑系统配置 安装MinGW将MinGW安装文件夹中bin文件夹下的mingw32-make.exe复制并重命名为make.exe在文件夹中添加系统路径,具体位置为 系统->系统信息->高级系统设置->高级->环境…

Linux运维:centos环境变量

前言 在 Linux 运维工作中,管理环境变量是至关重要的一项任务。在 CentOS 环境下,正确配置环境变量可以使系统更加高效和易于管理。 本文将重点讨论 CentOS 环境下的环境变量设置,并就python的环境变量配置方案进行讲解(不包含Ano…

YOLOv9中模块总结补充|SPPELAN

专栏相关代码:目前售价售价69.9,改进点80 专栏介绍:YOLOv9改进系列 | 包含深度学习最新创新,助力高效涨点!!! 1. SPPELAN SPPELAN是YOLOv9作者在SPPF的基础上创新的模块(增加了一次…

基于STM32F401RET6智能锁项目(环境搭建)

工程搭建 MDK,固件库,芯片包下载 下载keil5,stm32f4xx的固件库以及stm32f4的芯片包 keil官网:https://www2.keil.com/mdk5/ stm32中国官网:https://www.stmcu.com.cn/ 创建工程 1、新建一个工程文件夹,…

【勘误】一个错误的快速排序实现

文章目录 问题一&#xff1a;不一致算法描述部分给出的分划实现完整程序部分给出的分划实现 问题二&#xff1a;不正确问题三&#xff1a;把循环条件改为 i < j 程序还是不正确正确的实现总结 从 10 10 10 年前我开始学 C 语言时我就认为快速排序并不是个简单的算法。相比于…

系统权限控制插件封装-实现系统权限控制插件化

背景&#xff1a;按照传统的开发方式方式&#xff0c;每次新开发一个系统&#xff0c;就需要花费大量时间精力去搭建权限控制模块&#xff0c;如果我们把权限控制这一整个模块都抽离成一个独立的权限控制插件&#xff0c;支持单命令安装&#xff0c;全面暴露参数与方法&#xf…

k8s 理论知识基本介绍

目录 一 k8s 理论前言 &#xff08;一&#xff09;微服务是什么 1&#xff0c;应用场景 2&#xff0c;API 是什么 &#xff08;二&#xff09;&#xff0c;微服务 如何做版本迭代 1. Docker镜像构建 2. 版本标记 3. Docker Registry 4. 环境一致性 5. 滚动更新…

多进程编程

创建一对父子进程&#xff1a; 父进程负责向文件中写入 长方形的长和宽 子进程负责读取文件中的长宽信息后&#xff0c;计算长方形的面积 代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #inc…

串口通信---了解

1 串口接线方式 RXD&#xff1a;数据输入引脚&#xff0c;数据接受&#xff1b;STC89系列对应P3.0口 TXD&#xff1a;数据发送引脚&#xff0c;数据发送&#xff1b;STC89系列对应P3.1口 接线方式 串口编程要素 输入/输出数据缓冲器叫做SBUF&#xff0c;都用99H地址码&#x…

Java文件与IO操作

1. 文件与IO操作 1.1 文件 什么是文件: 文件,对我们并不陌生,文件是保存数据的地方,比如大家经常使用的word文档,txt文件.excel文件...都是文件。它既可以保存一张图片,也可以保持视频,声音.… 1.1.1 文件流: 1.1.2 常用的文件操作: 创建文件对象相关构造器和方法: 案例&a…

NeRF算法

目录 算法介绍 基本原理 1. 体渲染 2. 多层感知机&#xff08;MLP&#xff09; 3. 位置编码 4. 两阶段层次化体采样 实验展示 代码解析 算法介绍 NeRF&#xff08;Neural Radiance Fields&#xff09;是一种用于从2D图像中重建3D场景的神经网络模型。它通过训练一个深度…

SAP-ABAP-视图

1、什么是视图&#xff1f; 当需要查询多个表中的某些字段的数据时&#xff0c;就可以使用视图。视图不影响数据库中的数据&#xff0c;仅作为查询手段或工具。 2、视图类型&#xff1a; 数据库视图和维护视图经常使用。 3、创建视图SE11 3.1、数据库视图 可以直接输入表名…

Linux 文件

文章目录 文件操作回顾(C/C)系统调用接口 管理文件认识一切皆文件C/C的文件操作函数与系统调用接口的关系……重定向与缓冲区 -- 认识重定向与缓冲区 -- 理解使用重定向缓冲区实现一个简单的Shell(加上重定向)标准输出和标准错误(在重定向下的意义) 磁盘文件磁盘存储文件操作系…

【BUUCTF】[RoarCTF 2019]Easy Java1

工具&#xff1a;hackbar发包&#xff0c;bp抓包。 解题步骤&#xff1a;【该网站有时候send不了数据&#xff0c;只能销毁靶机重试】 这里的登录界面是个天坑【迷魂弹】 直接点击help&#xff0c;然后进行打开hackbar——通过post请求&#xff0c;再通过bp抓包&#xff0c;…

....comic科学....食用手册....

1.点击链接后&#xff0c;保存漫画至夸克网盘&#xff0c;若是新用户需要用手机注册. 2.在应用商店下载夸克APP. 3.登录APP下载已保存的漫画. 3.1 进入APP点击 夸克网盘 3.2 点击“转存的内容”后&#xff0c;长按 漫画文件夹&#xff0c;点击下载&#xff0c;下载速度400K左…

桥田汉诺威工业展观察:走好脚下更需着眼未来

2024年4月21日&#xff0c;桥田创始人刘小平携核心团队6人共赴“制造业展会天花板”——德国汉诺威工业博览会参观学习&#xff0c;此次参访&#xff0c;是桥田智能组队出海的第二次学习之旅&#xff0c;未来&#xff0c;我们将组织更多优秀员工出海交流学习&#xff0c;让每一…