YOLO11改进|注意力机制篇|引入上下文锚注意力机制CAA

在这里插入图片描述

目录

    • 一、【CAA】注意力机制
      • 1.1【CAA】注意力介绍
      • 1.2【CAA】核心代码
    • 二、添加【CAA】注意力机制
      • 2.1STEP1
      • 2.2STEP2
      • 2.3STEP3
      • 2.4STEP4
    • 三、yaml文件与运行
      • 3.1yaml文件
      • 3.2运行成功截图

一、【CAA】注意力机制

1.1【CAA】注意力介绍

在这里插入图片描述

CAA注意力机制的结构图如下,下面根据其结构分析处理过程与优势

  • 处理过程

  • 输入:CAA模块接收来自上一个阶段的特征图 𝑋𝑙−1,𝑛(2),并将其进行处理。图中显示了如果 𝑛=0,则输入是 𝑋𝑙−1,𝑛(2),而如果 𝑛≠0,输入将会是分割后沿通道维度的特征。

  • 池化层 (AvgPool):首先,特征图通过一个全局平均池化层
    AvgPool,其作用是通过全局空间信息来减少特征图的空间维度,这能够提取出全局上下文信息。

  • 1x1卷积 (Conv 1x1):池化后的特征图通过1x1卷积层。1x1卷积通常用于降维或融合特征,它可以改变通道数量并用于生成空间相关性。

  • 深度可分离卷积 (DWConv):模块使用了 (11+2𝑛)×1和 1×(11+2𝑛)的深度可分离卷积 (Depthwise Convolution, DWConv)。这种卷积操作是一种计算量较少的卷积方法,它能够保留每个通道的特征,同时减少参数量。11+2n 的内核大小表明随着网络层的加深,卷积的感受野会增大,逐步捕捉更大的上下文信息。

  • Sigmoid激活函数:卷积操作后的特征图经过Sigmoid激活函数,将结果限制在0到1之间,用于生成特征图的注意力权重。

  • 输出:最终,生成的注意力图 𝐴𝑙−1,𝑛 将与特征图进行加权融合,调整不同区域的重要性,输出调整后的特征图。

  • 优势

  • 跨层特征融合:CAA模块通过池化、卷积和Sigmoid等操作,生成了一个加权注意力图,使得特征图中的不同区域能够根据其全局上下文信息进行加权,从而对不同重要性的特征进行选择性加强或抑制。

  • 增强感受野:通过 11+2𝑛大小的卷积核,CAA模块能够有效扩大卷积操作的感受野,从而捕捉更大范围的上下文信息。这种特性使得它在处理包含大量局部与全局信息的任务中表现良好。

  • 计算效率:使用深度可分离卷积(DWConv)代替传统的标准卷积,大幅减少了计算复杂度和参数量,同时保持了良好的特征提取能力。通过将卷积操作分解为深度卷积和点卷积,这种方式能够在较低的计算成本下获得较大的感受野和丰富的特征表达能力。

  • 灵活的通道操作:CAA模块使用了多个卷积层和通道级的操作,这有助于模型在不同层次上对特征进行调整,从而增加模型在通道维度上的表达能力。

在这里插入图片描述

1.2【CAA】核心代码

