【论文阅读及代码实现】BiFormer: 具有双水平路由注意的视觉变压器

【论文阅读及代码实现】BiFormer: 具有双水平路由注意的视觉变压器


BiFormer: Vision Transformer with Bi-Level Routing Attention

视觉转换器的核心组成部分,注意力是捕捉长期依赖关系的有力工具

计算跨所有空间位置的成对token交互时,计算负担和沉重的内存占用

提出了一种新的动态稀疏注意,通过双层路由实现更灵活的内容感知计算分配


过程:

  • 首先在粗区域级别过滤掉不相关的键值对
  • 然后在剩余候选区域(即路由区域)的联合中应用细粒度的Token到Token
  • 利用稀疏性来节省计算和内存,同时只涉及GPU-friendly的密集矩阵乘法


提出了一种新的通用视觉变压器,称为BiF变压器

一、总体介绍

Transformer有许多适合于构建强大的数据驱动模型的属性

捕获数据中的远程依赖关系

卷积本质上是一个局部算子,与之相反,注意力的一个关键属性是全局接受场,它使视觉转换器能够捕获远程依赖

稀疏关注引入到视觉转换,可以减少相应的计算量

不同语义区域的查询实际上关注的键值对是完全不同的。因此,强制所有查询处理同一组令牌可能不是最优的

需要评估所有查询和键之间的配对亲和力,因此具有相同的vanilla attention复杂性。另一种可能性是基于每个查询的本地上下文来预测注意力偏移量

高效地定位有价值的键值

提出了一种区域到区域路由,核心思想是在粗粒度的区域级别过滤掉最不相关的键值

不是直接在细粒度的令牌级别

应用Token到令Token的注意,这是非常重要的,因为现在假定键值(Q,K,V)对在空间上是分散的

使用BRA作为核心构建块,我们提出了BiFormer,这是一个通用的视觉变压器骨干

BRA使BiFormer能够以内容感知的方式为每个查询处理最相关的键/值Token的一小部分,因此我们的模型实现了更好的计算性能权衡



具体作用:

  • 引入了一种新的双层路由机制,自适应查询的方式实现内容感知的稀疏模式
  • 双级路由关注作为基本构建块
  • 更好的性能和更低的计算量

二、联系工作


Vision transformers

  采用基于通道的MLP块进行错位嵌入(通道混合),并采用注意力块进行交叉位置关系建,transformers使用注意力作为卷积的替代方案来实现全局上下文建模

  vanilla attention在所有空间位置上两两计算特征亲和性,它会带来很高的计算负担和沉重的内存占用



Efficient attention mechanisms

  稀疏连接模式[6],低秩近似[43]或循环操作[11]来减少vanilla attention的计算和内存复杂性瓶颈,Swin变压器中,将注意力限制在不重叠的局部窗口上,并引入移位窗口操作来实现相邻窗口之间的窗口间通信

手工制作的稀疏模式:

  • 膨胀窗口[41,46]
  • 十字形窗口[14]

不同查询的关注区域可能会有显著差异

  双层路由注意的目标是定位几个最相关的键值对,而四叉树注意构建了一个到ken金字塔,并组装来自不同粒度的所有级别的消息

三、具体模型

3.1 注意力



注意力的具体表示:

Q∈RNq×C,键K∈RNkv×C,值V∈RNkv×C作为输入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HtijvfDp-1685258083484)(C:\Users\isipa\AppData\Roaming\Typora\typora-user-images\image-20230522144133937.png)]

避免权值集中和梯度消失,引入标量因子√C

基础的构建块是多头自关注(MHSA)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3xqKrHJf-1685258083485)(C:\Users\isipa\AppData\Roaming\Typora\typora-user-images\image-20230522144629381.png)]

3.2 双级路由注意(BRA)


为了缓解MHSA的可扩展性问题,一些研究[14,29,41,46,48]提出了不同的稀疏关注机制,其中每个查询只关注少量的键值对

探索了一种动态的、查询感知的稀疏注意机制。

整体结构图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O2ScClfB-1685258083485)(C:\Users\isipa\AppData\Roaming\Typora\typora-user-images\image-20230522145607352.png)]

具体操作思想:

  • 在粗区域级别过滤掉大多数不相关的键值对
  • 只保留一小部分路由区域
  • 路由区域的联合中应用细粒度的令牌到令牌关

