YOLOv10优改系列一:YOLOv10融合C2f_Ghost网络,让YoloV10实现性能的均衡

在这里插入图片描述

💥 💥💥 💥💥 💥💥 💥💥神经网络专栏改进完整目录:点击
💗 只需订阅一个专栏即可享用所有网络改进内容每周定时更新
文章内容:针对YOLOv10的Backbone部分,将Ghost模块融入到C2f结构,实现网络快速涨点以及减小网络资源占用,实现性能均衡!!!
推荐指数(满分五星):⭐️⭐️⭐️⭐️
涨点指数(满分五星):⭐️⭐️⭐️⭐️

✨目录

  • 一、Ghost Net介绍
  • 二、C2f和C2f_Ghost复杂度对比
  • 三、核心代码修改
    • 3.1 修改yaml配置文件
    • 3.2 创建模块文件
    • 3.3 修改task.py文件
    • 3.5 修改__init__.py文件
    • 3.6 修改训练代码
  • 四、问题总结


一、Ghost Net介绍

🌳论文地址:点击
🌳源码地址:点击
🌳论文摘要:GhostNet是一种轻量级的深度学习模型,通过GhostModule和GhostBottleNeck实现高效特征提取。GhostModule通过1x1卷积和深度可分离卷积生成更多特征图,减少参数量。GhostBottleNeck则是GhostModule的瓶颈结构,用于构建网络深度。GhostNet适用于资源有限的场景,如移动设备上的图像分类任务。
🌳主要思想:(1)对卷积进行改进(2)加残差连接
🌳解决方法

  1. Ghost模块通过减少卷积核的数量来降低参数数量和计算量。例如,如果输出特征图的数量是原始卷积的两倍,那么Ghost模块会先通过普通卷积生成一半数量的特征图,然后通过深度可分离卷积生成另一半特征图,这样总体的参数数量和计算量就减少了。尽管GhostNet减少了参数和计算量,但它仍然能够提供与原始网络相当或更好的性能

🌳工作原理
   GhostNet的核心是Ghost模块,它通过廉价操作生成更多的特征图。在标准的卷积操作中,输出特征图是通过输入特征图与卷积核的卷积得到的。Ghost模块首先使用普通卷积生成一部分特征图(称为intrinsic特征图),然后通过深度可分离卷积(depthwise convolution)等廉价操作生成额外的特征图(称为ghost特征图)。最后,将这两部分特征图拼接起来,形成最终的输出特征图。

   在后续的版本GhostNetV2中,引入了一种新的注意力机制,称为DFC(Decoupled Fully Connected)注意力,它通过全连接层捕捉长距离像素之间的依赖关系,进一步提高了网络的性能。

🌳网络结构和相关图
在这里插入图片描述
可以很明显地看到很多特征图存在着非常类似的特征,只不过是颜色的深浅的区别,为了减少计算的复杂度,很自然地就会去想是不是可以去除这些过于类似的冗余特征图。然而,作者在文中指出冗余的特征图对于模型的精度还是起着很重要的作用的,因此不能简单地减少特征图的生成数量来实现高效计算。
在这里插入图片描述
GhostModule,将普通的卷积分为了两步,先生成主要的特征图,再由主要的特征图做简单的卷积变换生成幻象特征图,这样可以大大减少计算的开销。

在这里插入图片描述

Ghost Bottlenecks是由Ghost Module组成的瓶颈结构,其实本质上就是用Ghost Module,来代替瓶颈结构里面的普通卷积。

Ghost Bottlenecks有两个种类(输入进来的步长为1选第一种,输入进来的步长为2选第二种),如下图所示。先来看第一个Ghost Bottleneck,可以分为两个部分,分别是主干部分和残差边部分。在主干部分,使用两个ghost模块对输入的特征层进行特征提取;在残差边部分,什么都不处理,直接将输入和输出进行逐元素求和。这样,第一个瓶颈结构就构建完成了,由于它的步长为1,所以不会对输入进来的特征图进行高和宽的压缩,它的功能是加深网络的深度。