import torch.nn as nn
import torchdef autopad(k, p=None, d=1):  # kernel, padding, dilation"""Pad to 'same' shape outputs."""if d > 1:k = d * (k - 1) + 1 if isinstance(k, int) else [d * (x - 1) + 1 for x in k]  # actual kernel-sizeif p is None:p = k // 2 if isinstance(k, int) else [x // 2 for x in k]  # auto-padreturn pclass Conv(nn.Module):"""Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)."""default_act = nn.SiLU()  # default activationdef __init__(self, c1, c2, k=1, s=1, p=None, g=1, d=1, act=True):"""Initialize Conv layer with given arguments including activation."""super().__init__()self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groups=g, dilation=d, bias=False)self.bn = nn.BatchNorm2d(c2)self.act = self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity()def forward(self, x):"""Apply convolution, batch normalization and activation to input tensor."""return self.act(self.bn(self.conv(x)))def forward_fuse(self, x):"""Perform transposed convolution of 2D data."""return self.act(self.conv(x))class CAA(nn.Module):def __init__(self, ch, h_kernel_size=11, v_kernel_size=11) -> None:super().__init__()self.avg_pool = nn.AvgPool2d(7, 1, 3)self.conv1 = Conv(ch, ch)self.h_conv = nn.Conv2d(ch, ch, (1, h_kernel_size), 1, (0, h_kernel_size // 2), 1, ch)self.v_conv = nn.Conv2d(ch, ch, (v_kernel_size, 1), 1, (v_kernel_size // 2, 0), 1, ch)self.conv2 = Conv(ch, ch)self.act = nn.Sigmoid()def forward(self, x):attn_factor = self.act(self.conv2(self.v_conv(self.h_conv(self.conv1(self.avg_pool(x))))))return attn_factor * xclass Bottleneck(nn.Module):"""Standard bottleneck."""def __init__(self, c1, c2, shortcut=True, g=1, k=(3, 3), e=0.5):"""Initializes a bottleneck module with given input/output channels, shortcut option, group, kernels, andexpansion."""super().__init__()c_ = int(c2 * e)  # hidden channelsself.cv1 = Conv(c1, c_, k[0], 1)self.cv2 = Conv(c_, c2, k[1], 1, g=g)self.add = shortcut and c1 == c2def forward(self, x):"""'forward()' applies the YOLO FPN to input data."""return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))class C2f_CAA(nn.Module):"""CSP Bottleneck with 2 convolutions followed by CAA attention."""def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):"""Initialize CSP bottleneck layer with two convolutions with CAA attention."""super().__init__()self.c = int(c2 * e)  # hidden channelsself.cv1 = Conv(c1, 2 * self.c, 1, 1)self.cv2 = Conv((2 + n) * self.c, c2, 1)  # optional act=FReLU(c2)self.m = nn.ModuleList(Bottleneck(self.c, self.c, shortcut, g, k=((3, 3), (3, 3)), e=1.0) for _ in range(n))self.caa = CAA(c2)def forward(self, x):"""Forward pass through C2f layer followed by CAA attention."""y = list(self.cv1(x).chunk(2, 1))y.extend(m(y[-1]) for m in self.m)out = self.cv2(torch.cat(y, 1))return self.caa(out)def forward_split(self, x):"""Forward pass using split() instead of chunk() followed by CAA attention."""y = list(self.cv1(x).split((self.c, self.c), 1))y.extend(m(y[-1]) for m in self.m)out = self.cv2(torch.cat(y, 1))return self.caa(out)

二、添加【CAA】注意力机制

2.1STEP1

首先找到ultralytics/nn文件路径下新建一个Add-module的python文件包【这里注意一定是python文件包,新建后会自动生成_init_.py】,如果已经跟着我的教程建立过一次了可以省略此步骤,随后新建一个CAA.py文件并将上文中提到的注意力机制的代码全部粘贴到此文件中,如下图所示在这里插入图片描述

2.2STEP2

在STEP1中新建的_init_.py文件中导入增加改进模块的代码包如下图所示在这里插入图片描述

2.3STEP3

找到ultralytics/nn文件夹中的task.py文件,在其中按照下图添加在这里插入图片描述

2.4STEP4

定位到ultralytics/nn文件夹中的task.py文件中的def parse_model(d, ch, verbose=True): # model_dict, input_channels(3)函数添加如图代码,【如果不好定位可以直接ctrl+f搜索定位】

在这里插入图片描述

三、yaml文件与运行

3.1yaml文件

以下是添加【CAA】注意力机制在小目标检测中的yaml文件,大家可以注释自行调节,效果以自己的数据集结果为准

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLO11 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolo11n.yaml' will call yolo11.yaml with scale 'n'# [depth, width, max_channels]n: [0.50, 0.25, 1024] # summary: 319 layers, 2624080 parameters, 2624064 gradients, 6.6 GFLOPss: [0.50, 0.50, 1024] # summary: 319 layers, 9458752 parameters, 9458736 gradients, 21.7 GFLOPsm: [0.50, 1.00, 512] # summary: 409 layers, 20114688 parameters, 20114672 gradients, 68.5 GFLOPsl: [1.00, 1.00, 512] # summary: 631 layers, 25372160 parameters, 25372144 gradients, 87.6 GFLOPsx: [1.00, 1.50, 512] # summary: 631 layers, 56966176 parameters, 56966160 gradients, 196.0 GFLOPs# YOLO11n backbone
backbone:# [from, repeats, module, args]- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4- [-1, 2, C3k2, [256, False, 0.25]]- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8- [-1, 2, C3k2, [512, False, 0.25]]- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16- [-1, 2, C3k2, [512, True]]- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32- [-1, 2, C3k2, [1024, True]]- [-1, 1, SPPF, [1024, 5]] # 9- [-1, 2, C2PSA, [1024]] # 10# YOLO11n head
head:- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 6], 1, Concat, [1]] # cat backbone P4- [-1, 2, C3k2, [512, False]] # 13- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 2, C3k2, [256, False]] # 16 (P3/8-small)- [-1,1,CAA,[]]- [-1, 1, Conv, [256, 3, 2]]- [[-1, 13], 1, Concat, [1]] # cat head P4- [-1, 2, C3k2, [512, False]] # 19 (P4/16-medium)- [-1, 1, Conv, [512, 3, 2]]- [[-1, 10], 1, Concat, [1]] # cat head P5- [-1, 2, C3k2, [1024, True]] # 22 (P5/32-large)- [[17, 20, 23], 1, Detect, [nc]] # Detect(P3, P4, P5)

