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

YOLOv11 改进 - 注意力机制 GC Block(GlobalContext Block)全局上下文块:三重变换捕获全局依赖,提升复杂场景鲁棒性

前言

本文介绍了全局上下文块(GC Block)及其在YOLOv11中的集成应用。GC Block是GCNet的核心组件,结合了NLNet和SENet的优势,通过上下文建模、特征变换和特征融合三个模块,高效捕获特征图中的全局依赖关系,在提高模型性能的同时降低计算成本。我们将GC Block引入YOLOv11,在检测头部分的不同尺度特征图上应用该模块。实验表明,改进后的YOLOv11在目标检测任务中表现良好,展现了GC Block在实际应用中的价值。

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

专栏链接: YOLOv11改进专栏

@

目录
  • 前言
  • 介绍
    • 摘要
  • 文章链接
  • 基本原理
      • GC Block 详细介绍
        • 1. 上下文建模模块(Context Modeling Module)
        • 2. 特征变换模块(Feature Transform Module)
        • 3. 特征融合模块(Feature Fusion Module)
      • GC Block 流程总结
      • 总结
  • 核心代码
  • 实验
    • 脚本
    • 结果

介绍

image-20240718164344690

摘要

非局部网络(NLNet)通过聚合特定查询位置的全局上下文,为捕获长程依赖性提供了开创性方法。然而,经过严格的实证分析,我们发现非局部网络在同一图像的不同查询位置所建模的全局上下文呈现出高度相似性。基于这一发现,本文构建了一个基于查询无关公式的简化网络架构,该架构在保持NLNet准确性的同时显著降低了计算复杂度。进一步研究表明,该简化设计在结构上与挤压-激励网络(SENet)具有相似性,因此我们将二者统一到一个包含三个步骤的通用框架中,用于全局上下文建模。在此通用框架基础上,我们设计了一个更为优越的实例化模块,称为全局上下文(GC)块,该模块具有轻量化特性且能够有效建模全局上下文信息。得益于其轻量化设计,我们可以将该模块应用于骨干网络的多个层级,从而构建全局上下文网络(GCNet)。实验结果表明,GCNet在多种识别任务的主要基准测试中均表现出优于简化NLNet和SENet的性能。相关代码与配置文件已发布于:https://github.com/xvjiarui/GCNet。

文章链接

论文地址:论文地址

代码地址:代码地址

参考代码:代码地址

基本原理

GC Block 详细介绍

全局上下文块(Global Context Block, GC Block)是Global Context Network(GCNet)的核心组件,设计用来高效捕获特征图中的全局依赖关系。它结合了非局部网络(NLNet)和挤压-激励网络(SENet)的优势,具体结构如下:

1. 上下文建模模块(Context Modeling Module)

这个模块的主要目的是聚合所有位置的特征形成全局上下文特征,具体步骤如下:

  • 输入特征图:假设输入特征图为 $X \in \mathbb{R}^{C \times H \times W}$,其中 $C$ 表示通道数,$H$ 和 $W$ 分别表示特征图的高度和宽度。
  • 空间维度压缩:通过全局平均池化操作将空间维度压缩为单个向量,得到全局上下文特征 $z \in \mathbb{R}^C$:
    $$ z = \frac{1}{H \times W} \sum_{i=1}^H \sum_{j=1}^W X_{ij} $$
  • 注意力权重计算:使用一个全连接层或1x1卷积层,将全局上下文特征变换为注意力权重 $W_z \in \mathbb{R}^{C}$:
    $$ W_z = \sigma(W_1 z) $$
    其中,$W_1$ 是可学习的权重矩阵,$\sigma$ 是激活函数(通常为softmax)。

2. 特征变换模块(Feature Transform Module)

这个模块用于捕获特征图中通道之间的依赖关系:

  • 瓶颈变换:使用两层1x1卷积和ReLU激活函数,进行瓶颈变换以减少计算复杂度:
    $$ y = W_2 (\delta(W_1 X)) $$
    其中,$W_1$ 和 $W_2$ 是可学习的权重矩阵,$\delta$ 是ReLU激活函数。

