Yolov8改进 C2f中添加注意力机制Attention 包括SE、CA、CBAM、MHSA等)具体实现代码,如何将这些模块集成到YOLOv8模型中

article/2025/6/17 17:51:03

Yolov8改进 C2f中添加注意力机制代码 包括SE、CA、CBAM、MHSA等)的具体实现代码,以及如何将这些模块集成到YOLOv8模型中的示例。在这里插入图片描述

文章目录

      • 1. **Channel Attention (CA)**
      • 2. **Spatial Attention (SA)**
      • 3. **CBAM (Convolutional Block Attention Module)**
      • 4. **SE (Squeeze and Excitation)**
      • 5. **MHSA (Multi-Head Self-Attention)**
      • 6. **Triplet Attention**
      • 2. **Channel Attention (CA) 模块**
      • 3. **CBAM (Convolutional Block Attention Module)**
      • 4. **MHSA (Multi-Head Self-Attention)**
      • 集成到C2f模块中
      • 将其集成到YOLOv8模型中

在这里插入图片描述

为了在YOLOv8的C2f模块中添加不同的注意力机制,我们需要定义这些注意力机制并在C2f模块中集成它。以下是具体的代码实现:

文章代码仅供参考。

1. Channel Attention (CA)

import torch
import torch.nn as nnclass ChannelAttention(nn.Module):def __init__(self, in_channels, reduction=16):super(ChannelAttention, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.fc = nn.Sequential(nn.Linear(in_channels, in_channels // reduction, bias=False),nn.ReLU(inplace=True),nn.Linear(in_channels // reduction, in_channels, bias=False),nn.Sigmoid())def forward(self, x):b, c, _, _ = x.size()y = self.avg_pool(x).view(b, c)y = self.fc(y).view(b, c, 1, 1)return x * y.expand_as(x)class C2f_CA(nn.Module):def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):super(C2f_CA, self).__init__()c_ = int(c2 * e)  # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = Conv(c1, c_, 1, 1)self.cv3 = Conv(2 * c_, c2, 1, 1)self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])self.ca = ChannelAttention(c2)def forward(self, x):return self.ca(self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), dim=1)))

2. Spatial Attention (SA)

class SpatialAttention(nn.Module):def __init__(self, kernel_size=7):super(SpatialAttention, self).__init__()assert kernel_size % 2 == 1, "Kernel size must be odd"self.conv = nn.Conv2d(2, 1, kernel_size, padding=kernel_size // 2, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):avg_out = torch.mean(x, dim=1, keepdim=True)max_out, _ = torch.max(x, dim=1, keepdim=True)x = torch.cat([avg_out, max_out], dim=1)x = self.conv(x)return x * self.sigmoid(x)class C2f_SA(nn.Module):def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):super(C2f_SA, self).__init__()c_ = int(c2 * e)  # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = Conv(c1, c_, 1, 1)self.cv3 = Conv(2 * c_, c2, 1, 1)self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])self.sa = SpatialAttention()def forward(self, x):return self.sa(self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), dim=1)))

3. CBAM (Convolutional Block Attention Module)

class CBAM(nn.Module):def __init__(self, in_channels, reduction=16, kernel_size=7):super(CBAM, self).__init__()self.ca = ChannelAttention(in_channels, reduction)self.sa = SpatialAttention(kernel_size)def forward(self, x):out = self.ca(x)out = self.sa(out)return outclass C2f_CBAM(nn.Module):def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):super(C2f_CBAM, self).__init__()c_ = int(c2 * e)  # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = Conv(c1, c_, 1, 1)self.cv3 = Conv(2 * c_, c2, 1, 1)self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])self.cbam = CBAM(c2)def forward(self, x):return self.cbam(self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), dim=1)))

4. SE (Squeeze and Excitation)

class SELayer(nn.Module):def __init__(self, channel, reduction=16):super(SELayer, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.fc = nn.Sequential(nn.Linear(channel, channel // reduction, bias=False),nn.ReLU(inplace=True),nn.Linear(channel // reduction, channel, bias=False),nn.Sigmoid())def forward(self, x):b, c, _, _ = x.size()y = self.avg_pool(x).view(b, c)y = self.fc(y).view(b, c, 1, 1)return x * y.expand_as(x)class C2f_SE(nn.Module):def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):super(C2f_SE, self).__init__()c_ = int(c2 * e)  # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = Conv(c1, c_, 1, 1)self.cv3 = Conv(2 * c_, c2, 1, 1)self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])self.se = SELayer(c2)def forward(self, x):return self.se(self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), dim=1)))

在这里插入图片描述

5. MHSA (Multi-Head Self-Attention)

class MHSA(nn.Module):def __init__(self, in_channels, num_heads=8):super(MHSA, self).__init__()self.num_heads = num_headsself.head_dim = in_channels // num_headsself.qkv = nn.Linear(in_channels, in_channels * 3, bias=False)self.out_proj = nn.Linear(in_channels, in_channels)def forward(self, x):B, C, H, W = x.shapeqkv = self.qkv(x.flatten(start_dim=2)).reshape(B, 3, self.num_heads, -1, self.head_dim)q, k, v = qkv.unbind(1)attn = (q @ k.transpose(-2, -1)) / (self.head_dim ** 0.5)attn = attn.softmax(dim=-1)x = (attn @ v).transpose(1, 2).reshape(B, C, H, W)return self.out_proj(x)class C2f_MHSA(nn.Module):def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):super(C2f_MHSA, self).__init__()c_ = int(c2 * e)  # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = Conv(c1, c_, 1, 1)self.cv3 = Conv(2 * c_, c2, 1, 1)self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])self.mhsa = MHSA(c2)def forward(self, x):return self.mhsa(self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), dim=1)))

6. Triplet Attention

class TripletAttention(nn.Module):def __init__(self, in_channels, reduction=16):super(TripletAttention, self).__init__()self.channel_attention = ChannelAttention(in_channels, reduction)self.spatial_attention = SpatialAttention()self.depth_attention = DepthwiseAttention(in_channels)def forward(self, x):ca = self.channel_attention(x)sa = self.spatial_attention(x)da = self.depth_attention(x)return x * (ca + sa + da)class DepthwiseAttention(nn.Module):def __init__(self, in_channels):super(DepthwiseAttention, self).__init__()self.dw_conv = nn.Conv2d(in_channels, in_channels, kernel_size=3, padding=1, groups=in_channels)self.bn = nn.BatchNorm2d(in_channels)self.relu = nn.ReLU(inplace=True)def forward(self, x):
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ea8395a575b644609e39e3ff1cc30825.png)C2f中添加注意力机制代码
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a35502617f7b43bba8a5254c2c4ab047.png)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4234888562824128840acdf41853a062.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a040f849b5c34cdc9fb3d1418711a3fd.png)
当然可以。以下是针对YOLOv8的C2f模块中添加注意力机制(包括SE、CA、CBAM、MHSA等)的具体实现代码,以及如何将这些模块集成到YOLOv8模型中的示例。### 1. **SE (Squeeze and Excitation) 模块**首先定义SE模块:```python
import torch
import torch.nn as nnclass SE(nn.Module):def __init__(self, c1, ratio=16):super(SE, self).__init__()self.avgpool = nn.AdaptiveAvgPool2d(1)self.fc1 = nn.Linear(c1, c1 // ratio, bias=False)self.relu = nn.ReLU(inplace=True)self.fc2 = nn.Linear(c1 // ratio, c1, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):b, c, _, _ = x.size()y = self.avgpool(x).view(b, c)y = self.fc1(y)y = self.relu(y)y = self.fc2(y)y = self.sigmoid(y)y = y.view(b, c, 1, 1)return x * y.expand_as(x)

2. Channel Attention (CA) 模块

接下来是通道注意力模块:

class ChannelAttention(nn.Module):def __init__(self, in_channels, reduction=16):super(ChannelAttention, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.fc = nn.Sequential(nn.Linear(in_channels, in_channels // reduction, bias=False),nn.ReLU(inplace=True),nn.Linear(in_channels // reduction, in_channels, bias=False),nn.Sigmoid())def forward(self, x):b, c, _, _ = x.size()y = self.avg_pool(x).view(b, c)y = self.fc(y).view(b, c, 1, 1)return x * y.expand_as(x)

3. CBAM (Convolutional Block Attention Module)

然后是CBAM模块,结合了通道和空间注意力:

class CBAM(nn.Module):def __init__(self, in_channels, reduction=16, kernel_size=7):super(CBAM, self).__init__()self.ca = ChannelAttention(in_channels, reduction)self.sa = SpatialAttention(kernel_size)def forward(self, x):out = self.ca(x)out = self.sa(out)return out

其中SpatialAttention的实现如下:

class SpatialAttention(nn.Module):def __init__(self, kernel_size=7):super(SpatialAttention, self).__init__()assert kernel_size % 2 == 1, "Kernel size must be odd"self.conv = nn.Conv2d(2, 1, kernel_size, padding=kernel_size // 2, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):avg_out = torch.mean(x, dim=1, keepdim=True)max_out, _ = torch.max(x, dim=1, keepdim=True)x = torch.cat([avg_out, max_out], dim=1)x = self.conv(x)return x * self.sigmoid(x)

4. MHSA (Multi-Head Self-Attention)

最后是多头自注意力机制:

class MHSA(nn.Module):def __init__(self, in_channels, num_heads=8):super(MHSA, self).__init__()self.num_heads = num_headsself.head_dim = in_channels // num_headsself.qkv = nn.Linear(in_channels, in_channels * 3, bias=False)self.out_proj = nn.Linear(in_channels, in_channels)def forward(self, x):B, C, H, W = x.shapeqkv = self.qkv(x.flatten(start_dim=2)).reshape(B, 3, self.num_heads, -1, self.head_dim)q, k, v = qkv.unbind(1)attn = (q @ k.transpose(-2, -1)) / (self.head_dim ** 0.5)attn = attn.softmax(dim=-1)x = (attn @ v).transpose(1, 2).reshape(B, C, H, W)return self.out_proj(x)

集成到C2f模块中

这里是如何在C2f模块中集成这些注意力机制的一个例子:

class C2f_SE(nn.Module):def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):super(C2f_SE, self).__init__()c_ = int(c2 * e)  # 隐藏层通道数self.cv1 = nn.Conv2d(c1, c_, 1, 1)self.cv2 = nn.Conv2d(c1, c_, 1, 1)self.cv3 = nn.Conv2d(2 * c_, c2, 1, 1)self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])self.se = SE(c2)def forward(self, x):return self.se(self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), dim=1)))

你可以在上述代码的基础上,根据需要替换或增加其他注意力机制模块(如ChannelAttention, CBAM, MHSA等),只需修改self.se为对应的注意力模块即可。

将其集成到YOLOv8模型中

要在YOLOv8模型中使用这个带有注意力机制的C2f模块,你需要在相应的网络架构文件中替换原有的C2f模块为新的实现。例如,在你的模型初始化部分,你可以这样使用:

class YOLOv8(nn.Module):def __init__(self):super(YOLOv8, self).__init__()self.c2f_se = C2f_SE(c1=64, c2=128, n=1)  # 根据实际情况调整参数def forward(self, x):x = self.c2f_se(x)# 其他层...return x

请根据你的具体需求和模型结构进行适当的调整。希望这些代码能帮助你在YOLOv8模型中成功添加注意力机制。


http://www.hkcw.cn/article/LLppjEWRuJ.shtml

相关文章

Python:操作Excel公式

💻Python 操作 Excel 公式实战教程(含 openpyxl、xlwings 全解析 + 常用公式大全) 在日常的数据分析与自动化报表场景中,借助 Python 操作 Excel 文件能极大提高效率。尤其是在批量生成、写入与读取 Excel 公式方面,Python 提供了多个强大库支持。 📚一、主流库对比:选…

tomcat服务器以及接受请求参数的方式

1.javaee:意为java企业版,指java企业级开发的规范总和,包含13项技术规范 2.事实上服务器和客户端进行交互的过程中,有一个前端控制器在中间运作,这个控制器为DispatcherServlet,它负责将客户端请求的信息包…

AI文档排版工具永久免费

🚀 快速开始 1. 启动程序 双击 AI文档排版工具.exe 启动程序 下载地址:https://pan.quark.cn/s/1ce59c96040f 2. 首次配置 首次使用需要配置API信息点击"⚙️ API配置"按钮输入API地址和密钥点击"测试连接"验证 3. 开始排版 …

C语言 — 自定义类型(结构体,联合体,枚举)

目录 1.结构体1.1 结构体类型的声明1.2 结构体变量的创建和初始化1.3 结构体成员的使用1.4 结构体的大小1.4.1 计算以下结构体的大小1.4.2 计算以下结构体的大小1.4.3 结构体中嵌套结构体的大小计算 1.5 位段1.5.1 使用位段计算结构体大小1.5.2 位段的缺陷 2.联合体2.1 联合体的…

【CATIA的二次开发16】根对象Application涉及撤销和重做事务管理相关方法

在CATIA VBA开发中,对根对象Application涉及撤销和重做事务管理相关方法进行详细总结,并且用不同形式展示出来。供大家后续开发全面了解Application对象的方法,以便在开发过程中快速查找和使用: 一、Application常用方法分类 1、基础控制与进程管理(3个方法) 方法名功能…

基于 Intel CNVi 接口 WIFI 产品介绍

CNVi是什么?CNVi(Connectivity Integration),CNVi 即英特尔集成连接 I/O 接口,是英特尔专为 Wi-Fi 和蓝牙无线设备设计的一种连接架构。 架构原理: 在 CNVi 架构下,网络适配器中通常较大且昂贵…

【笔记】开源通用人工智能代理 Suna 部署全流程准备清单(Windows 系统)

#工作记录 一、基础工具与环境 开发工具 Git 或 GitHub Desktop(代码管理)Docker Desktop(需启用 WSL2,容器化部署)Python 3.11(推荐版本,需添加到系统环境变量)Node.js LTS&#xf…

零基础SEO优化操作全解析

内容概要 对于零基础的新手而言,SEO优化的系统性操作流程是入门的关键。本文以7个核心步骤为主线,从基础概念到实战应用,拆解搜索排名提升的核心逻辑。首先聚焦关键词挖掘的底层逻辑与工具实操,帮助建立精准的内容方向&#xff1…

【手搓一个原生全局loading组件解决页面闪烁问题】

页面闪烁效果1 页面闪烁效果2 封装一个全局loading组件 class GlobalLoading extends HTMLElement {constructor() {super();this.attachShadow({ mode: open });}connectedCallback() {this.render();this.init();}render() {this.shadowRoot.innerHTML <style>.load…

MYSQL:主从复制原理及简单实现

概述 概念 主从复制&#xff1a;指一台服务器充当主数据库服务器&#xff0c;另一台或多台服务器充当从数据库服务器&#xff0c;主服务器中的数据自动复制到从服务器之中 基础是主服务器对数据库修改记录二进制日志&#xff0c;从服务器通过主服务器的二进制日志自动执行更…

11.4java语言执行浅析4

编译成字节码&#xff08;.class 文件&#xff09; 使用 javac 命令将源代码编译为 Java 字节码&#xff08;bytecode&#xff09; 它不是机器码&#xff0c;而是 JVM 能理解的中间语言&#xff08;字节码&#xff09;&#xff0c;具有平台无关性。 编译过程简要&#xff1…

Luminar Neo:摄影室灯光

在专业人像摄影中&#xff0c;打光始终是一门核心技术。但对于多数摄影师而言&#xff0c;搭建真正的摄影棚既耗时又昂贵。Luminar Neo 推出的创新工具“摄影室灯光”&#xff08;Studio Light&#xff0c;也称“摄影棚光线”&#xff09;&#xff0c;正是为了解决这一难题而生…

机器学习知识图谱——NN全连接神经网络算法

目录 一、图解全连接神经网络(NN)算法知识图谱 二、什么是全连接神经网络(NN)? 三、网络结构 四、神经元计算公式 五、激活函数常用类型 六、前向传播 + 反向传播 七、训练流程图示 八、优点 九、缺点 十、Python 示例代码 (使用 PyTorch) 十一、应用领域 机…

DFS入门刷题

目录 P1683 入门 P1596 [USACO10OCT] Lake Counting S 1114. 棋盘问题 P1025 [NOIP 2001 提高组] 数的划分 P1683 入门 #include <iostream> using namespace std; char a[30][30]; bool vis[30][30]; int res 1; int n, m; int dx[] {-1, 1, 0, 0}; int dy[] {0,…

如何在 Ubuntu22.04 上安装并开始使用 RabbitMQ

单体架构学的差不多了&#xff0c;可以朝着微服务进军了&#xff0c;笔者打算实操一下 RabbitMQ&#xff08;这个和 Redis 一样重要的组件) 笔者这里采用的是本地 wsl2 的 Ubuntu22.04 先按指定的博客进行前置操作 Ubuntu22.04 安装 RabbitMQ 解决 ARM Ubuntu 22.04 缺少 libs…

歼-10CE火出圈,不愧是猛龙!

歼-10CE火出圈,不愧是猛龙!国产战机霸气名称大盘点在近期举行的马来西亚兰卡威航展上各国顶级装备纷纷亮相在中国展台上近期在实战中一鸣惊人的歼-10CE战斗机模型占据C位人气爆棚观众纷纷前来打卡参观硬核出圈的歼-10也被称为“猛龙”国产歼击机有用猛兽命名的传统小编带你盘…

荣昌政府食堂推出六一套餐 亲子家庭专属福利

端午假期期间,全国多地政府机关食堂面向社会公众开放。例如,重庆市荣昌区政府机关食堂在5月31日中午向游客开放,首日吸引了超过3000名游客前来体验。为了庆祝六一儿童节,该食堂特别推出了61元的家庭套餐,包括荣昌卤鹅、黄凉粉等特色菜品,并新增了粽子和薯条、鸡腿、鸡块等…

樊振东加盟德甲联赛 乒坛巨星开启欧洲冒险

6月1日,FC萨尔布吕肯乒乓球俱乐部宣布奥运冠军樊振东将加盟。樊振东,这位曾经的世界第一、国际乒乓球界的巨星,将在新赛季代表该俱乐部征战德国乒乓球甲级联赛(TTBL)。28岁的中国选手樊振东表示非常期待在萨尔布吕肯和TTBL的新挑战,并渴望成为俱乐部的一员,在新的环境中…

樊振东加盟德国乒乓球甲级联赛 乒坛巨星欧洲冒险

6月1日,FC萨尔布吕肯乒乓球俱乐部宣布奥运冠军樊振东将加盟。这位曾经的世界第一、国际乒乓球界的巨星将在新赛季代表该俱乐部征战德国乒乓球甲级联赛(TTBL)。28岁的中国选手樊振东表示非常期待在萨尔布吕肯和TTBL的新挑战,并渴望成为俱乐部的一员,体验新的环境并帮助球队…

IDM下载器 Internet Download Manager v6.42 Build 39

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://pan.xunlei.com/s/VORWCoLNITytLXc_Obt47jr1A1?pwdipt3# 【​本章下载二】&#xff1a;https://pan.quark.cn/s/d7cd16fee51c 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…