以上添加位置仅供参考,具体添加位置以及模块效果以自己的数据集结果为准 ,同时不使用C2f_CAA的原因是,YOLO11主要创新点就是这个注意力机制所以大家还是不要替换的好

3.2运行成功截图

在这里插入图片描述

OK 以上就是添加【CAA】注意力机制的全部过程了,后续将持续更新尽情期待

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/55486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RAG:检索增强生成技术概览

Why 将大模型应用于实际业务场景时会发现,通用的基础大模型基本无法满足我们的实际业务需求,主要有以下几方面原因: 知识的局限性:大模型对于一些实时性的、非公开的或离线的数据是无法获取到的。幻觉问题:所有的AI模…

828华为云征文 | 利用FIO工具测试Flexus云服务器X实例存储性能

目录 一、Flexus云服务器X实例概要 1.1 Flexus云服务器X实例摘要 1.2 产品特点 1.3 存储方面性能 1.4 测评服务器规格 二、FIO工具 2.1 安装部署FIO 2.2 主要性能指标概要 三、进行压测 3.1 测试全盘随机读IO延迟 3.2 测试全盘随机写IO延迟 3.3 测试随机读IOPS 3.4…

KEYENCE Programming Contest 2024(AtCoder Beginner Contest 374) 题解

A - Takahashi san 2 Problem Statement KEYENCE has a culture of addressing everyone with the suffix “-san,” regardless of roles, age, or positions. You are given a string S consisting of lowercase English letters. If S ends with san, print Yes; otherwi…

R包:ggheatmap热图

加载R包 # devtools::install_github("XiaoLuo-boy/ggheatmap")library(ggheatmap) library(tidyr)数据 set.seed(123) df <- matrix(runif(225,0,10),ncol 15) colnames(df) <- paste("sample",1:15,sep "") rownames(df) <- sapp…

云中红队系列 | 使用 Azure FrontDoor 混淆 C2 基础设施

重定向器是充当 C2 服务器和目标网络之间中间人的服务器。其主要功能是重定向 C2 和受感染目标之间的所有通信。重定向器通常用于隐藏 C2 服务器流量的来源&#xff0c;使防御者更难以检测和阻止 C2 基础设施。 基于云的重定向器提供了一个很好的机会&#xff0c;通过内容分发…

安卓使用memtester进行内存压力测试

memteser简介 memtester 是一个用于测试内存可靠性的工具。 它可以对计算机的内存进行压力测试&#xff0c;以检测内存中的错误&#xff0c;例如位翻转、随机存取错误等。memtester 可以在不同的操作系统上运行&#xff0c;并且可以针对不同大小的内存进行测试。 下载源码 m…

[单master节点k8s部署]29.Istio流量管理(五)

测试istio熔断管理。 采用httpbin镜像和fortio镜像&#xff0c;其中httpbin作为服务端&#xff0c;fortio是请求端。这两个的配置yaml文件都在istio的samples/httpbin目录下&#xff0c;fortio的配置文件在samples-client目录下。 [rootmaster httpbin]# ls gateway-api ht…

微服务(Microservices),服务网格(Service Mesh)以及无服务器运算Serverless简单介绍

文章目录 什么是微服务?一、定义与特点二、优势三、组件与架构四、应用场景五、挑战与解决方案什么是服务网格?一、定义与特点二、核心组件三、主要功能四、实现工具五、应用场景六、优势与挑战什么是Serverless?一、定义与特点二、主要领域三、优势四、应用场景五、挑战三者…

C++项目工程代码自动检查

引言 在现代软件开发中&#xff0c;代码质量是成功的关键。特别是在C项目中&#xff0c;开发人员面临着复杂的代码管理和维护挑战。随着技术的不断进步&#xff0c;代码自动检查工具已成为提高代码质量、减少错误和提升开发效率的有效手段。本文将深入探讨C项目中的代码自动检…