3. 特征融合模块(Feature Fusion Module)

这个模块的目的是将全局上下文特征融合到每个查询位置的特征中:

  • 特征融合:通过加法操作,将全局上下文特征 $z$ 融合到每个位置的特征 $X_{ij}$ 中,得到增强的特征图 $Y \in \mathbb{R}^{C \times H \times W}$:
    $$ Y_{ij} = X_{ij} + z $$

GC Block 流程总结

  1. 输入特征图:$X \in \mathbb{R}^{C \times H \times W}$。
  2. 全局上下文建模:通过全局平均池化和全连接层计算全局上下文特征 $z$。
  3. 特征变换:使用瓶颈变换模块对特征图进行变换。
  4. 特征融合:将全局上下文特征 $z$ 融合到每个位置的特征 $X_{ij}$ 中。

总结

GC Block 通过上下文建模、特征变换和特征融合三个模块,高效地捕获并利用图像中的全局上下文信息。这种设计不仅显著提高了模型在各种视觉识别任务中的性能,还保持了较低的计算成本和内存消耗。因此,GC Block 在实际应用中具有很高的实用价值。

核心代码

import torch
from mmcv.cnn import constant_init, kaiming_init
from torch import nndef last_zero_init(m):if isinstance(m, nn.Sequential):constant_init(m[-1], val=0)else:constant_init(m, val=0)class ContextBlock(nn.Module):def __init__(self,inplanes,ratio,pooling_type='att',fusion_types=('channel_add', )):super(ContextBlock, self).__init__()assert pooling_type in ['avg', 'att']assert isinstance(fusion_types, (list, tuple))valid_fusion_types = ['channel_add', 'channel_mul']assert all([f in valid_fusion_types for f in fusion_types])assert len(fusion_types) > 0, 'at least one fusion should be used'self.inplanes = inplanesself.ratio = ratioself.planes = int(inplanes * ratio)self.pooling_type = pooling_typeself.fusion_types = fusion_typesif pooling_type == 'att':self.conv_mask = nn.Conv2d(inplanes, 1, kernel_size=1)self.softmax = nn.Softmax(dim=2)else:self.avg_pool = nn.AdaptiveAvgPool2d(1)if 'channel_add' in fusion_types:self.channel_add_conv = nn.Sequential(nn.Conv2d(self.inplanes, self.planes, kernel_size=1),nn.LayerNorm([self.planes, 1, 1]),nn.ReLU(inplace=True),  # yapf: disablenn.Conv2d(self.planes, self.inplanes, kernel_size=1))else:self.channel_add_conv = Noneif 'channel_mul' in fusion_types:self.channel_mul_conv = nn.Sequential(nn.Conv2d(self.inplanes, self.planes, kernel_size=1),nn.LayerNorm([self.planes, 1, 1]),nn.ReLU(inplace=True),  # yapf: disablenn.Conv2d(self.planes, self.inplanes, kernel_size=1))else:self.channel_mul_conv = Noneself.reset_parameters()def reset_parameters(self):if self.pooling_type == 'att':kaiming_init(self.conv_mask, mode='fan_in')self.conv_mask.inited = Trueif self.channel_add_conv is not None:last_zero_init(self.channel_add_conv)if self.channel_mul_conv is not None:last_zero_init(self.channel_mul_conv)def spatial_pool(self, x):batch, channel, height, width = x.size()if self.pooling_type == 'att':input_x = x# [N, C, H * W]input_x = input_x.view(batch, channel, height * width)# [N, 1, C, H * W]input_x = input_x.unsqueeze(1)# [N, 1, H, W]context_mask = self.conv_mask(x)# [N, 1, H * W]context_mask = context_mask.view(batch, 1, height * width)# [N, 1, H * W]context_mask = self.softmax(context_mask)# [N, 1, H * W, 1]context_mask = context_mask.unsqueeze(-1)# [N, 1, C, 1]context = torch.matmul(input_x, context_mask)# [N, C, 1, 1]context = context.view(batch, channel, 1, 1)else:# [N, C, 1, 1]context = self.avg_pool(x)return contextdef forward(self, x):# [N, C, 1, 1]context = self.spatial_pool(x)out = xif self.channel_mul_conv is not None:# [N, C, 1, 1]channel_mul_term = torch.sigmoid(self.channel_mul_conv(context))out = out * channel_mul_termif self.channel_add_conv is not None:# [N, C, 1, 1]channel_add_term = self.channel_add_conv(context)out = out + channel_add_termreturn out

实验

脚本

import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLOif __name__ == '__main__':
#     修改为自己的配置文件地址model = YOLO('/root/ultralytics-main/ultralytics/cfg/models/11/yolov11-GCBlock.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='GCBlock',)

结果

image-20241028223541143

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

相关文章:

  • 35岁程序员的AI转型之路:年薪翻倍,收藏这份从零到架构师的详细指南
  • 别再手动改ONNX文件了!用torch.onnx.export正确设置动态Batch和分辨率
  • 零基础学Python第二天
  • 别再只点保存了!QGIS工程文件.QGZ和.QGS到底怎么选?附XML结构详解
  • 【MATLAB源码-第436期】基于MATLAB的FDMA、OFDMA与SC-FDMA仿真,对比频谱 PAPR 星座图。
  • 别再死记硬背公式了!用C++向量叉积5分钟搞定三角形面积计算(附OpenJudge真题解析)
  • 2026柱式测力传感器十大品牌有哪些,广东犸力铸就行业高端标杆 - 品牌速递
  • 先有《第一大道》,后有《凰标》:海棠山铁哥宇宙的完整拼图@凤凰标志
  • 收藏!小白程序员快速入门大模型:多模态LLMs学习指南
  • ComfyUI-Impact-Pack V8:专业级图像增强与语义分割的终极解决方案
  • 戴尔G15终极散热解决方案:TCC-G15完整使用指南
  • 论文降AI率攻略:从80%降到合格的5步路径+工具选择完整指南!
  • 告别臃肿库!在STM32上手动封装MQTT协议帧与JSON数据(附完整C代码)
  • YOLOv11 改进 - 注意力机制 HAT混合注意力变换器:超分重建能力迁移,提升小目标特征清晰度与检测精度
  • 如何从微信聊天记录中挖掘个人数据价值:WeChatMsg完全指南
  • 重温DIRE:走向通用人工智能生成的图像检测
  • WindowsCleaner终极指南:3步彻底解决Windows系统卡顿与C盘爆红问题
  • 清华PPT模板:让专业演示变得如此简单的终极方案
  • 中国开源软件的崛起与困境:贡献者生态的建立之难
  • 零基础友好:大白话拆解 YOLOv11,像素变检测框底层逻辑一遍过
  • 保姆级教程:在Ubuntu 22.04上从源码编译DPDK TestPMD并跑通第一个包转发测试
  • 40_《智能体微服务架构企业级实战教程》智能助手主应用服务之工具类封装
  • 别再死记硬背CTL公式了!用UPPAAL模拟器手把手带你理解A[]和E<>的区别
  • 上线AI问答、视频简历、个性化匹配——南京这家老牌家教网最近悄悄做了升级获得家长推荐口碑 - 教育资讯板
  • MATLAB计时函数背后的秘密:从tic/toc到cputime,带你深入理解计算机时间测量原理
  • YOLOv11 改进 - 注意力机制 EffectiveSE 高效挤压激励模块:单全连接层设计破解信息丢失难题,增强通道特征表征
  • Gorm 入门笔记(Go 操作 MySQL 必学)
  • 论文AI率太高怎么救?答辩前1周降AI率完整攻略+不延期方案!
  • 基于遗传算法与Matlab-XFOIL接口的翼型气动外形自动化寻优
  • YOLOv11 改进 - 注意力机制 Gather-Excite 聚集-激发注意力:空间上下文聚合与重校准优化多尺度目标检测