当我们需要对特征层的宽高进行压缩的时候,需要设置第二个Ghost Bottlenecks,即在Bottlenecks里添加一些卷积层。在主干部分里,首先用ghost module进行特征提取,提取完成后使用一个步长为2的深度可分离卷积对输入特征层进行高和宽的压缩,然后再用一个ghost模块进行特征提取。在残差边部分,也会添加上一个步长为2的深度可分离卷积和1x1的普通卷积,然后将输入和输出进行相加。第二个瓶颈结构的步长为2,它的功能就是改变输入特征层的宽高。

二、C2f和C2f_Ghost复杂度对比

YOLOv10默认使用C2f模块
YOLOv10-C2f_Ghost:针对主干网络部分的C2f替换成C2f_Ghost模块

YOLOv10s summary: 402 layers, 8074092 parameters, 8074076 gradients, 24.8 GFLOPs
YOLOv10s-C2f_Ghost summary: 468 layers, 7346756 parameters, 7346740 gradients, 20.3 GFLOPs
在这里插入图片描述

三、核心代码修改

3.1 修改yaml配置文件

复制一份ultralytics\cfg\models\v8\yolov10.yaml下的yolov8.yaml文件到v8根目录文件my_code/yolov10/my_files/yamls
在YOLOv10根目录创建一个my_files/yamls的文件夹,将yolov10/ultralytics/cfg/models/v10/yolov10s.yaml复制一份到yolov10/my_code/yolov10/my_files/yamls/yolov10s.yaml,然后yolov10/my_code/yolov10/my_files/yamls/yolov10s.yaml复制一份为yolov10/my_code/yolov10/my_files/yamls/yolov10s-C2f_Ghost.yaml。
在这里插入图片描述
下面是yolov10s-C2f_Ghost.yaml配置文件

配置文件,可通过关注公众号【AI应用视界】(或者扫描最下面的二维码关注)输入关键字 yolov10+c2f_ghost自动获取

3.2 创建模块文件

ultralytics\nn\modules,在此路径下新建专门存放我们新添加的模块文件夹my_file(好区分),然后在此文件夹下新建ghost.py,添加以下内容:

核心模块文件,可通过关注公众号【AI应用视界】(或者扫描最下面的二维码关注)输入关键字 yolov10+c2f_ghost自动获取

3.3 修改task.py文件