国外电商系统开发-运维系统执行设备属性

为了方便使用&#xff0c;开发了双击网络设备图标&#xff0c;就进入交互式命令终端&#xff0c;在这里您可以执行如cd&#xff0c;top&#xff0c;ping这样的交互命令&#xff0c;但仍然不支持部分交互命令&#xff0c;比如vim等。 您可以双击设备图标&#xff0c;或者是右键&…

如何从计算机的硬盘中恢复照片 - 成功

如何从计算机硬盘恢复图片&#xff1f; 与所有电子和机械设备一样&#xff0c;硬盘驱动器也可能由于任何原因而死机。如果您的系统硬盘驱动器已停止工作或在启动系统时听到振动声&#xff0c;则它有可能已死机。如果是这样的话&#xff0c;上面的数据呢&#xff1f; 不要惊慌…

解决Vue应用中遇到路由刷新后出现 404 错误

解释&#xff1a; Vue 应用中遇到路由刷新后出现 404 错误&#xff0c;通常是因为 Vue 应用是个单页应用&#xff08;SPA&#xff09;&#xff0c;它通过 Vue Router 管理路由&#xff0c;通过 HTML5 History Mode 实现页面导航无需重新加载页面。当直接访问非首页的路由或者刷…

Python使用matplotlib绘制图形大全(曲线图、条形图、饼图等)

matplotlib 的主要组成部分是 pyplot&#xff0c;它是一个类似于 MATLAB 的绘图框架。pyplot 提供了一个 MATLAB 式的接口&#xff0c;可以隐式地创建图形和轴&#xff0c;使得绘图变得简单。 以下是一个简单的 matplotlib 使用示例&#xff0c;用于绘制一条简单的折线图&…

高考选择在何方?揭秘空军、海军、民航三大招飞神秘机遇

空军招飞、海军招飞和民航招飞在全国普通高校招生体系中举足轻重&#xff0c;为国家培育众多优秀飞行人才。 空军招飞在国家多部门领导下&#xff0c;由空军与相关省&#xff08;区&#xff09;教育、公安部门组织实施&#xff0c;设有七个招飞中心。自 1987 年空军自主招飞以来…

28 基于51单片机的两路电压检测(ADC0808)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;通过ADC0808获取两路电压&#xff0c;通过LCD1602显示 二、硬件资源 基于KEIL5编写C代码&#xff0c;PROTEUS8.15进行仿真&#xff0c;全部资源在页尾&#xff0c;提供…

springboot中配置优先级

先来看在idea当中运行程序时&#xff0c;如何来指定Java系统属性和命令行参数。 系统属性 1、右键启动类&#xff0c;点击Edit Configuration 点击Modify options 选择Add VM options&#xff0c;就是系统属性 选择Program arguements&#xff0c;就是命令行参数 总结&#…

WPF入门教学二十二 多线程与异步编程

在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;多线程和异步编程是非常重要的概念&#xff0c;因为它们可以帮助你创建响应性更好的应用程序。WPF的UI线程负责处理所有的用户界面操作&#xff0c;如果你的代码在UI线程上执行耗时操作&#xff0c…

OpenAI 开发者大会!实时语音功能有API了,GPT-4o支持多模态微调,上下文cache功能上线

家人们&#xff01;十一假期第1天&#xff0c; OpenAI一年一度的开发者大会又来了惹&#xff01;今年的开发者大会分成三部分分别在美国、英国、新加坡三个地点举办&#xff0c;刚刚结束的是第一场。 去年的OpenAI开发者大会公布了GPT-4 Turbo和GPTs&#xff0c;今年没有大更新…

win10不想被强制更新win11怎么办?

还有一种办法是可以去联想官网下载一个工具&#xff0c;确实可行但是不能访问联想商店了&#xff0c;不过会限制一些微软游戏&#xff0c;比如我喜欢的腐烂国度2&#xff0c;所以我选择了这一种方式&#xff0c;亲测可行

国创——VR虚拟陪伴

VR虚拟陪伴 1.技术基础&#xff1a;利用VR技术创建虚拟人物&#xff0c;实现与用户的互动。 2.功能实现&#xff1a;在用户等待就诊或无聊时&#xff0c;可以启动VR虚拟陪伴功能&#xff0c;与虚拟人物进行聊天、唱歌等互动&#xff0c;缓解用户的紧张情绪。 3.创新点&#…