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

简介: 本文介绍了YOLOv10的性能优化,通过融合Ghost模块和C2f结构,实现了网络性能的均衡。GhostNet通过GhostModule和GhostBottleNeck减少参数量,适用于资源有限的场景。YOLOv10-C2f_Ghost在减少参数和计算量的同时,保持了与原始网络相当或更好的性能。文章还提供了详细的代码修改步骤和可能遇到的问题解决方案。

一、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’:
  2. ModuleNotFoundError: No module named ‘einops’
  3. ModuleNotFoundError: No module named ‘hub_sdk’:
  4. ModuleNotFoundError: No module named ‘mmcv’

微信公众号搜索方式:1.AI应用视界;2.可根据CSDN下方名片进行搜索

在这里插入图片描述

目录
相关文章
|
1天前
|
存储 安全 网络安全
云计算与网络安全:技术融合与挑战
【10月更文挑战第9天】在数字化转型的浪潮中,云计算成为企业和个人不可或缺的技术支撑。然而,随之而来的网络安全问题也日益凸显。本文将深入探讨云计算环境下的网络安全挑战,分析云服务模式对信息安全的影响,并提出相应的防护措施。通过案例分析,我们将揭示如何在享受云计算带来的便利的同时,确保数据安全和隐私保护。
|
3天前
|
存储 安全 网络安全
云计算与网络安全的融合之路
【10月更文挑战第7天】随着云计算技术的迅猛发展,企业和个人越来越依赖云服务来处理和存储数据。然而,这种便利性也带来了新的挑战,尤其是在网络安全领域。本文将探讨在云计算环境下,如何通过技术手段加强网络安全,保护信息安全。我们将从云服务的基本概念出发,深入到网络安全的重要性,最后讨论如何实施有效的安全措施,确保云计算环境的安全。
|
4天前
|
存储 安全 网络安全
云计算与网络安全:技术融合与挑战
【10月更文挑战第6天】 在数字化的浪潮中,云计算已成为推动创新和效率的关键力量。然而,随着云服务的普及,网络安全问题也日益突出。本文将探讨云计算环境下的网络安全挑战,分析信息安全策略的重要性,并提供实用的防护措施。我们将通过具体案例,展示如何在享受云计算带来的便利的同时,保障数据的安全和隐私。
30 6
|
1天前
|
存储 安全 网络安全
云计算与网络安全:技术融合下的挑战与机遇
【10月更文挑战第9天】在数字时代,云计算和网络安全是推动企业创新和保护资产的两大支柱。本文将探讨云计算服务如何影响网络安全策略,并分析信息安全在云环境中的重要性。我们将通过实际案例来揭示云服务带来的安全挑战,同时展示如何利用最新的安全技术来增强防护。文章旨在为读者提供深入的洞见,帮助他们在享受云计算便利的同时,有效规避潜在的安全风险。
6 1
|
1天前
|
算法 计算机视觉 Python
YOLOv8优改系列二:YOLOv8融合ATSS标签分配策略,实现网络快速涨点
本文介绍了如何将ATSS标签分配策略融合到YOLOv8中,以提升目标检测网络的性能。通过修改损失文件、创建ATSS模块文件和调整训练代码,实现了网络的快速涨点。ATSS通过自动选择正负样本,避免了人工设定阈值,提高了模型效率。文章还提供了遇到问题的解决方案,如模块载入和环境配置问题。
6 0
YOLOv8优改系列二:YOLOv8融合ATSS标签分配策略,实现网络快速涨点
|
1天前
|
机器学习/深度学习 计算机视觉 异构计算
YOLOv8优改系列一:YOLOv8融合BiFPN网络,实现网络快速涨点
本文介绍了将BiFPN网络应用于YOLOv8以增强网络性能的方法。通过双向跨尺度连接和加权特征融合,BiFPN能有效捕获多尺度特征,提高目标检测效果。文章还提供了详细的代码修改步骤,包括修改配置文件、创建模块文件、修改训练代码等,以实现YOLOv8与BiFPN的融合。
3 0
YOLOv8优改系列一:YOLOv8融合BiFPN网络,实现网络快速涨点
|
3天前
|
安全 网络安全 API
云计算与网络安全:技术融合下的风险与对策
【10月更文挑战第7天】在数字化时代,云计算作为信息技术的一股强大力量,正在深刻改变着企业运营和个人生活。然而,随着云服务的广泛应用,网络安全问题也日益凸显。本文将探讨云计算环境下的网络安全挑战,分析常见的安全威胁,并提出相应的防护措施。我们将通过实际案例,展示如何在享受云计算便利的同时,保障数据的安全性和隐私性。
7 0
|
3天前
|
存储 安全 网络安全
云计算与网络安全:技术融合下的安全挑战与策略
【10月更文挑战第7天】随着云计算技术的飞速发展,企业和个人越来越依赖云服务来存储和处理数据。然而,这种便利性也带来了新的网络安全威胁和挑战。本文将探讨云计算环境下的网络安全问题,分析当前面临的安全挑战,并提出相应的防护策略。我们将通过实际案例和简单的代码示例,展示如何在云计算环境中实施有效的安全措施,以保护数据和系统免受网络攻击。
|
4天前
|
存储 安全 算法
网络安全与信息安全:构建安全数字生活的基石
【10月更文挑战第5天】 在数字化时代,网络安全与信息安全已成为维护个人隐私、企业机密和国家安全的重要防线。本文旨在探讨网络安全漏洞的形成与防范、加密技术的应用及其重要性,以及提升公众安全意识的必要性。通过深入浅出的方式,帮助读者理解网络安全的核心要素,并强调每个人都是网络安全生态中不可或缺的一环。
13 1
|
4天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【10月更文挑战第6天】在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将探讨网络安全漏洞、加密技术和安全意识等方面的内容,以帮助读者更好地了解这些主题,并采取适当的措施保护自己的信息安全。我们将通过代码示例来演示一些常见的安全漏洞,并提供解决方案。最后,我们将强调培养良好的安全意识对于维护个人和组织的信息安全的重要性。

热门文章

最新文章