在ultralytics\nn文件夹中找到tasks.py文件,并对以下内容(#todo)进行添加。

  1. 第一步,导入C2f_Ghost
  2. 第二步,在parse_model函数中加入下面虚线中的代码
###############################################第一步
from ultralytics.nn.modules import C2f_Ghost # 导入C2f_Ghost 模块
#################################################
###############################################第二步elif m is AIFI:args = [ch[f], *args]#---------------------------------------------------addelif m in [C2f_Ghost]:c1, c2 = ch[f], args[0]if c2 != nc:  # if not outputc2 = make_divisible(min(c2, max_channels) * width, 8)args = [c1, c2, *args[1:]]if m in [C2f_Ghost]:args.insert(2, n)  # number of repeatsn = 1#---------------------------------------------------addelif m in {HGStem, HGBlock}:c1, cm, c2 = ch[f], args[0], args[1]args = [c1, cm, c2, *args[2:]]if m is HGBlock:args.insert(4, n)  # number of repeatsn = 1
#################################################

3.5 修改__init__.py文件

ultralytics\nn\modules_init_.py,首先在ultralytics\nn\modules新建my_file文件夹,在此文件夹下创建ghost.py,并添加导入此模块,以及在__all__中写入此模块名。

...................
from .my_file.ghost import C2f_Ghost # add__all__ = ("Conv","Conv2",#-----------------"C2f_Ghost",#-----------------"LightConv",

3.6 修改训练代码

from ultralytics import YOLOv10
import os
os.environ["GIT_PYTHON_REFRESH"] = "quiet"
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
if __name__ == '__main__':model = YOLOv10('my_files/yamls/yolov10s.yaml')result = model.train(data="data/data.yaml", epochs=100, workers=1, batch=1, imgsz=416, amp=False, device="cpu")###################################################################################  恢复训练代码,注释掉上面的部分
# model = YOLOv10("runs/det/train/weights/best.pt")  # 指定想要恢复训练的pt文件
# if __name__ == '__main__':
#     model.train(data="data/data.yaml", resume=True, imgsz=416, batch=16, workers=4, epochs=100, amp=False, project="runs/det")  # 恢复训练模型

运行此代码即可将C2f_Ghost结合YOLOv10进行训练

四、问题总结

  1. ModuleNotFoundError: No module named ‘timm’:
    • pip install timm -i https://pypi.tuna.tsinghua.edu.cn/simple/(高环境问题可以安装pip install timm==0.6.13)
  2. ModuleNotFoundError: No module named ‘einops’
    • pip install einops -i https://pypi.tuna.tsinghua.edu.cn/simple
  3. ModuleNotFoundError: No module named ‘hub_sdk’:
    • pip install hub_sdk -i https://pypi.tuna.tsinghua.edu.cn/simple/
  4. ModuleNotFoundError: No module named ‘mmcv’
    • pip install -U openmim -i https://pypi.tuna.tsinghua.edu.cn/simple/
    • mim install mmcv

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

微信自动通过好友和自动拉人进群,微加机器人这个功能太好用了

又发现一个好用的功能,之前就想找一个这种工具,现在发现可以利用微加机器人的两个功能来实现,分别是加好友和关键词拉群 首先 微加机器人的专业版 > 功能 > 加好友设置 可以设置一个关键词通过,这样别人加好友的时候只需要输入制定内…

实战案例(5)防火墙通过跨三层MAC识别功能控制三层核心下面的终端

如果网关是在核心设备上面,还能用MAC地址进行控制吗? 办公区域的网段都在三层上面,防火墙还能基于MAC来控制吗? 采用正常配置模式的步骤与思路 (1)配置思路与上面一样 (2)与上面区…

通信工程学习:什么是PDF策略决策功能

PDF策略决策功能 PDF策略决策功能(Policy Decision Function, PDF)在通信网络中,特别是在IP多媒体子系统(IMS)中,扮演着至关重要的角色。以下是对PDF策略决策功能的详细解释: 一、定义与功能概…

CentOS Stream 8中安装和使用 Docker

docker安装包-CSDN博客 〇、常用的docker命令 docker的作用: 快速进行软件的安装,便于软件环境的维护 docker的镜像: 压缩了指定软件的安装包的文件。使用镜像文件创建容器 docker的容器: 容器可以理解为就是一台小电脑。安装的linux系统&am…

【F的领地】项目拆解:小学教辅资料

项目介绍 虚拟资料项目的赛道其实一直可以做,实际上就是一个信息差项目。 知识付费是常青树,人天生有为知识付费的倾向。 而且虚拟资料通常一份 19~99 的资料有这方面需求很容易就能付款。 主要是产附属的流量再提问题。 我有个同乡,18年…

CircleProgressView 鸿蒙ArkTS自定义View实现圆形进度条

上篇的截图中除了一个上下的箭头,还有一个圆形进度条,今天我们来讲讲这个如何进行实现 我们看这个图形的构造,其实很简单:一个圆形图形,以及一个文本来显示进度 所以我们用一个层叠布局 绘制一个带颜色的圆形&#xff…

Java设计模式—面向对象设计原则(一) ----->开闭原则OCP(完整详解,附有代码+案例)

3.1开闭原则 对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象…

怎么选择靠谱AI论文生成工具?看完我的试用都会明白!

2024年上半年开始AI论文写作工具开始火了,层出不穷!作为一个经常需要写论文的懒人,我非常好奇这些AI工具的实际效果到底怎么样?为了测试不同工具的实力,我对他们都进行了试用,发现了一些意想不到的结果....…

路由器的固定ip地址是啥意思?固定ip地址有什么好处

‌在当今数字化时代,‌路由器作为连接互联网的重要设备,‌扮演着举足轻重的角色。‌其中,‌路由器的固定IP地址是一个常被提及但可能让人困惑的概念。‌下面跟着虎观代理小二一起将深入探讨路由器的固定IP地址的含义,‌揭示其背后…

QML入门之创建可重用的组件(一)

我们在日常开发中都会封装一些组件以便于项目内重复利用。QML创建可重用组件一般有两种方法。 自定义Item使用Component创建自定义组件 自定义Item 以一个自定义按钮举例: import QtQuick 2.12Rectangle {id: root// 自定义属性property string btnDis: qsTr(&qu…

51单片机+proteus仿真+基本实验学习1(跑马灯、独立按键和数码管)

目录 1.实验一跑马灯 1.1代码的生成 1.1.151单片机的延时函数的生成 1.1.251单片机的流水灯代码编写 1.2仿真框图 2.实验二I/O独立按键 2.1基本概念 2.1.1按键所需的基本知识 2.2代码的生成 2.2.1头文件定义的代码 2.2.2 执行代码 2.3仿真图 ​3实验三数码管 3.1基…

基于Verilog HDL的FPGA设计基础

第一章 Verilog数字集成电路设计方法概述 HDL(Hardware Description Language)----硬件描述语言 EDA(Electronic Design Automation)----电子设计自动化 VLSI(Very Large Scale Integrated)----超大规模集成电路 ASIC(Application Specific Integrated Circuit)----专用集成电路…

Unity射击游戏开发教程:(35)轰炸敌人

现在敌人和飞机已经慢慢地越来越有各自地地行为了,在本文中,我们将介绍如何创建一个具有以下行为的敌人: 飞机会来回弹跳。飞机将有 4 架无人机轰炸机围绕飞机旋转。无人机轰炸机会偶尔投下沿着屏幕传播的炸弹。如果炸弹击中玩家或在随机时间后就会爆炸。如果炸弹没有击中玩…

macOS上谷歌浏览器的十大隐藏功能

谷歌浏览器(Google Chrome)在macOS上拥有一系列强大而隐蔽的特性,这些功能能显著提高您的浏览体验。从多设备同步到提升安全性和效率,这些被低估的功能等待着被发掘。我们将逐步探索这些功能,帮助您最大化利用谷歌浏览…

数据分析-螺旋环状气泡图

1 原理 采用阿基米德螺线原理,即以一个点匀速离开一个固定点的同时又以固定的角速度绕该固定点转动而产生的轨迹。具体原理见:阿基米德螺线。坐标轴公式为: 其中x为横坐标,y为纵坐标,r为离中心点的半径,为坐…

CSS之我不会

非常推荐html-css学习视频&#xff1a;尚硅谷html-css 一、选择器 作用&#xff1a;选择页面上的某一个后者某一类元素 基本选择器 1.标签选择器 格式&#xff1a;标签{} <h1>666</h1><style>h1{css语法} </style>2.类选择器 格式&#xff1a;.类…

PFC理论基础与Matlab仿真模型学习笔记(1)--PFC电路概述

一、整流器滤波电路简介 整流器滤波电路的主要功能是将交流电&#xff08;AC&#xff09;转换为直流电&#xff08;DC&#xff09;&#xff0c;并通过滤波器减少波动以输出稳定的直流电。其工作原理主要分为两个部分&#xff1a; 1.整流部分 整流器的核心器件是二极管&#…

JDBC API详解一

DriverManager 驱动管理类&#xff0c;作用&#xff1a;1&#xff0c;注册驱动&#xff1b;2&#xff0c;获取数据库连接 1&#xff0c;注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); 查看Driver类源码 static{try{DriverManager.registerDriver(newDrive…

基于SpringBoot的扶贫助农管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于JavaSpringBootVueMySQL的扶贫助农管理系统【附源码文档…

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中&#xff0c;不同电脑的配置和操作系统&#xff08;如Win11与Win7&#xff09;可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行&#xff0c;需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下&a…