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

news2024/9/20 16:28:37
在这里插入图片描述

💥 💥💥 💥💥 💥💥 💥💥神经网络专栏改进完整目录:点击
💗 只需订阅一个专栏即可享用所有网络改进内容每周定时更新
文章内容:针对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]
        #---------------------------------------------------add
        elif m in [C2f_Ghost]:
            c1, c2 = ch[f], args[0]
            if c2 != nc:  # if not output
                c2 = make_divisible(min(c2, max_channels) * width, 8)
            args = [c1, c2, *args[1:]]
            if m in [C2f_Ghost]:
                args.insert(2, n)  # number of repeats
                n = 1
        #---------------------------------------------------add
        elif 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 repeats
                n = 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.coloradmin.cn/o/2130077.html

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

相关文章

基于JavaWeb开发的javaSpringboot+mybatis+layui的装修验收管理系统设计和实现

基于JavaWeb开发的javaSpringbootmybatislayui的装修验收管理系统设计和实现 🍅 作者主页 网顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系…

【第31章】Spring Cloud之Sentinel控制台推送规则到Nacos

文章目录 前言一、下载源码1. 下载源码 二、规则配置1. Nacos适配1.1 使用数据源1.2 复制官方案例1.3 动态规则配置中心 2. 前端路由配置3. 提示4. 编译和启动 三、测试1. 修改前2. 修改后 总结 前言 前面我们已经完成了通过nacos存储提供者流控配置文件,下面我们来…

腾讯云升级多个云存储解决方案 以智能化存储助力企业增长

9月6日,在腾讯数字生态大会腾讯云储存专场上,腾讯云升级多个存储解决方案:Data Platform 数据平台解决方案重磅发布,数据加速器 GooseFS、数据处理平台数据万象、日志服务 CLS、高性能并行文件存储 CFS Turbo 等多产品全新升级&am…

Nuxt Kit 的使用指南:模块创建与管理

title: Nuxt Kit 的使用指南:模块创建与管理 date: 2024/9/11 updated: 2024/9/11 author: cmdragon excerpt: 摘要:本文是关于Nuxt Kit的使用指南,重点介绍了如何使用defineNuxtModule创建自定义模块及installModule函数以编程方式安装模块,以增强Nuxt 3应用的功能性、…

JD18年秋招笔试疯狂数列python解答

问题如下: 链接:疯狂序列_京东笔试题_牛客网 [编程题]疯狂序列 热度指数:149 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 32M,其他语言64M 东东从京京那里了解到有一个无限长的数字序列: 1…

空间物联网中的大规模接入:挑战、机遇和未来方向

这篇论文的标题是《Massive Access in Space-based Internet of Things: Challenges, Opportunities, and Future Directions》,作者包括Jian Jiao, Shaohua Wu, Rongxing Lu, 和 Qinyu Zhang。文章发表在2021年10月的IEEE Wireless Communications上。论文主要探讨…

计算机毕业设计 半成品配菜平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

数据结构算法——排序算法

1.排序 1.选择排序 不稳定&#xff0c;一般不用&#xff0c;基本排序 思路&#xff1a;过滤数组&#xff0c;找到最小数&#xff0c;放在前面。 不稳&#xff1a;导致原本在前的数据移动到后面。 int arr[];for(i0;i<arr.length-1;i){int smallesti; for(ji1;j<leng…

计算机毕业设计 网上体育商城系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

加密

一、加密 加密运算需要两个输入&#xff1a;密钥和明文 解密运算也需要两个输入&#xff1a;密钥和密文 密文通常看起来都是晦涩难懂、毫无逻辑的&#xff0c;所以我们一般会通过传输或者存储密文来保护私密数据&#xff0c;当然&#xff0c;这建立在一个基础上&#xff0c;…

局域网windows下使用Git

windows下如何使用局域网进行git部署 准备工作第一步 &#xff0c;ip设置设置远程电脑的ip设置&#xff0c;如果不会设置请点击[这里](https://blog.csdn.net/Black_Friend/article/details/142170705?spm1001.2014.3001.5501)设置本地电脑的ip&#xff1a;验证 第二步&#x…

腾讯云使用

注&#xff1a;本文的所有演示的代码都基于尚硅谷的尚乐代驾项目 对象存储COS 一种云存储器 官方文档&#xff1a; 对象存储 快速入门-SDK 文档-文档中心-腾讯云 (tencent.com) 一 上传文件 1 初始化客户端 官方示例&#xff1a; // 1 传入获取到的临时密钥 (tmpSecret…

一文教你弄懂网络协议栈以及报文格式

文章目录 OSI七层网络协议栈示意图1. 应用层&#xff08;Application Layer&#xff09;2. 表示层&#xff08;Presentation Layer&#xff09;3. 会话层&#xff08;Session Layer&#xff09;4. 传输层&#xff08;Transport Layer&#xff09;5. 网络层&#xff08;Network …

Qt QSerialPort数据发送和接收DataComm

文章目录 Qt QSerialPort数据发送和接收DataComm2.添加 Qt Serial Port 模块3.实例源码 Qt QSerialPort数据发送和接收DataComm Qt 框架的Qt Serial Port 模块提供了访问串口的基本功能&#xff0c;包括串口通信参数配置和数据读写&#xff0c;使用 Qt Serial Port 模块就可以…

【超详细】Plaxis软件简介、 Plaxis Python API环境搭建、自动化建模、Python全自动实现、典型岩土工程案例实践应用

查看原文>>>【案例教程】PLAXIS软件丨自动化建模、典型岩土工程案例解析、模型应用、数据分析、图表制作 目录 第一部分&#xff1a;Plaxis软件简介及 Plaxis Python API环境搭建 第二部分&#xff1a;Plaxis自动化建模-基础案例 第三部分&#xff1a;进阶案例-Pyt…

C# HttpClient 实现HTTP Client 请求

为什么&#xff1f; C# httpclient get 请求和直接浏览器请求结果不一样 为了测试一下HTTP接口的&#xff0c;用C# HttpClient实现了HTTP客户端&#xff0c;用于从服务端获取数据。 但是遇到了问题&#xff1a;C# httpclient get 请求和直接浏览器请求结果不一样 初始代码如…

高德地图绘图,点标记,并计算中心点

效果图 代码如下 / 地图初始化 const map: any ref(null) const marker: any ref(null) const polyEditor: any ref(null) const view: any ref(false) const squareVertices: any ref([]) const init () > {workSpacesCurrent(workspaceId, {}).then((res) > {c…

html+css+js网页设计 旅游 龙门石窟8个页面

htmlcssjs网页设计 旅游 龙门石窟8个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#…

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

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

分类预测|基于鲸鱼优化-卷积-门控制单元网络-注意力数据分类预测Matlab程序 WOA-CNN-GRU-Attention

分类预测|基于鲸鱼优化-卷积-门控制单元网络-注意力数据分类预测Matlab程序 WOA-CNN-GRU-Attention 文章目录 一、基本原理1. WOA&#xff08;鲸鱼优化算法&#xff09;2. CNN&#xff08;卷积神经网络&#xff09;3. GRU&#xff08;门控循环单元&#xff09;4. Attention&…