Swin Trasnformer 新型的Transformer架构,专为计算机视觉任务设计 解决了传统Transformer从自然语言处理迁移到计算机视觉任务时面临的两大问题

Swin Transformer V2 的改进和源码分析 阅读详情

Swin Trasnformer

Swin Transformer是由微软亚洲研究院在2021年提出的一种新型的Transformer架构,专为计算机视觉任务设计。它在多个基准数据集上取得了出色的表现,尤其是在图像分类、目标检测和图像分割等领域。

Swin Transformer的主要创新点在于解决了传统Transformer从自然语言处理迁移到计算机视觉任务时面临的两大问题:

特征尺度变化范围大:在自然语言处理中,token通常是标准固定的大小,而在计算机视觉中,特征尺度变化范围非常大。Swin Transformer通过引入CNN中常用的层次化构建方式,构建了层次化的Transformer,使其能够处理不同尺度的输入。

计算复杂度高:在计算机视觉中,使用Transformer的计算复杂度是图像尺度的平方,这会导致计算量过于庞大。为了降低计算复杂度,Swin Transformer引入了locality思想,对无重合的窗口区域内进行self-attention计算,这种被称为shifted window attention的机制大大降低了计算复杂度。
Swin Transformer的优点包括:

高效性能:由于采用了分层结构和局部注意力机制,Swin Transformer在保持高精度的同时,具有更高的计算效率。

良好的可扩展性:Swin Transformer支持在更大的尺度上进行训练,并在处理更复杂的场景时获得更好的性能。同时,它还支持可变形卷积和自适应卷积等技术,这些技术在复杂视觉任务中具有很好的应用价值。

良好的图像识别能力:Swin Transformer在图像分类和物体检测任务中表现出了优秀的性能,不仅在多个公开数据集中达到了最优水平,还可以处理一些具有挑战性的场景,如低分辨率图像或长尾分布的数据集。

Swin Transformer可以作为图像分类、目标检测和语义分割等任务的通用骨干网络,为这些任务提供了强有力的支持。其出色的性能和广泛的应用前景,使得Swin Transformer有可能成为CNN的完美替代方案。

1. 模型介绍

Swin Transformer是由微软亚洲研究院在今年公布的一篇利用transformer架构处理计算机视觉任务的论文。Swin Transformer 在图像分类,图像分割,目标检测等各个领域已经屠榜,在论文中,作者分析表明,Transformer从NLP迁移到CV上没有大放异彩主要有两点原因:1. 两个领域涉及的scale不同,NLP的token是标准固定的大小,而CV的特征尺度变化范围非常大。2. CV比起NLP需要更大的分辨率,而且CV中使用Transformer的计算复杂度是图像尺度的平方,这会导致计算量过于庞大。为了解决这两个问题,Swin Transformer相比之前的ViT做了两个改进:1.引入CNN中常用的层次化构建方式构建层次化Transformer 2.引入locality思想,对无重合的window区域内进行self-attention计算。另外,Swin Transformer可以作为图像分类、目标检测和语义分割等任务的通用骨干网络,可以说,Swin Transformer可能是CNN的完美替代方案。

2. 模型结构

下图为Swin Transformer与ViT在处理图片方式上的对比,可以看出,Swin Transformer有着ResNet一样的残差结构和CNN具有的多尺度图片结构。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
整体概括:

下图为Swin Transformer的网络结构,输入的图像先经过一层卷积进行patch映射,将图像先分割成4 × 4的小块,图片是224×224输入,那么就是56个path块,如果是384×384的尺寸,则是96个path块。这里以224 × 224的输入为例,输入图像经过这一步操作,每个patch的特征维度为4x4x3=48的特征图。因此,输入的图像变成了H/4×W/4×48的特征图。然后,特征图开始输入到stage1,stage1中linear embedding将path特征维度变成C,因此变成了H/4×W/4×C。然后送入Swin Transformer Block,在进入stage2前,接下来先通过Patch Merging操作,Patch Merging和CNN中stride=2的1×1卷积十分相似,Patch Merging在每个Stage开始前做降采样,用于缩小分辨率,调整通道数,当H/4×W/4×C的特征图输送到Patch Merging,将输入按照2x2的相邻patches合并,这样子patch块的数量就变成了H/8 x W/8,特征维度就变成了4C,之后经过一个MLP,将特征维度降为2C。因此变为H/8×W/8×2C。接下来的stage就是重复上面的过程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
每步细说:

Linear embedding

下面用Paddle代码逐步讲解Swin Transformer的架构。 以下代码为Linear embedding的操作,整个操作可以看作一个patch大小的卷积核和patch大小的步长的卷积对输入的B,C,H,W的图片进行卷积,得到的自然就是大小为 B,C,H/patch,W/patch的特征图,如果放在第一个Linear embedding中,得到的特征图就为 B,96,56,56的大小。Paddle核心代码如下。

class PatchEmbed(nn.Layer):
    """ Image to Patch Embedding
    Args:
        img_size (int): Image size.  Default: 224.
        patch_size (int): Patch token size. Default: 4.
        in_chans (int): Number of input image channels. Default: 3.
        embed_dim (int): Number of linear projection output channels. Default: 96.
        norm_layer (nn.Layer, optional): Normalization layer. Default: None
    """

    def __init__(self,
                 img_size=224,
                 patch_size=4,
                 in_chans=3,
                 embed_dim=96,
                 norm_layer=None):
        super().__init__()
        img_size = to_2tuple(img_size)
        patch_size = to_2tuple(patch_size)
        patches_resolution = [
            img_size[0] // patch_size[0], img_size[1] // patch_size[1]
        ]
        self.img_size = img_size
        self.patch_size = patch_size
        self.patches_resolution = patches_resolution
        self.num_patches = patches_resolution[0] * patches_resolution[1] #patch个数

        self.in_chans = in_chans
        self.embed_dim = embed_dim

        self.proj = nn.Conv2D(
            in_chans, embed_dim, kernel_size=patch_size, stride=patch_size) #将stride和kernel_size设置为patch_size大小
        if norm_layer is not None:
            self.norm = norm_layer(embed_dim)
        else:
            self.norm = None

    def forward(self, x):
        B, C, H, W = x.shape
        
        x = self.proj(x) # B, 96, H/4, W4 

        x = x.flatten(2).transpose([0, 2, 1])  # B Ph*Pw 96
        if self.norm is not None:
            x = self.norm(x)
        return x

Patch Merging

以下为PatchMerging的操作。该操作以2为步长,对输入的图片进行采样,总共得到4张下采样的特征图,H和W降低2倍,因此,通道级拼接后得到的是B,4C,H/2,W/2的特征图。然而这样的拼接不能够提取有用的特征信息,于是,一个线性层将4C的通道筛选为2C, 特征图变为了B,2C, H/2, W/2。细细体会可以发现,该操作像极了
卷积常用的Pooling操作和步长为2的卷积操作。Poling用于下采样,步长为2的卷积同样可以下采样,另外还起到了特征筛选的效果。总结一下,经过这个操作原本B,C,H,W的特征图就变为了B,2C,H/2,W/2的特征图,完成了下采样操作。