Region partition and input projection.

特征图X∈RH×W×C

分为S×S个不重叠的区域,使得每个区域包含H×W×S2特征向量

将其转化为

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T4Yc2UpO-1685258083485)(C:\Users\isipa\AppData\Roaming\Typora\typora-user-images\image-20230522150124627.png)]

同时将导出查询,键,值张量,Q, K, V∈R s2xHW/S2×C,具有线性投影

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-akER9vbS-1685258083485)(C:\Users\isipa\AppData\Roaming\Typora\typora-user-images\image-20230522150349897.png)]



Region-to-region routing with directed graph

构造一个有向图来找到参与关系,每个给定区域应该参与的区域

对Q和K应用每个区域的平均值来推导区域级查询和键Qr, Kr∈RS2×C

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u0XVdTBq-1685258083486)(C:\Users\isipa\AppData\Roaming\Typora\typora-user-images\image-20230522150544306.png)]

Qr与转置的Kr之间的矩阵乘法推导出区域到区域亲和图的邻接矩阵

Ar中的条目度量两个区域在语义上的关联程度

步骤是通过仅为每个区域保留top-k连接来修剪关联图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fu82A9AD-1685258083486)(C:\Users\isipa\AppData\Roaming\Typora\typora-user-images\image-20230522151420598.png)]


Ir的第i行包含第i区最相关区域的k个指标

区域到区域路由索引矩阵Ir,我们就可以应用细粒度的Token到令Token的注意关注。对于区域i中的每个查询令牌

收集键和值张量

在这里插入图片描述

函数LCE(·)使用深度卷积参数化,我们将内核大小设置为5

BRA的计算包括三个部分:

  • 线性投影

  • 区域到区域路由

  • token到token注意

3.4. BiFormer的结构设计

BRA为基本构建块,提出了一种新的通用视觉变压器BiFormer

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PgVHMAP4-1685258083487)(C:\Users\isipa\AppData\Roaming\Typora\typora-user-images\image-20230522154547096.png)]

具体结构:

  1. 第一阶段使用重叠的patch嵌入
  2. 第二到第四阶段使用patch合并模块
  3. 使用Ni连续的BiFormer块来变换特征

将每个注意头设置为32个通道,MLP扩展比e=3。对于BRA,由于输入分辨率不同,我们对4个阶段使用topk = 1,4,16, S2

分类/语义分割/目标检测任务,区域划分因子S = 7/8/16

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-08NnxIqz-1685258083487)(C:\Users\isipa\AppData\Roaming\Typora\typora-user-images\image-20230522154842133.png)]


四、论文实验结果


同样只看在ADE20K,语义分割上的实验效果,与其他的效果来进行对比

基于MMSegmentation[8]在ADE20K[55]数据集上进行了语义分割实验。

采用框架对比:

  • 语义FPN
  • UperNet

主干都使用ImageNet-1K预训练的权重进行初始化,而其他层则使用随机初始化,使用AdamW优化器对模型进行优化,批量大小设置为32

Swin Transformer相同的设置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2QrzaVSh-1685258083488)(C:\Users\isipa\AppData\Roaming\Typora\typora-user-images\image-20230522155616440.png)]

五、代码理解


从官方代码中给出的代码中我们选取biformer_base来对相应的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6QBWEryl-1685258083488)(C:\Users\isipa\AppData\Roaming\Typora\typora-user-images\image-20230522173110375.png)]

通过相应参数,我们可以得知,在构建模型中的数据

由于我下游任务是语义分割,topks的最后一项参数是S=8,s2是64

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JSSvRLvr-1685258083488)(C:\Users\isipa\AppData\Roaming\Typora\typora-user-images\image-20230522185345068.png)]

这里是具体的BRA模块的构成参数导入,由4个阶段的不同来分配不同的参数,因为s=-1改为了s=64,在4个阶段的Attention都为BiLevelRoutingAttention


在代码中的具体使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rFdTTPdh-1685258083488)(C:\Users\isipa\AppData\Roaming\Typora\typora-user-images\image-20230522185629077.png)]

原官方代码中有很多if,else的判断选择,但是最后执行的代码为这一段

