vision mamba 原理篇

部署运行你感兴趣的模型镜像

1. vision mamba 背景

Mamba 成功的关键在于采用了 Selective Scan Space State Sequential Model(S6 模型)。是用于解决自然语言处理(NLP)任务。与 transformer中注意力机制不同,Mamba的S6 将 1D 向量中的每个元素(例如文本序列)与在此之前扫描过的信息进行交互,从而有效地将二次复杂度降低到线性。

然而,由于视觉信号(如图像)不像文本序列那样具有天然的有序性,因此无法在视觉信号上简单地对 S6 中的数据扫描方法进行直接应用。为此研究者设计了 Cross-Scan 扫描机制。Cross-Scan 模块(CSM)采用四向扫描策略,即从特征图的四个角同时扫描(见上图)。该策略确保特征中的每个元素都以不同方向从所有其他位置整合信息,从而形成全局感受野,又不增加线性计算复杂度。

2. SS2D的演变

图片

在 CSM 的基础上,设计了 2D-selective-scan(SS2D)模块。如上图所示,SS2D 包含了三个步骤:

  • scan expand 将一个 2D 特征沿 4 个不同方向(左上、右下、左下、右上)展平为 1D 向量。

  • S6 block 独立地将上步得到的 4 个 1D 向量送入 S6 操作。

  • scan merge 将得到的 4 个 1D 向量融合为一个 2D 特征输出。

3. VMamba 结构图

图片

上图为本文提出的 VMamba 结构图。VMamba 的整体框架与主流的视觉模型类似,如上图 (b)所示。经过Layer Normalization后,输入被分成两个分支。在第一个分支中,输入经过一个线性层,然后是一个激活函数。在第二个分支中,输入通过线性层、深度可分离卷积和激活函数进行处理,然后输入到2D选择性扫描(SS2D)模块中进行进一步的特征提取。随后,使用Layer Normalization对特征进行归一化,然后使用第一个分支的输出执行逐元素的生成,以合并两条路径。最后,使用线性层混合特征,并将此结果与残差连接相结合,形成VSS块的输出。本文默认采用SiLU作为激活函数。

        其主要区别在于基本模块(VSS block)中采用的算子不同。VSS block 采用了上述介绍的 2D-selective-scan 操作,即 SS2D。SS2D 保证了 VMamba 在线性复杂度的代价下实现全局感受野。

SS2D由三个部分组成:扫描expanding操作、S6块操作和扫描merging操作。如图2(a)所示,扫描expanding操作沿着四个不同的方向(左上到右下、左下到右上、右下到左上、右上到左下)将输入图像展开成序列。然后通过S6块对这些序列进行特征提取,确保各个方向的信息被彻底扫描,从而捕获不同的特征。随后,如图2(b)所示,扫描merging操作将来自四个方向的序列相加并合并,将输出图像恢复为与输入相同的大小。源自Mamba[16]的S6块在S4[17]之上引入了一种选择机制,通过根据输入调整SSM的参数。这使模型能够区分并保留相关信息,同时过滤掉不相关的信息。

您可能感兴趣的与本文相关的镜像

GPT-oss:20b

GPT-oss:20b

图文对话
Gpt-oss

GPT OSS 是OpenAI 推出的重量级开放模型,面向强推理、智能体任务以及多样化开发场景

03-16
### SS2D 技术概述 SS2D 是一种基于深度学习的技术模块,在现代计算机视觉框架中被广泛应用于特征提取和图像处理任务。具体而言,`SS2D` 可以视为一种空间注意力机制或卷积操作的扩展形式,用于增强模型对二维数据的理解能力[^1]。 #### 模型结构与实现 在给定的代码片段中,`SS2D` 被定义为 `ultralytics.nn.modules.vmamba` 的一部分,并通过 PyTorch 实现其功能。以下是其实现的关键部分: ```python import torch import torch.nn as nn from ultralytics.nn.modules.vmamba import SS2D if __name__ == '__main__': ss2d = SS2D(d_model=12).cuda() x = torch.randn(1, 12, 640, 640) # batch_size, channels, height, width x = x.cuda() y = ss2d(x) print(y.shape) ``` 上述代码展示了如何初始化并运行 `SS2D` 模块。其中,`d_model=12` 表示输入张量的通道数,而 `(1, 12, 640, 640)` 定义了一个批量大小为 1、高度和宽度均为 640 像素的输入张量。最终输出形状由 `y.shape` 打印显示,表明该模块能够成功完成前向传播计算。 #### 卷积层对比分析 为了更好地理解 `SS2D` 的作用,可以将其与其他常见的卷积操作进行比较。例如,在 TensorRT 中使用的 `IConvolutionLayer` 提供了一种高效的卷积实现方式。以下是一个典型的卷积配置实例: ```cpp Dims4 input_shape{3, 3, 8, 8}; Dims4 filter_shape{3, 3, 2, 2}; DimsHW kernel_size{2, 2}; DimsHW stride{1, 1}; DimsHW paddings{1, 1}; // 计算输出 shape Dims4 output_shape = CalculateConv2dOutput(input_shape, filter_shape, kernel_size, stride, paddings); // 添加网络中的 Input 层 auto input_data = network->addInput("input", DataType::kFLOAT, input_shape); ``` 尽管两者都涉及二维卷积运算,但 `SS2D` 更加注重于高级语义建模而非简单的滤波器应用[^2]。 #### 应用场景拓展 除了传统的图像分类或目标检测外,`SS2D` 还可适用于其他领域,比如电子签名识别或者图像去雾算法改进等方面的工作。例如,在微信小程序开发过程中利用 Canvas 绘制工具生成手写轨迹时,可以通过类似的二维空间变换提升用户体验质量;而在解决大气散射效应引起的模糊现象方面,则可能借鉴到直接学习残差的思想来优化结果表现效果[^3][^4]。 ### 结论 综上所述,SS2D 不仅限于是某种特定类型的神经网络组件,它代表了一系列围绕着高效处理高维数据所展开的研究方向之一。随着硬件加速技术和软件库不断进步,未来这类轻量化又强大的解决方案将会更加普及开来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值