class PatchMerging(nn.Layer):
    r""" P
SwinTransformer 改进:SSPCAB模块(2024最新改进方法) SSPCAB(Spatial Pyramid Pooling with Channel Attention Block)是2024年提出的一种新型神经网络架构改进方法,专注于在保持高精度的同时显著降低计算复杂度和参数量。该方法通过创新的空间金字塔池化与通道注意力机制的结合,实现了网络结构的紧凑化和运算效率的大幅提升。核心创新点1. 混合空间金字塔池化(Hybrid Spatial Pyramid Pooling, HSPP)多尺度动态核池化:根据输入特征图尺寸动态调整池化核大小和步长交叉级联结构。 阅读详情

相关推荐

SwinTransformer 改进:添加SelfAttention自注意力层

Self-Attention自注意力层是一种在神经网络中用于处理序列数据的注意力机制。它通过对输入序列中的不同位置进行关注,来计算每个位置与其他位置的关联程度,并根据这些关联程度对输入序列进行加权。自注意力层的优势在于它能够利用序列中的局部和全局信息,从而更好地捕捉序列中不同位置之间的依赖关系。在自然语言处理领域中,自注意力层被广泛应用于机器翻译、文本分类和阅读理解等任务中。输出size:torch.Size([1, 10])添加如下:其中sa部分就是添加的模块。想要完整的分类代码,请参考。

Henry的博客 827

YOLOv5升级:Swin-Transformer改进小目标检测 多任务让计算机视觉策马奔腾

近年来,深度学习在计算机视觉领域取得了巨大的成功。为了进一步提高小目标检测的性能,我们将探讨一种新的方法,即将Swin-Transformer应用于YOLOv5,并添加一个专门用于小目标检测的头部模块。具体来说,我们将YOLOv5的骨干网络替换为Swin-Transformer,这样就可以利用Swin-Transformer的自注意力机制来获取更大范围的上下文信息。综上所述,我们通过将Swin-Transformer引入到YOLOv5中,并添加一个专门处理小目标的头部模块,成功改进了小目标检测的性能。

JjtlReact的博客 1054

【RT-DETR有效改进】 主干篇 | SwinTransformer替换Backbone(附代码 + 详细修改步骤 +原理介绍)

本文给大家带来的改进机制是利用替换RT-DETR中的骨干网络其是一个开创性的视觉变换器模型,它通过使用位移窗口来构建分层的特征图,有效地适应了计算机视觉任务。与传统的变换器模型不同,Swin Transformer的自注意力计算仅限于局部窗口内,使得计算复杂度与图像大小成线性关系,而非二次方。这种设计不仅提高了模型的效率,还保持了强大的特征提取能力。Swin Transformer的创新在于其能够在不同层次上捕捉图像的细节和全局信息,使其成为各种视觉任务的强大通用骨干网络。

Snu77的博客 3503

YOLOv5、YOLOv8改进:Swin Transformer-V2

YOLOv5、YOLOv8改进:Swin Transformer-V2

weixin_45303602的博客 1885

使用Swin Transformer改进YOLOv5:实现小目标检测

这样,我们能够利用Swin Transformer的特性,提高YOLOv5在小目标检测方面的性能。我们通过添加Swin Transformer的小目标检测头部,利用其在处理图像中的局部关注力方面的优助益,提高了YOLOv5对小目标的检测性能。在本文中,我们将探讨如何通过增加Swin Transformer的小目标检测头来改进YOLOv5,以提高对小目标的检测性能。接下来,我们将修改YOLOv5的源代码,以增加Swin Transformer的小目标检测头。接下来,我们可以使用标准的数据集进行训练和评估。

GzvDart的博客 840

SwinTransformer 改进:稀疏化注意力机制(Sparse Attention)

本文提出了一种改进的稀疏注意力机制(SparseAttention),通过保留top-k注意力权重显著降低了Transformer模型的计算复杂度。该方法针对SwinTransformer架构实现,包含三个关键技术:1) 稀疏注意力层仅计算和保留top-k权重,减少计算量;2) 相对位置编码保持位置感知能力;3) 自动替换机制可将原始注意力层全部替换为稀疏版本。实验表明,该方法在保持模型性能的同时提升了计算效率,特别适用于高分辨率图像处理等场景。代码实现了完整的稀疏注意力模块和模型替换流程,为Transfo

Henry的博客 782

#1机器学习(西瓜书)自学记录

《机器学习 》 Datawhale 组队学习, 吃瓜自学笔记。

qq_74168740的博客 1142

SBP依赖计算中的蝴蝶效应:一个Prefab修改如何触发全量重建?

本文深入探讨了Unity中SBP(Scriptable Build Pipeline)依赖计算的蝴蝶效应,解析了Prefab修改如何触发全量重建的机制。通过分析Asset与Object的层级关系、依赖计算的三种维度及CacheEntry系统,揭示了全量重建的根本原因,并提供了依赖可视化工具开发、优化策略与最佳实践,帮助开发者提升构建效率。

weixin_29015051的博客 439

在不同版本Python中安装PyQT5及PyQT5-Tools

在不同版本Python中安装PyQT5及PyQT5-Tools

zoomgu680的博客 2万+

【NLP】第10章 使用基于 BERT 的 Transformer 进行语义角色标记

Transformers 在过去几年里取得的进步比上一代 NLP 还要多。标准 NLU 方法首先学习句法和词汇特征来解释句子的结构。在运行语义角色标签( SRL )之前,将训练以前的 NLP 模型理解语言的基本语法。Shi和Lin(2019)在他们的论文开始时询问是否可以跳过初步的句法和词汇训练。基于 BERT 的模型可以在不经过那些经典训练阶段的情况下执行 SRL 吗?答案是肯定的!Shi和Lin (2019) 建议 SRL 可以被视为序列标记并提供标准化的输入格式。他们基于 BERT 的模型产生了令人惊

sikh_0529的博客 7367

OpenClaw实战系列06:持久记忆与RAG知识库构建——让AI真正“记住”你

本文介绍了OpenClaw AI助理的持久记忆与RAG知识库构建功能。OpenClaw采用"文件即真理"的独特设计,所有记忆都以Markdown文件形式存储,支持直接编辑和Git版本管理。记忆系统分为三层:长期精炼记忆(MEMORY.md)、日常日志(按日期存储)和归档记忆。文章详细说明了环境配置步骤,包括安装必要组件、创建目录结构、设置API密钥,并提供了OpenClaw主配置文件的完整参数说明。该系统实现了跨会话、跨平台的持久化记忆,使AI助理能真正理解用户需求。

PeterPan的博客 1164

基于DO-178C/331的飞控软件研发环境的研究

本研究提出了一套基于DO-178C/331标准的飞控系统软件开发和验证框架。通过优化模型库的设计、代码生成配置和测试验证流程,显著提升了飞控系统软件的开发效率和安全性。未来的研究可以进一步扩展模型库的功能,以适应更复杂的飞控系统需求。

qq_41854911的博客 560

YOLO26涨点改进 | 全网首发Conv独家改进篇 | CVPR 2025 | 引入GCConv卷积改进YOLO26,含GCC3k2二次创新,能够捕捉更加丰富和复杂的特征信息,助力高效涨点

本文提出了一种基于GCConv模块的YOLO26目标检测模型改进方案。GCConv模块通过多路径结构增强特征学习能力,在训练阶段采用垂直多卷积和水平多路径配置,推理时重参数化为单一3x3卷积,显著提升推理速度而不损失性能。实验表明,该模块在复杂场景和多尺度目标检测任务中表现优异,特别适合资源受限的实时应用场景。文章详细介绍了GCConv的网络结构、核心代码实现、YAML配置文件修改方法,并提供了两种改进方案(GCConv和GCC3k2)的具体配置指导。

Ai缝合怪、助力小伙伴高效发论文 306

英伟达(NVIDIA) 显卡型号、计算能力(CC)、CUDA版本、PyTorch版本 对照表

本文全面梳理NVIDIA显卡型号与其计算能力(CC)的对应关系,并详解各代CUDA版本对不同架构的支持与弃用情况,帮助用户判断硬件兼容性。同时,结合PyTorch官方发布版本,整理其支持的CUDA版本清单,指导开发者合理选择深度学习环境配置。涵盖从Jetson嵌入式设备到H100、Blackwell等最新旗舰显卡,是一份实用的AI开发环境搭建参考指南。

寒水馨 · 轻量级技术文档 · hanshuixin.org 4864

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: 数据增广 Data Augmentation 分类任务 正则化方法 增加训练数据集的数据量和多样性 提升模型的泛化能力 翻转变换 随机修剪 色彩抖动 平移变换 对比度变换
下一篇: ViT( Vision Transformer) 多头自注意力机制 计算机视觉领域应用Transformer架构的模型 首次将NLP领域中广泛使用的Transformer模型引入到了CV领域
EwenWanW
博客等级 码龄12年 3425粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EwenWanW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值