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

news2024/11/25 0:42:45

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 == c2

    def 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.coloradmin.cn/o/1164501.html

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

相关文章

BulkInsert in Entity Framework

实体框架中的 BulkInsert 扩展方法 安装 Z.EntityFramework.Extensions: 现在,我将向您展示如何使用 Z.EntityFramework.Extensions 包,以及如何通过 Entity Framework 执行批量插入、更新和删除操作。首先,打开“NuGet 包管理器…

Linux驱动 编译乱序和执行乱序

编译乱序 现代的高性能编译器在目标码优化上都具备对指令进行乱序优化的能力。编译器可以对访存的指令进行乱序,减少逻辑上不必要的访存,以及尽量提高Cache命中率和CPU的Load/Store单元的工作效率。 因此在打开编译器优化以后,看到生成的汇编…

JAVA亡了?那么多岗位去哪了?

1.java现在有多卷? 虽然近年来出现了许多其他编程语言和技术。但JAVA依旧是热度最高的。它仍然被广泛用于大型企业应用、后端开发、Android应用开发以及嵌入式系统等领域。此外,Java在大数据、云计算和物联网等新兴领域也有着重要的地位。 因此&#x…

MySQL数据库入门到大牛_01_内容简介

在企业中高级程序员以上级别常常要求是精通MySQL。任何一项技术一旦深入,体系都是繁杂的,想要真正掌握,需要掌握底层的逻辑,梳理清知识脉络,能够以架构师的思路学习MySQL,才能以不变应万变。此篇开始介绍My…

Linux-固定usb转网口名称

参考链接 https://www.cnblogs.com/WCH-SoftGroup/p/16516383.htmludev简介 udev 是一个用户空间系统,它使操作系统管理员能够为事件注册用户空间处理程序。 udev 守护程序接收的事件主要由 (Linux) 内核生成,以响应与外围设备相…

便携式燃料容器上亚马逊加拿大站合规标准是什么?如何办理?

便携式燃料容器 便携式燃料容器是预填充或设计用于容纳易燃液体燃料的一次性或可重复使用的容器。该政策还涵盖用于便携式燃料容器的随附组件,包括用于储存或分配易燃液体燃料的密封罩。 便携式燃料容器亚马逊政策 根据亚马逊政策的要求,所有便携式燃料…

香港「加密货币新政」一周年回顾:怀疑、亢奋和审慎乐观的发展历程

香港作为国际金融中心,一直以来都在追求创新和发展新兴市场。然而,在虚拟资产领域,香港经历了一段怀疑、亢奋和审慎乐观的过程。如今,回顾香港虚拟资产宣言一周年,可以看到这个领域正逐步稳定发展,并得到了…

使用C++的QT框架实现贪吃蛇

最近刷抖音经常看到别人使用类似chatGPT的al工具实现这个贪吃蛇游戏,正好我之前也写过,那么今天看看怎么去实现这个简单的游戏 我这边使用的是C的QT框架,当然用哪些框架都可以,主要是逻辑思路 1.生成画布,开始是一些…

MySQL(6):多表查询

多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。 前提条件: 这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,…

医院小程序解决方案:让医疗服务触手可及

随着移动互联网的发展,小程序已经成为各行各业进行营销和提供服务的重要工具。医疗陪诊行业也不例外。本教程将带领大家了解如何快速掌握医疗陪诊小程序的搭建技巧,帮助大家轻松搭建自己的医疗陪诊小程序。 步骤一:登录乔拓云平台进入商城后台…

分类预测 | Matlab实现SMA-KELM黏菌优化算法优化核极限学习机分类预测

分类预测 | Matlab实现SMA-KELM黏菌优化算法优化核极限学习机分类预测 目录 分类预测 | Matlab实现SMA-KELM黏菌优化算法优化核极限学习机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现SMA-KELM黏菌优化算法优化核极限学习机分类预测(完整源码和数…

进程空间管理:用户态和内核态

用户态虚拟空间里面有几类数据,例如代码、全局变量、堆、栈、内存映射区等。在 struct mm_struct 里面,有下面这些变量定义了这些区域的统计信息和位置。 unsigned long mmap_base; /* base of mmap area */ unsigned long total_vm; /* Total page…

sql根据同一字段不同值时间升序将序

SELECT ID,T_STATUS,T_TIME FROMs order by CASE WHEN T_STATUS 0 THEN 100 ELSE 1000 END,case when T_STATUS 0 then T_TIME end ,case when T_STATUS ! 0 then T_TIME end desc;

Java规则引擎2.1.8版本新增功能说明

规则引擎更新功能 新增: 1.决策结束节点新增结果导出excel功能; 在决策流程的结束节点,可以将决策结果导出为Excel文件。这个功能为用户提供了更多的灵活性和便利性,使他们能够轻松地将决策结果数据进行进一步的分析和处理。 2.新增公有变…

【教3妹学编程-算法题】2913. 子数组不同元素数目的平方和 I

-----------------第二天------------------------ 面试官 : 好的, 我们再来做个算法题吧。平时工作中会尝试用算法吗, 用到了什么数据结构? 3妹 : 有用到, 用到了 bla bla… 面试官 : 好的, 题目是这样的&#xff1…

kali搭建Cobalt strike挂马

APT攻击是高级可持续化攻击,一般是团队分工合作 Cobalt strike红队用的渗透工具。多协议,端口,插件 服务端运行 cobaltstrike4提示java异常,改用cobaltstrike 3.14版本 服务端搭建:./teamserver 服务器IP地址 密码 …

2G-GCN:Multi-person HOI Recognition in Videos

Geometric Features Informed Multi-person Human-object Interaction Recognition in Videos解读 摘要简介 2. Related Work2.1 图像中的HOI检测2.2 视频中的HOI识别2.3 HOI识别数据集2.4 几何特征为HOI分析提供信息 3. 多人HOI数据集(MPHOI-72)4. Two-level Geometric Featur…

MySQL -- 复合查询及内外连接

MySQL – 复合查询及内外连接 文章目录 MySQL -- 复合查询及内外连接一、基本查询回顾1.单表查询 二、多表查询1.表的组合2.案例 三、自连接1.案例四、子查询1.单行子查询2.多行子查询3.多列子查询4.在from子句中使用子查询5.合并查询 五、内连接六、外连接1.左外连接2.右外连接…

C语言程序设计(第五版)谭浩强 第三章课后题答案

第三章 1、假如我国国民生产总值的年增长率为7%&#xff0c; 计算10年后我国国民生产总值与现在相比增长多少百分比。计算公式为 ,其中r为年增长率&#xff0c;n为年数&#xff0c;p为与现在相比的倍数。 #include<stdio.h> #include<math.h>int main(){float r,…

基于QT的简易计算器(一)

目录 0 简介1.设计原理1.1界面设计1.1.1界面基本布局1.1.2 界面调整和美化1.1.2 控件重命名 1.2 连接信号和槽1.3 软件逻辑1.3.1四则运算1.3.2 连续运算&#xff08;不完全&#xff09;的原理1.3.3 清屏1.3.4 退格1.3.5 等于1.3.6 小数点 2.总结与拓展 0 简介 最近在学QT&…