当前位置: 首页 > news >正文

YOLO11 改进 - 主干网络_ 清华大学CloFormer AttnConv :利用共享权重和上下文感知权重增强局部感知,注意力机制与卷积的完美融合

前言

本文介绍了轻量级视觉变换器CloFormer及其核心模块AttnConv在YOLOv11中的结合应用。为解决视觉变换器缩小到移动设备友好尺寸时性能下降的问题,提出CloFormer,其引入AttnConv操作符。AttnConv融合共享权重和上下文感知权重,先通过深度卷积提取局部表示,再用上下文感知权重增强特征,还结合传统注意力减少FLOPs,使模型感知高频和低频信息。我们将AttnConv集成进YOLOv11,实验表明,CloFormer在多个视觉任务中表现优越,改进后的YOLOv11也取得了良好实验结果。

文章目录: YOLOv11改进大全:卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总

专栏链接: YOLOv11改进专栏

文章目录

目录
  • 前言
  • 介绍
    • 摘要
  • 文章链接
  • 基本原理
  • 核心代码
  • 实验
    • 脚本
    • 结果

介绍

摘要

视觉变换器(Vision Transformers,ViTs)已被证明在各种视觉任务中具有高效性。然而,将其缩小到移动设备友好的尺寸会导致性能显著下降。因此,开发轻量级视觉变换器成为了一个重要的研究方向。本文介绍了CloFormer,这是一种利用上下文感知局部增强的轻量级视觉变换器。CloFormer探讨了在传统卷积操作中常用的全局共享权重与在注意力机制中出现的特定于token的上下文感知权重之间的关系,并提出了一种高效且简单的模块来捕获高频局部信息。在CloFormer中,我们引入了AttnConv,一种在注意力风格下的卷积操作。提出的AttnConv使用共享权重来聚合局部信息,并部署精心设计的上下文感知权重来增强局部特征。AttnConv与使用池化来减少CloFormer中FLOPs的传统注意力相结合,使模型能够感知高频和低频信息。在图像分类、目标检测和语义分割中的大量实验表明了CloFormer的优越性。

文章链接

论文地址: 论文地址

代码地址: 代码地址

基本原理

AttnConv是CloFormer中引入的一种卷积操作符,它采用了注意力机制的风格。所提出的 AttnConv 有效地融合了共享权重和上下文感知权重,以聚合高频的局部信息。具体地,AttnConv 首先使用深度卷积(DWconv)提取局部表示,其中 DWconv 具有共享权重。然后,其使用上下文感知权重来增强局部特征。与 Non-Local 等生成上下文感知权重的方法不同,AttnConv 使用门控机制生成上下文感知权重,引入了比常用的注意力机制更强的非线性。此外,AttnConv 将卷积算子应用于 Query 和 Key 以聚合局部信息,然后计算 Q 和 K 的哈达玛积,并对结果进行一系列线性或非线性变换,生成范围在 [-1,1] 之间的上下文感知权重。值得注意的是,AttnConv 继承了卷积的平移等变性,因为它的所有操作都基于卷积。具体公式如下:

最后,将全局特征和局部特征合并起来,并使用一个MLP得到最终的输出。公式表示如下:

  1. AttnConv的操作流程

    • 首先,通过线性变换得到Q、K和V,这一步与标准的注意力机制相同。

    • 接着,在V上使用共享权重(DWconv)进行信息聚合,利用深度卷积提取局部表示。

    • 然后,利用比传统注意力机制更强的非线性方法生成上下文感知权重,用这些权重增强局部特征。

  2. AttnConv的技术原理

    • AttnConv通过引入共享权重和上下文感知权重来提取高频局部信息。

    • 使用深度卷积(DWconv)提取局部表示,再利用上下文感知权重增强局部特征。

    • 与以往通过局部自注意力生成上下文感知权重的方法不同,AttnConv通过门控机制生成上下文感知权重,引入了比常用注意力机制更强的非线性。

    • AttnConv对Q和K应用卷积操作来聚合局部信息,然后计算Q和K的哈达玛积,并对结果进行一系列线性或非线性变换,生成范围在[-1, 1]内的上下文感知权重。

    • AttnConv保留了卷积的平移等变性特性,因为其所有操作都基于卷积。

