YOLO-v8:对yolov8网络的改进教程(以GAM注意力模块为例)

news2024/11/26 2:37:02

本文将介绍如何在YOLOv8网络中进行模块化修改。

通过将改进的核心模块添加到项目中,即可直接运行各种 YOLOv8-xxx.yaml 网络配置文件,支持乐高式创新扩展。无论是进行网络结构的调整还是增加新的功能模块,用户只需一键运行,轻松实现YOLOv8的改进与优化。

本文以添加 (Global Attention Mechanism,GAM) 注意力机制(参考文献:https://paperswithcode.com/paper/global-attention-mechanism-retain-information)模块为例进行演示。

只需要无脑跟着本教程复现一遍,即可实现对 yolov8 网络的改进。


文章目录

      • 一、创建 GAM.py 文件
      • 二、修改 `__init__.py`
      • 三、引入 GAMAttention 到 tasks.py
      • 四、模型 yolov8-gam 网络配置文件
      • 五、训练


注意:

  • 为了不出现环境混乱,我直接在 D:\miniconda\setup\Lib\site-packages\ultralytics 文件下进行代码修改。
  • 像 GAM 注意力机制模块的类似模块的代码可以在网上搜索到,或者查看作者的源码,或者访问一些大牛的github库,他们都整理了。

一、创建 GAM.py 文件

ultralytics\nn\modules\GAM.py 目录下新建一个 GAM.py 文件,如下图所示,

在这里插入图片描述

复制以下代码到 GAM.py 文件,


import numpy as np
import torch
from torch import nn
from torch.nn import init

class GAMAttention(nn.Module):
       #https://paperswithcode.com/paper/global-attention-mechanism-retain-information
    def __init__(self, c1, c2, group=True,rate=4):
        super(GAMAttention, self).__init__()
        
        self.channel_attention = nn.Sequential(
            nn.Linear(c1, int(c1 / rate)),
            nn.ReLU(inplace=True),
            nn.Linear(int(c1 / rate), c1)
        )
        self.spatial_attention = nn.Sequential(
            nn.Conv2d(c1, c1//rate, kernel_size=7, padding=3,groups=rate)if group else nn.Conv2d(c1, int(c1 / rate), kernel_size=7, padding=3), 
            nn.BatchNorm2d(int(c1 /rate)),
            nn.ReLU(inplace=True),
            nn.Conv2d(c1//rate, c2, kernel_size=7, padding=3,groups=rate) if group else nn.Conv2d(int(c1 / rate), c2, kernel_size=7, padding=3), 
            nn.BatchNorm2d(c2)
        )

    def forward(self, x):
        b, c, h, w = x.shape
        x_permute = x.permute(0, 2, 3, 1).view(b, -1, c)
        x_att_permute = self.channel_attention(x_permute).view(b, h, w, c)
        x_channel_att = x_att_permute.permute(0, 3, 1, 2)
        x = x * x_channel_att
 
        x_spatial_att = self.spatial_attention(x).sigmoid()
        x_spatial_att=channel_shuffle(x_spatial_att,4) #last shuffle 
        out = x * x_spatial_att
        return out  

def channel_shuffle(x, groups=2):
        B, C, H, W = x.size()
        out = x.view(B, groups, C // groups, H, W).permute(0, 2, 1, 3, 4).contiguous()
        out=out.view(B, C, H, W) 
        return out

二、修改 __init__.py

__init__.py 文件存在于包的目录中,用来告诉 Python 该目录是一个包。在 __init__.py 中,可以指定包中哪些模块或变量对外部可见。通过设置 __all__ 变量,可以控制从包中导入 * 时哪些模块或函数会被导入。

如下图所示,修改 ultralytics\nn\modules\__init__.py 文件,加入以下两行代码,__all__ 里面添加 "GAMAttention",,以使 GAMAttention 可以被 task.py 引入。

from .GAM import GAMAttention

__all__ = (
    "GAMAttention",
)

在这里插入图片描述

三、引入 GAMAttention 到 tasks.py

ultralytics\nn\tasks.py 文件中,将 GAMAttention 引入,如下图所示,

加入代码

from ultralytics.nn.modules import (
    GAMAttention,
)

在这里插入图片描述

然后在 ultralytics\nn\tasks.py 文件的 parse_model 函数中,加入以下代码:

        elif m in {GAMAttention}:
            c1, c2 = ch[f], args[0]
            if c2 != nc:  # if c2 not equal to number of classes (i.e. for Classify() output)
                c2 = make_divisible(min(c2, max_channels) * width, 8)
            args = [c1, c2, *args[1:]]

在这里插入图片描述

四、模型 yolov8-gam 网络配置文件

创建模型网络配置文件 yolov8-gam.yaml 文件。文件位置可以创建在任何地方。如下图所示,

在这里插入图片描述

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model. More improvement points for YOLOv8, please see https://github.com/iscyy/ultralyticsPro

# Parameters
nc: 80  # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.33, 0.25, 1024]  # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPs
  s: [0.33, 0.50, 1024]  # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPs
  m: [0.67, 0.75, 768]   # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPs
  l: [1.00, 1.00, 512]   # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
  x: [1.00, 1.25, 512]   # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs

# 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, [128, True]]
  - [-1, 1, Conv, [256, 3, 2]]  # 3-P3/8
  - [-1, 6, C2f, [256, True]]
  - [-1, 1, Conv, [512, 3, 2]]  # 5-P4/16
  - [-1, 6, C2f, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]]  # 7-P5/32
  - [-1, 3, C2f, [1024, True]]
  - [-1, 3, GAMAttention, [1024]]
  - [-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, 13], 1, Concat, [1]]  # cat head P4
  - [-1, 3, C2f, [512]]  # 18 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 10], 1, Concat, [1]]  # cat head P5
  - [-1, 3, C2f, [1024]]  # 21 (P5/32-large)

  - [[16, 19, 22], 1, Detect, [nc]]  # Detect(P3, P4, P5)

五、训练

执行以下代码进行训练,修改模型路径和你的数据集配置文件路径。之后运行即可进行训练。结果会保存在代码同级目录下的 runs/train 文件夹下。

from ultralytics import YOLO
if __name__ == '__main__':
    model = YOLO('path/to/yolov8-gam.yaml')
    model.train(data=r'path/to/your_dataset.yaml', epochs=100, workers=0,)

控制台执行结果如下图所示,可以看到,识别到了新的改进的网络。

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

净赚百亿背后,海尔智家的机遇与隐忧

广撒网、出海忙,海尔智家如何熬过存量周期? 转载:科技新知 原创 作者丨田箫 编辑丨赛柯 冰箱、空调、洗衣机不好卖了,已成为不争的事实。 在购房热情降温、收入预期低迷的双重打击下,白电品牌正艰难求生。然而&#x…

通过ASCII码打印HelloWorld(花式打印HelloWorld)

/*** 通过ASCII码打印HelloWorld*/ public class Main {public static void main(String[] args) {String target "HelloWorld";String fi "";for (int i 0; i < target.length(); i) {for (int x 0; x < 127; x) {char c (char) x;String d f…

怎么利用短信接口发送文字短信

在当今这个快节奏的数字时代&#xff0c;即时通讯已成为人们日常生活和工作中不可或缺的一部分。而短信接口&#xff08;SMS Interface&#xff09;&#xff0c;作为传统与现代通讯技术结合的典范&#xff0c;凭借其高效、稳定、广泛覆盖的特性&#xff0c;在众多领域发挥着不可…

K8s中HPA自动扩缩容及hml

1.HPA&#xff1a;基于cpu的利用率来动态实现pod数量的自动伸缩&#xff0c;创建的方法一种是yaml文件&#xff0c;一种是命令行&#xff08;运用比较少&#xff09;&#xff1b;在yaml文件中必须要有资源控制&#xff08;cpu&#xff09;的字段才能生效的。 必要条件&#xf…

linux内核驱动:ptp内核phc框架

目录 一、介绍二、PHC驱动文件三、主要数据结构四、初始化和调用流程五、总结 一、介绍 本文基于linux内核5.10.xxx总结ptp1588精确时间协议实现过程中&#xff0c;内核部分的8A34002实现的phc(PTP hardware clock)驱动支持&#xff1b; ptp的系统框架 .红圈部分为本笔记总结的…

RK3568 初识

RK3565是福州本土集成电路设计企业的产品&#xff0c;售价在200RMB左右&#xff0c;润和DAYU200完成基于RK3568的鸿蒙适配&#xff0c;官方售价高达2000RMB 瑞芯微电子有限公司&#xff08;Rockchips Electronics CO., Ltd&#xff09;: 规模&#xff1a;2000人市值&#xff…

CSS实现前端布局更巧妙的方案!在 flex 布局中通过使用 margin 实现水平垂直居中以及其他常见的前端布局

在前端开发中&#xff0c;实现水平垂直居中一直是个热门话题。随着 CSS Flexbox 布局的普及&#xff0c;开发者们开始更多地使用 justify-content 和 align-items 这两个属性来解决这个问题。 然而&#xff0c;还有一种更加简洁、灵活的方式——使用 margin: auto; 来实现居中以…

【北京迅为】《STM32MP157开发板使用手册》- 第二十三章 Cortex-M4 开发环境搭建

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

香港科技大学工学院2025/2026年度硕士研究生(MSc)项目招生宣讲会

&#x1f514;香港科技大学工学院2025/2026年度硕士研究生&#xff08;MSc&#xff09;项目招生宣讲会 &#x1f559;时间&#xff1a;2024年9月24日&#xff08;星期二&#xff09;14:30 &#x1f3e0;地点&#xff1a;香港中文大学&#xff08;深圳&#xff09;图书馆培训室…

【时序分析】作业汇编

一、基础知识 时间序列分析就是对一个时间序列进行建模&#xff0c;扣除各种趋势项&#xff08;线性趋势、余弦趋势、有色噪声ARIMA&#xff09;&#xff0c;得到一个白噪声序列&#xff1b;换言之&#xff0c;我们要提取其中的有用信息&#xff08;非白噪声序列&#xff09;&…

Linux 之 RPM [Red - Hat Package Manager]【包管理】

命令符 -i&#xff08;install&#xff09;&#xff1a;安装软件包。--test&#xff1a;测试安装&#xff0c;并不实际安装&#xff0c;只是检查依赖关系等是否满足安装条件。--nodeps&#xff1a;忽略依赖关系进行安装。不过这种方式可能导致软件因缺少依赖而无法正常运行&am…

【论文阅读】Face2Diffusion for Fast and Editable Face Personalization

code&#xff1a;mapooon/Face2Diffusion: [CVPR 2024] Face2Diffusion for Fast and Editable Face Personalization https://arxiv.org/abs/2403.05094 (github.com) 论文 介绍 面部个性化旨在将从图像中获取的特定面部插入到预先训练的文本到图像扩散模型中。然而&#…

linux服务器日常运维开机关机关服务命令

Linux开机关机命令 Linux服务器开机和关机命令 在Linux系统中&#xff0c;开机和关机通常涉及到几个命令&#xff1a; 开机&#xff1a; reboot - 重新启动正在运行的系统。 shutdown -r now - 立即重启系统。 关机&#xff1a; poweroff - 关闭系统并关闭电源。 shutdo…

消防摩托车的技术参数_鼎跃安全

一、技术概述 动力系统&#xff1a;消防摩托车搭载单缸、四冲程、水冷发动机&#xff0c;功率达 19kW&#xff0c;为车辆在野外复杂地形行驶提供强劲动力。确保能快速穿越山地、林间等区域&#xff0c;及时抵达火灾现场展开救援。 车体技术&#xff1a;采用高品质材料打造&am…

EA橘子平台Origin离线安装包获取

在EA官网下载的橘子平台安装包安装时我们发现是在线安装&#xff0c;一般的网络环境根本无法完成安装&#xff0c;一直卡在那里&#xff0c;我们可以借助加速器、特殊网络、或者直接获取离线安装包的方法安装&#xff0c;下面是如何获取离线安装包的方法。 打开EA官网&#xf…

基于微信小程序的宿舍报修系统的设计与实现

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的宿…

PPT技巧:如何在幻灯片中生成目录?

PPT文件如何制作目录&#xff0c;如何点击目录标题立即跳转到相应幻灯片&#xff1f;今天小奥超人和大家一起来学习一下。 现在幻灯片里制作好目录页&#xff0c;制作好目录之后&#xff0c;选中一个目录&#xff0c;点击插入 – 链接 在插入链接界面中&#xff0c;选择【本文…

xLSTM模型学习笔记

笔记来源&#xff1a;bilibili LSTM 回顾 原始的 LSTM 是为了解决 RNN 时序反向传播中梯度消失和爆炸问题而提出的。 其所谓的门控机制&#xff0c;其实就是一种时序上的注意力机制&#xff0c;相当于把不同时间进行"掺和"&#xff0c;是对时序信息的一种选择性控制…

苍穹外卖——day1

前后端联调 前端先传给nginx再传给后端服务器 反向代理 我们可以看到前端和后端的访问地址不一样&#xff0c;那么怎么实现进行访问的呢&#xff1f; 我们是通过一种反向代理技术来实现的 利用nginx反向代理来实现前后端联调 下面是如何在我们的idea项目中使用nginx反向代理…

HCIA--实验十四:二层链路聚合

一、实验内容 1.需求/要求 用两台S5700交换机做链路聚合。 二、实验过程 1.拓扑图&#xff1a; 2.步骤&#xff1a; 1.配置交换机SW1 int Eth-Trunk 1 创建链路聚合组 mode lacp-static 配置LACP模式 trunkport GigabitEthernet 0/0/10把接口0/0/10加入聚合组 trunkpo…