Biformer的具体函数在

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IsnOYtbd-1685258083489)(C:\Users\isipa\AppData\Roaming\Typora\typora-user-images\image-20230527155130513.png)]

可以看到具体的函数操作


六、遥感实验结果

2023.5.21resnet50Vaihingen256*256(叠切)32251000.01SGDOA=83.47%Miou=67.75%F1=80.53%resnet50+BiFormer*4+IRFFN(depth=[3,4,6,3] num_heads=[2, 4, 8, 16],dilation=[1, 2])
2023.5.21resnet50Vaihingen256*256(叠切)32251000.01SGD82.93%67.61%80.35%resnet50+BiFormer2+MSDA2+IRFFN(depth=[3,4,6,3] num_heads=[2, 4, 8, 16],dilation=[1, 2])
2023.5.21resnet50Vaihingen256*256(叠切)32251000.01SGD83.24%67.74%80.44%resnet50+BiFormer+MSDA+BiFormer+MSDA+IRFFN(depth=[3,4,6,3] num_heads=[2, 4, 8, 16],dilation=[1, 2])

主干网络:resnet50

解码器:Unet的融合解码

初步结论:具有一定提高的效果,但作为轻量级的网络,在实际的使用上效果一般

### 实现双级路由注意力机制于YOLOv11 在YOLOv11中集成双级路由注意力机制(Biformer),旨在增强模型处理小目标和遮挡情况的能力。具体而言,该机制通过引入动态、查询感知的稀疏注意力来改善特征提取效率与质量。 #### 设计思路 Bi-level Routing Attention (BRA) 的核心在于分层次地筛选出最具有代表性的区域,并集中资源对其进行深入分析。这一过程分为两个阶段: - **粗粒度选择**:初步定位图像中的潜在兴趣区; - **细粒度聚焦**:针对这些选定区域执行更精细的关注操作[^1]。 这种策略不仅提高了计算资源利用率,还增强了对于复杂场景下物体识别的效果。 #### 技术细节 ##### 代码实现框架 要将此功能嵌入到现有的YOLO架构内,需修改原有网络结构,在适当位置插入新的组件——即负责实施上述两级过滤逻辑的部分。以下是简化版Python伪代码示例说明如何构建这样一个模块: ```python import torch.nn as nn class Biformer(nn.Module): def __init__(self, channels_in, num_heads=8, k=3): super().__init__() self.query_conv = nn.Conv2d(channels_in, channels_in // num_heads, kernel_size=1) self.key_conv = nn.Conv2d(channels_in, channels_in // num_heads, kernel_size=1) self.value_conv = nn.Conv2d(channels_in, channels_in, kernel_size=1) self.softmax = nn.Softmax(dim=-1) def forward(self, x): batch_size, C, H, W = x.size() proj_query = self.query_conv(x).view(batch_size,-1,H*W).permute(0,2,1) # B X CX(N) proj_key = self.key_conv(x).view(batch_size,-1,H*W) # B X C x (*W*H) energy = torch.bmm(proj_query,proj_key) # transpose check attention_scores = self.softmax(energy) # BX (N) X (N) top_k_indices = torch.topk(attention_scores,k,dim=-1)[1].unsqueeze(-1).expand(-1,-1,C//num_heads,-1) selected_keys = torch.gather(proj_key.unsqueeze(1),dim=2,index=top_k_indices.repeat(1,num_heads,1,1)) union_of_selected_regions = selected_keys.view(batch_size*num_heads,-1,C//num_heads*k).sum(dim=1) proj_value = self.value_conv(x).view(batch_size,-1,H*W) # B X C X N out = torch.bmm(union_of_selected_regions.permute(0,2,1), proj_value) # B X C X C out = out.view(batch_size,C,H,W) return out + x # Residual connection ``` 这段代码定义了一个名为`Biformer`的新类,它接受输入张量并应用基于双层路由的选择性注意机制。这里假设已经有一个预训练好的YOLOv11作为基础模型;接下来只需找到合适的位置插入此类实例即可完成整个系统的升级[^3]。 #### 集成至YOLOv11 为了使新特性生效,建议将其放置在网络较深部分靠近输出端的地方,因为此时特征图尺寸较小而通道数较多,更适合做精细化调整。另外还需考虑与其他现有改进措施之间的兼容性和协同效应,比如卷积优化或损失函数微调等[^4]。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值