核心代码

import torch
import torch.nn as nn
import torch.nn.functional as F
from timm.models.layers import DropPath
from typing import List
from efficientnet_pytorch.model import MemoryEfficientSwishclass AttnMap(nn.Module):def __init__(self, dim):super().__init__()self.act_block = nn.Sequential(nn.Conv2d(dim, dim, 1, 1, 0),MemoryEfficientSwish(),nn.Conv2d(dim, dim, 1, 1, 0)#nn.Identity())def forward(self, x):return self.act_block(x)class EfficientAttention(nn.Module):def __init__(self, dim, num_heads, group_split: List[int], kernel_sizes: List[int], window_size=7, attn_drop=0., proj_drop=0., qkv_bias=True):super().__init__()assert sum(group_split) == num_headsassert len(kernel_sizes) + 1 == len(group_split)self.dim = dimself.num_heads = num_headsself.dim_head = dim // num_headsself.scalor = self.dim_head ** -0.5self.kernel_sizes = kernel_sizesself.window_size = window_sizeself.group_split = group_splitconvs = []act_blocks = []qkvs = []#projs = []for i in range(len(kernel_sizes)):kernel_size = kernel_sizes[i]group_head = group_split[i]if group_head == 0:continueconvs.append(nn.Conv2d(3*self.dim_head*group_head, 3*self.dim_head*group_head, kernel_size,1, kernel_size//2, groups=3*self.dim_head*group_head))act_blocks.append(AttnMap(self.dim_head*group_head))qkvs.append(nn.Conv2d(dim, 3*group_head*self.dim_head, 1, 1, 0, bias=qkv_bias))#projs.append(nn.Linear(group_head*self.dim_head, group_head*self.dim_head, bias=qkv_bias))if group_split[-1] != 0:self.global_q = nn.Conv2d(dim, group_split[-1]*self.dim_head, 1, 1, 0, bias=qkv_bias)self.global_kv = nn.Conv2d(dim, group_split[-1]*self.dim_head*2, 1, 1, 0, bias=qkv_bias)#self.global_proj = nn.Linear(group_split[-1]*self.dim_head, group_split[-1]*self.dim_head, bias=qkv_bias)self.avgpool = nn.AvgPool2d(window_size, window_size) if window_size!=1 else nn.Identity()self.convs = nn.ModuleList(convs)self.act_blocks = nn.ModuleList(act_blocks)self.qkvs = nn.ModuleList(qkvs)self.proj = nn.Conv2d(dim, dim, 1, 1, 0, bias=qkv_bias)self.attn_drop = nn.Dropout(attn_drop)self.proj_drop = nn.Dropout(proj_drop)def high_fre_attntion(self, x: torch.Tensor, to_qkv: nn.Module, mixer: nn.Module, attn_block: nn.Module):'''x: (b c h w)'''b, c, h, w = x.size()qkv = to_qkv(x) #(b (3 m d) h w)qkv = mixer(qkv).reshape(b, 3, -1, h, w).transpose(0, 1).contiguous() #(3 b (m d) h w)q, k, v = qkv #(b (m d) h w)attn = attn_block(q.mul(k)).mul(self.scalor)attn = self.attn_drop(torch.tanh(attn))res = attn.mul(v) #(b (m d) h w)return resdef low_fre_attention(self, x : torch.Tensor, to_q: nn.Module, to_kv: nn.Module, avgpool: nn.Module):'''x: (b c h w)'''b, c, h, w = x.size()q = to_q(x).reshape(b, -1, self.dim_head, h*w).transpose(-1, -2).contiguous() #(b m (h w) d)kv = avgpool(x) #(b c h w)kv = to_kv(kv).view(b, 2, -1, self.dim_head, (h*w)//(self.window_size**2)).permute(1, 0, 2, 4, 3).contiguous() #(2 b m (H W) d)k, v = kv #(b m (H W) d)attn = self.scalor * q @ k.transpose(-1, -2) #(b m (h w) (H W))attn = self.attn_drop(attn.softmax(dim=-1))res = attn @ v #(b m (h w) d)res = res.transpose(2, 3).reshape(b, -1, h, w).contiguous()return resdef forward(self, x: torch.Tensor):'''x: (b c h w)'''res = []for i in range(len(self.kernel_sizes)):if self.group_split[i] == 0:continueres.append(self.high_fre_attntion(x, self.qkvs[i], self.convs[i], self.act_blocks[i]))if self.group_split[-1] != 0:res.append(self.low_fre_attention(x, self.global_q, self.global_kv, self.avgpool))return self.proj_drop(self.proj(torch.cat(res, dim=1)))

实验

脚本

import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLOif __name__ == '__main__':
#     修改为自己的配置文件地址model = YOLO('/root/ultralytics-main/ultralytics/cfg/models/11/yolov11-CloFormerAttnConv.yaml')
#     修改为自己的数据集地址model.train(data='/root/ultralytics-main/ultralytics/cfg/datasets/coco8.yaml',cache=False,imgsz=640,epochs=10,single_cls=False,  # 是否是单类别检测batch=8,close_mosaic=10,workers=0,optimizer='SGD',amp=True,project='runs/train',name='CloFormerAttnConv',)

结果

http://www.jsqmd.com/news/487146/

相关文章:

  • 简单工厂模式和策略模式的区别
  • YOLO11 改进 - 主干网络_ RepViT重访移动端CNN的ViT视角:轻量级设计分离Token与Channel混合器,优化移动端实时检测
  • python 生成与安装 inquirement
  • 探索MATLAB下综合能源系统优化调度:阶梯式碳与供需灵活双响应的奇妙之旅
  • 轻松掌握C语言中的大小写字母转换
  • YOLO11 改进 - 主干网络_ SwinTransformer 移位窗口层次化视觉变换器:层次化特征提取增强多尺度目标感知,优化复杂场景检测
  • 新手也能上手!备受喜爱的降AI率工具 —— 千笔·降AI率助手
  • 【Azure Key Vault】下载Key Vault中保存证书的PFX文件报错问题分析
  • 空间栅格化(体素化)及射线选择原理
  • 【2026年最新600套毕设项目分享】springboot房屋交易系统(14149)
  • **发散创新:基于Python的脉冲神经网络模拟与实时计算优化实践**
  • 爱心捐赠系统,公益捐赠系统, 基于SpringBoot3+vue3的原创精品,适用于毕业设计、实习项目、学习项目
  • YOLO11 改进 - 主干网络_ FasterNet (基于PConv部分卷积的神经网络):轻量级设计优化内存访问效率,实现精度与速度双重提升
  • YOLOv11涨点改进| CVPR2026 |全网创新首发、Conv卷积改进篇 | 引入MSInit轻量级多尺度卷积,捕获局部细节和结构纹理信息,助力YOLOv11目标检测,图像分割,图像分类高效涨点
  • # 虚拟世界中的编程艺术:用 Rust构建轻量级 3D 场景引擎 在虚拟世界的浪潮中,**开发
  • 前端如何渲染 Markdown 格式:从基础到实战全指南
  • 快捷键及Dos命令
  • YOLO11 改进 - 主干网络_ MobileNetV4 移动网络第四版:通用倒瓶颈与移动注意力协同优化硬件效率,提升移动端检测适应性
  • H6光伏逆变器仿真模型:与量产程序一致的代码控制探索
  • YOLO11 改进 - 主干网络_ LSKNet大型选择性核网络:大核深度卷积与空间选择机制协同动态调整感受野,增强旋转目标检测
  • 大数据与会计专业必考证书有哪些?
  • 如何基于页面设计测试点(测试实习经验总结)
  • YOLO11 改进 - 主干网络_ EfficientRep:一种旨在提高硬件效率的RepVGG风格卷积神经网络架构
  • 飞桨动态图超流畅
  • 财务BP
  • 基于微信小程序的竞赛报名系统_13348
  • 青龙面板密码和账户错误重置
  • 基于 MATLAB 的改进带记忆模拟退火算法求解 TSP 问题
  • DeepSeek-V3发布:性能超越,成本仅为Llama 3的七分之一
  • WPS办公技巧:多工作表自动汇总与拆分