YOLOv8将注意力机制融合进入C2f模块

1. 引言

1.1 YOLOv8添加注意力机制方法

yolov8添加注意力机制是一个非常常见的操作,常见的操作直接将注意力机制添加至YOLOv8的某一层之后,这种改进特别常见。
示例如下:
新版yolov8添加注意力机制(以NAMAttention注意力机制为例)
YOLOv8添加注意力机制(ShuffleAttention为例)
知网上常见的添加注意力机制的论文均使用的上述方式,同质化严重。


因此,这里展示一种将注意力机制融合至模块中的方法。

1.2 C2f模块融合注意力机制

C2f模块融合注意力机制,而不是直接放置在某一层后面。


本文使用SE注意力机制融入C2f模块。

1.3 常见的注意力机制

以下是一些常见的注意力机制实现的代码,具体看此贴。
常见注意力机制代码实现

2. 实验

2.1 SE Attention

SE注意力机制的代码如下:

#SE attention
class SEAttention(nn.Module):def __init__(self, channel=512, reduction=16):super(SEAttention, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.l1 = nn.Linear(channel, channel //reduction, bias=False)self.relu = nn.ReLU(inplace=True)self.l2 = nn.Linear(channel//reduction, channel, bias=False)self.sig = nn.Sigmoid()def forward(self, x):b, c, _, _ = x.size()y = self.avg_pool(x).view(b, c)y = self.l1(y)y = self.relu(y)y = self.l2(y)y = self.sig(y)y = y.view(b, c, 1, 1)return x * y.expand_as(x)

可以将以上注意力机制的代码放到ultralytics/nn/modules/conv.py目录的最后。

2.2 SE_Bottleneck和C2f_SE模块

SE_Bottleneck和C2f_SE模块的代码如下。

class SE_Bottleneck(nn.Module):def __init__(self, c1, c2, shortcut=True, g=1, k=(3, 3), e=0.5):super().__init__()c_ = int(c2 * e)self.cv1 = Conv(c1, c_, k[0], 1)self.cv2 = Conv(c_, c2, k[1], 1, g=g)self.se = SEAttention(c2, 16)self.add = shortcut and c1 == c2def forward(self, x):return x + self.se(self.cv2(self.cv1(x))) if self.add else self.se(self.cv2(self.cv1(x)))class C2f_SE(nn.Module):def __init__(self, c1, c2, shortcut = False, g = 1, n = 1, e = 0.5):super().__init__()self.c = int(c2 * e)self.cv1 = Conv(c1, 2 * self.c, 1, 1)self.cv2 = Conv((2 + n) * self.c, c2, 1)self.m = nn.ModuleList(SE_Bottleneck(self.c, self.c, shortcut, g, k=((3,3),(3,3)), e = 1.0) for _ in range(n))def forward(self, x):y = list(self.cv1(x).chunk(2,1))y.extend(m(y[-1]) for m in self.m)return self.cv2(torch.cat(y, 1))def forward_split(self, x):y = list(self.cv1(x).split((self.c, self.c), 1))y.extend(m(y[-1]) for m in self.m)return self.cv2(torch.cat(y, 1))

可以将以上SE_Bottleneck和C2f_SE模块的代码放到ultralytics/nn/modules/conv.py目录的最后。


在ultralytics/nn/modules/conv.py文件的最前面添加C2f_SE在这里插入图片描述


在ultralytics/nn/modules/ __ init__.py中,添加C2f_SE模块。
在这里插入图片描述

2.3 tasks.py

在ultralytics/nn/tasks.py中,在parse_model(d, ch, verbose=True)方法中,添加C2f_SE即可。
在这里插入图片描述

2.4 修改模型

创建模块:ultralytics/cfg/models/v8/yolov8n-C2f_SE.yaml,以yolov8n为例:修改后的模型如下:

 # Ultralytics YOLO 🚀, GPL-3.0 license# Parameters
nc: 1  # number of classes
depth_multiple: 0.33  # scales module repeats
width_multiple: 0.25  # scales convolution channels# YOLOv8.0n 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, 3, C2f_SE, [128, True]]- [-1, 1, Conv, [256, 3, 2]]  # 3-P3/8- [-1, 6, C2f_SE, [256, True]]- [-1, 1, Conv, [512, 3, 2]]  # 5-P4/16- [-1, 6, C2f_SE, [512, True]]- [-1, 1, Conv, [1024, 3, 2]]  # 7-P5/32- [-1, 3, C2f_SE, [1024, True]]- [-1, 1, SPPF, [1024, 5]]  # 9# YOLOv8.0n head
head:- [-1, 1, nn.Upsample, [None, 2, 'nearest']]- [[-1, 6], 1, Concat, [1]]  # cat backbone P4- [-1, 3, C2f, [512]]  # 12- [-1, 1, nn.Upsample, [None, 2, 'nearest']]- [[-1, 4], 1, Concat, [1]]  # cat backbone P3- [-1, 3, C2f, [256]]  # 15 (P3/8-small)- [-1, 1, Conv, [256, 3, 2]]- [[-1, 12], 1, Concat, [1]]  # cat head P4- [-1, 3, C2f, [512]]  # 18 (P4/16-medium)- [-1, 1, Conv, [512, 3, 2]]- [[-1, 9], 1, Concat, [1]]  # cat head P5- [-1, 3, C2f, [1024]]  # 21 (P5/32-large)- [[15, 18, 21], 1, Detect, [nc]]  # Detect(P3, P4, P5)

这里主要修改了backbone的C2f,其实也可以修改head部分的C2f,模型的大小不变,因此随便改哪个位置都行。
在这里插入图片描述

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

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

相关文章

10.windows系统:定时任务备份mysql数据库

1. 创建脚本 .bat内容如下: echo off ::设置编码格式utf-8否则有中文乱码 chcp 65001 echo. echo MySQL数据库开始备份echo ***************************** echo. echo 备份日期:%date% echo 备份时间:%time% echo. echo *****************…

鸿蒙问题记录

1、Variables decorated by Prop link, "Consume, and Obiectlink cannot be initialized locally 原因:被装饰器修饰的数据,不能初始化。这个应该是后续版本做了优化。当前使用 DevEco Studio 3.1.1 Release

Web3时代:探索DAO的未来之路

Web3 的兴起不仅代表着技术进步,更是对人类协作、创新和价值塑造方式的一次重大思考。在 Web3 时代,社区不再仅仅是共同兴趣的聚集点,而变成了一个价值交流和创新的平台。 去中心化:超越技术的革命 去中心化不仅仅是 Web3 的技术…

CRM系统如何帮助企业实现管理信息化?

21世纪的今天,企业不重视CRM信息化会导致什么后果?我们先来看这个例子—— 假设有一家中小型电子商务公司,他们销售各种电子产品,如手机、平板、电脑和配件等。在开始使用CRM系统之前,他们的客户数据分散在各个部门的…

Redis高可用解决方案之Redis集群,和Spring Cloud集成实战

专栏集锦,大佬们可以收藏以备不时之需 Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏:https:/…

HDFS集群环境部署(超级详细!!)

一、部署Hadoop的关键点 1.上传,解压到/export/server,配置软链接 2.修改4个配置文件,workers,hadoop.env.sh,core-stie.xml,hdfs-site.xml 3.SCP分发到root2,root3,并设置环境变量 4.创建数据目录,并修改文…

TypeScript 中for in遍历,元素隐式具有 “any“ 类型,因为类型为 “string“ 的表达式不能用于索引类型

第一种方案、使用[key: string]:string 形式为键名声明类型 声明类型: interface FormInfoData {[materialCode: string]: stringmaterialName: stringmaterialUnit: stringmaterialItem: stringmaterialOwnership: stringmaterialclassCode: stringmat…

Mac pro解压rar文件

unrar 已经从homebrew移除了!! 在 MacOS 上解压 rar 文件,需要使用一个支持 rar 格式的第三方工具。有很多工具可以选择,但我会推荐一个名为 "Unarchiver" 的免费工具,它支持许多不同类型的压缩文件&#x…

diffusers-Load adapters

https://huggingface.co/docs/diffusers/main/en/using-diffusers/loading_adaptershttps://huggingface.co/docs/diffusers/main/en/using-diffusers/loading_adapters 有几种训练技术可以个性化扩散模型,生成特定主题的图像或某些风格的图像。每种训练方法都会产…

【论文阅读笔记】GLM-130B: AN OPEN BILINGUAL PRE-TRAINEDMODEL

Glm-130b:开放式双语预训练模型 摘要 我们介绍了GLM-130B,一个具有1300亿个参数的双语(英语和汉语)预训练语言模型。这是一个至少与GPT-3(达芬奇)一样好的100b规模模型的开源尝试,并揭示了如何成功地对这种规模的模型进行预训练。在这一过程中&#xff0…

ESXi for ARM 最新下载地址

由于VMware决定关闭 flings.vmware.com 网站,内容被迁移到不同的地方,网站跳转到 Code Samples and PowerCLI Example Scripts | VMware - VMware {code} ESXi for ARM的下载地址迁移到了 https://customerconnect.vmware.com/downloads/get-download?…

inquirer.js——交互式命令行用户界面

一、什么是inquirer.js 1、inquirer.js是一个开源的交互式命令行用户界面(CLI)库,可以让你轻松地与用户进行交互,获取用户输入并做出相应的处理。它的主要功能是提供了一系列常用的命令行交互界面组件,例如input、con…

单目标应用:进化场优化算法(Evolutionary Field Optimization,EFO)求解微电网优化MATLAB

一、微网系统运行优化模型 微电网优化模型介绍: 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、进化场优化算法EFO 进化场优化算法(Evolutionary Field Optimization,EFO)由Baris Baykant Alagoz等人于2022年提出&…

C现代方法(第16章)笔记——结构、联合和枚举

文章目录 第16章 结构、联合和枚举16.1 结构变量16.1.1 结构变量的声明16.1.2 结构变量的初始化16.1.3 指示器(C99)16.1.4 对结构的操作 16.2 结构类型16.2.1 结构标记的声明16.2.2 结构类型的定义16.2.3 结构作为参数和返回值16.2.4 复合字面量(C99)16.2.5 匿名结构(C1X) 16.3…

mysql---事务

mysql事务 事务是一个机制,一个操作序列。包含了一组数据库的操作命令,所有命令都是一个整体,向系统提交或者撤销的操作,要么都执行,要么都不执行,不可分割的单位。 事务的特点ACID: A: 原子性 最小单位…

系统架构设计之云原生架构

云原生架构 一. 云原生技术介绍二. 传统架构模式 VS 云原生架构模式三. 云原生架构反模式四. 云原生架构设计原则 其它相关推荐: 软考系统架构之案例篇(架构设计相关概念) 系统架构之微服务架构 系统架构设计之微内核架构 鸿蒙操作系统架构 所属专栏:系统…

家政APP开发服务同城预约维修接单管理系统软件小程序

家政服务小程序是一个基于移动端的家政服务平台,为用户提供方便快捷的家政服务。以下是小程序的主要功能: 1. 家政服务内容展示:商家可以在小程序中展示各种家政服务项目,如清洁、保洁、保姆、月嫂、钟点工等。用户可以浏览服务信…

Ansible中的变量及加密

目录 一、变量的设定 二、变量的使用方式 1、在playbook中直接定义变量 2、在文件中定义变量 3、设定主机变量和清单变量 4、目录设定变量 5、用命令覆盖变量 6、使用数组设定变量 7、注册变量 8、事实变量 9、魔法变量 三、JINJA2模板 四、加密控制 1、创建加…

Flutter中的各种刷新小部件

1.FutureBuilder 用于处理异步操作和构建界面的非常有用的小部件。它通常与 Future 对象一起使用,用于在异步操作完成后构建界面。 import package:flutter/material.dart;void main() > runApp(MyApp());class MyApp extends StatelessWidget {overrideWidget…

Qt 插件开发详解

1.简介 Qt插件是一种扩展机制,用于将应用程序的功能模块化,并且可以在运行时动态加载和卸载。Qt框架为插件提供了一套标准的接口和管理机制,使得插件的使用和集成变得简单和灵活,通过插件机制,可以将应用程序的功能划…