yolov8涨点系列之C2f模块改进主分支

文章目录

  • C2F 模块介绍
    • 定义与基本原理
    • 应用场景
  • C2f模块修改步骤
    • (1) C2f_up模块编辑
    • (2)在__init_.py+block.py中声明
    • (3)在task.py中声明
    • yolov8引入C2f_up模块
      • yolov8.yaml
      • yolov8.yaml引入C2f_up模块
  • C2f改进对YOLOv8检测具有多方面的好处

C2F 模块介绍

定义与基本原理

  C2F(Coarse - to - Fine)模块通常是一种在计算机视觉或其他领域中,用于处理从粗糙到精细层次信息的模块。例如,在图像分割任务中,C2F 模块可能先从整个图像的大致区域划分入手(粗粒度处理),然后逐步细化分割边界和区域内部的细节(细粒度处理)。
  从网络结构角度看,它可能包含多个层次的处理单元。在早期阶段,这些单元会处理经过下采样后的低分辨率图像信息,以获取具有较大感受野的全局特征。随着网络的推进,通过上采样等操作,将早期的全局特征和经过处理的高分辨率局部特征相结合,逐步恢复细节信息,从而实现从粗到细的信息整合。

应用场景

  图像分割:在医学图像分割领域,如对脑部 MRI 图像进行组织分割时,C2F 模块可以先利用低分辨率的图像大致区分出大脑的主要区域(如白质、灰质、脑脊液等),然后在精细阶段准确划分各个组织的边界。在语义分割任务中,对于自然场景图像,C2F 模块有助于区分天空、建筑、道路等大的物体类别,并且能够很好地描绘出物体的边缘和细节,比如路边树木的轮廓等。
  目标检测:在目标检测任务中,C2F 模块可以先定位目标大致所在的区域(粗定位),然后对目标的边界框和类别进行更精确的确定(精确定位和分类)。例如在行人检测中,先找到可能包含行人的大致场景区域,再细化到行人的具体姿态、衣着细节等特征,从而更准确地识别行人个体。

C2f模块修改步骤

(1) C2f_up模块编辑

  C2f模块位置位于ultralytics/nn/modules/block.py内,如下图所示:
在这里插入图片描述

class C2f(nn.Module):
    """Faster Implementation of CSP Bottleneck with 2 convolutions."""

    def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):
        """Initialize CSP bottleneck layer with two convolutions with arguments ch_in, ch_out, number, shortcut, groups,
        expansion.
        """
        super().__init__()
        self.c = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, 2 * self.c, 1, 1)
        self.cv2 = Conv((2 + n) * self.c, c2, 1)  # optional act=FReLU(c2)
        self.m = nn.ModuleList(Bottleneck(self.c, self.c, shortcut, g, k=((3, 3), (3, 3)), e=1.0) for _ in range(n))

    def forward(self, x):
        """Forward pass through C2f layer."""
        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):
        """Forward pass using split() instead of chunk()."""
        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))

改进后代码:

class C2f_up(nn.Module):
    """Faster Implementation of CSP Bottleneck with 2 convolutions."""

    def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):
        """Initialize CSP bottleneck layer with two convolutions with arguments ch_in, ch_out, number, shortcut, groups,
        expansion.
        """
        super().__init__()
        self.c = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, 2 * self.c, 1, 1)
        self.cv2 = Conv((2 + n) * self.c, c2, 1)  # optional act=FReLU(c2)
        self.m = nn.SiLU(nn.ModuleList(Bottleneck(self.c, self.c, shortcut, g, k=((3, 3), (3, 3)), e=1.0) for _ in range(n)))

    def forward(self, x):
        """Forward pass through C2f layer."""
        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):
        """Forward pass using split() instead of chunk()."""
        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))

(2)在__init_.py+block.py中声明

在这里插入图片描述

在这里插入图片描述

(3)在task.py中声明

在这里插入图片描述

yolov8引入C2f_up模块

yolov8.yaml

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# 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, 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)

yolov8.yaml引入C2f_up模块

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# 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, 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_up, [512]]  # 12

  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 4], 1, Concat, [1]]  # cat backbone P3
  - [-1, 3, C2f_up, [256]]  # 15 (P3/8-small)

  - [-1, 1, GhostConv, [256, 3, 2]]
  - [[-1, 12], 1, Concat, [1]]  # cat head P4
  - [-1, 3, C2f_up, [512]]  # 18 (P4/16-medium)

  - [-1, 1, GhostConv, [512, 3, 2]]
  - [[-1, 9], 1, Concat, [1]]  # cat head P5
  - [-1, 3, C2f_up, [1024]]  # 21 (P5/32-large)

  - [[15, 18, 21], 1, Detect, [nc]]  # Detect(P3, P4, P5)

改进前:
在这里插入图片描述
改进后:
在这里插入图片描述

C2f改进对YOLOv8检测具有多方面的好处

  1. 特征融合更高效
    • 多尺度特征融合增强:C2f模块能够将来自不同层级的特征图进行融合,使模型获得既有高分辨率又有丰富语义信息的特征图。这有助于提高模型对不同尺度物体的检测能力,无论是小目标还是大目标,都能更好地被检测和识别。例如,在复杂的交通场景中,对于远处的小行人和近处的大型车辆,改进后的YOLOv8都能准确检测。
    • 梯度流信息更丰富:C2f改进可能引入了新的结构或操作,增加了模型的梯度流分支,从而提供更丰富的梯度信息。这有助于模型更好地学习到图像中的特征,加快收敛速度和收敛效果,提高训练效率。
  2. 模型性能提升
    • 检测精度提高:通过更有效的特征融合和更丰富的特征表示,C2f改进后的YOLOv8能够更准确地定位和分类目标,从而提高检测精度。在面对复杂背景、遮挡等情况时,模型能够更好地提取目标的特征,减少误检和漏检。
    • 模型鲁棒性增强:改进后的C2f模块使模型对输入数据的变化具有更强的适应性,例如在不同光照条件、不同视角、不同图像质量等情况下,模型仍然能够保持较好的检测性能,提高了模型的鲁棒性。
  3. 计算效率优化
    • 参数数量减少:C2f改进可能会对模块的结构进行优化,减少不必要的参数数量,从而降低模型的存储需求和计算复杂度。这对于在资源有限的设备上部署模型非常重要,例如嵌入式设备、移动设备等,可以使模型更易于部署和运行。
    • 推理速度加快:在保持检测精度的前提下,优化后的C2f模块能够减少计算量,从而加快模型的推理速度,提高实时性。这对于需要快速处理大量图像数据的应用场景,如视频监控、自动驾驶等,具有重要的意义。
  4. 易于集成和扩展
    • 模块灵活性提高:C2f改进后的模块具有更高的灵活性,可以方便地与其他模块或技术进行集成。例如,可以与注意力机制、特征增强模块等相结合,进一步提升模型的性能。
    • 可扩展性强:为研究人员和开发者提供了更多的优化空间,可以根据具体的应用需求和性能要求,对模型进行进一步的改进和扩展,以满足不同场景下的检测任务。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构算法篇--递归(c语言版)

目录 1.递归 1.1求阶乘: 1.2.斐波那契数 1.3. 求幂 1.递归 在C语言中,递归是一种函数调用自身的方法,用来解决一些具有重复性质的问题。例如,计算阶乘、斐波那契数列等问题都可以通过递归实现。 递归在书写的时候&#xff0…

[大模型]视频生成-Sora简析

参考资料: Sora技术报告https://openai.com/index/video-generation-models-as-world-simulators/4分钟详细揭密!Sora视频生成模型原理https://www.bilibili.com/video/BV1AW421K7Ut 一、概述 相较于Gen-2、Stable Diffusion、Pika等生成模型的前辈&am…

【数据仓库】Hive 拉链表实践

背景 拉链表是一种数据模型,主要是针对数据仓库设计中表存储数据的方式而定义的;顾名思义,所谓拉链表,就是记录历史。记录一个事务从开始一直到当前状态的所有变化的信息。 拉链表可以避免按每一天存储所有记录造成的海量存储问题…

UnityAssetsBundle字体优化解决方案

Unity开发某个项目,打包后的apk包体已经高达1.25G了,这是非常离谱的。为了不影响用户体验,需要将apk包体缩小。因为项目本身不包含很多模型以及其他大型资源,排除法将AB包删除,发现app本身就100多M。 由此可以锁定是AB…

高通Quick板上安装编译Ros1 noetic,LeGO_LOAM,FAR_Planner和rslidar_sdk

环境要求: 这里quick板上安装的是Ubuntu20.04版本 Ros Noeti安装: 1.设置软件源: 官方提供的软件源: sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.…

Qt多边形填充/不填充绘制

1 填充多边形绘制形式 void GraphicsPolygonItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {Q_UNUSED(option);Q_UNUSED(widget);//painter->setPen(pen()); // 设置默认画笔//painter->setBrush(brush()); // 设置默…

零基础学习Spring AI Java AI使用向量数据库postgresql 检索增强生成 RAG

零基础学习Spring AI Java AI使用向量数据库postgresql 检索增强生成 RAG 向量数据库是一种特殊类型的数据库,在人工智能应用中发挥着至关重要的作用。 在向量数据库中,查询与传统的关系数据库不同。它们不是进行精确匹配,而是执行相似性搜…

如何在 uniapp 中实现图形验证码

全篇大概2000 字(含代码),建议阅读时间10分钟。 什么是图形验证码? 图形验证码(也称为图片验证码或验证码图像)通常用于防止机器人自动提交表单,确保用户是人工操作。 一、需求 我们希望在一个…

mysql error:1449权限问题 及 用户授权

一、权限问题 Got error: 1449: The user specified as a definer (skip-grants userskip-grants host) does not exist when using LOCK TABLES 在迁移数据库时,定义的definer,在两个数据库之间不同步时,要将不存在的definer改成数据库中已…

uniapp+vue加油服务系统 微信小程序

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 基于微信小程序的加油服务系统设计为微信小程序和后台管理两个服务端,并对此设计相应的功能模块如下&#x…

【MFC编程(一)】MFC概述

文章目录 MFC概述MFC组成MFC对比Windows APIMFC类库基类CObject命令发送类CCmdTarget应用程序结构类应用程序线程支持类CWinThread/CWinApp文档类CDocument文档模板类CDocTemplate 窗口类窗口基类CWnd边框窗口类CFrameWnd视图类CView MFC概述 MFC(Microsoft Founda…

如何解决传统能源企业后备人才不足、人才规划缺失问题

如何解决传统能源企业后备人才不足、人才规划缺失问题 很多传统能源企业都面临着老员工逐渐退休,新员工还没有培养起来的问题,缺乏提前对人力资源规划的意识,导致当企业要开展新业务时或者老员工离职的时候,缺乏合适的人选。特别…

服装品牌零售业态融合中的创新发展:以开源 AI 智能名片 S2B2C 商城小程序为视角

摘要:本文以服装品牌零售业态融合为背景,探讨信息流优化和资金流创新的重要作用,并结合开源 AI 智能名片 S2B2C 商城小程序,分析其如何进一步推动服装品牌在零售领域的发展,提高运营效率和用户体验,实现商业…

C#编程:VSTO在Excel工作表中输出List数据

标题 C#编程&#xff1a;VSTO在Excel工作表中输出List数据 正文 一、问题&#xff1a; 我想把C#中的List<T>输出到Excel工作表中 二、思路方法&#xff1a; &#xff08;1&#xff09;用程序创建一个List<T> &#xff08;2&#xff09;输出到当前工作表 三、代码&a…

【算法】递归+深搜:106.从中序与后序遍历序列构造二叉树(medium)

目录 1、题目链接 相似题目&#xff1a; 2、题目 3、解法 函数头-----找出重复子问题 函数体---解决子问题 4、代码 1、题目链接 106.从中序与后序遍历序列构造二叉树&#xff08;LeetCode&#xff09; 相似题目&#xff1a; 105.从前序与中序遍历序列构造二叉树 889.根…

【Postman深入测试接口的详细指南】保姆级

Postman深入测试接口的详细操作步骤 一、创建测试集合二、使用环境变量三、编写请求四、编写测试脚本五、数据驱动测试六、模拟请求&#xff08;Mocking&#xff09;1. 创建Mock Server2. 定义响应3. 使用Mock Server进行请求 七、API监控1. 创建监控2. 运行监控 一、创建测试集…

Memento 备忘录模式

备忘录模式 意图结构适用性实例Java Web开发中的简单示例Originator 类Memento 类Caretaker 类 文本编辑器示例1. Originator (发起人) - TextEditor2. Memento (备忘录) - TextMemento3. Caretaker (负责人) - History4. 使用示例输出 备忘录模式&#xff08;Memento Pattern&…

HTMLCSS:3D 旋转卡片的炫酷动画

效果演示 这段代码是一个HTML和CSS的组合&#xff0c;用于创建一个具有3D效果的动画卡片。 HTML <div class"obj"><div class"objchild"><span class"inn6"><h3 class"text">我是谁&#xff1f;我在那<…

为什么越来越多人开始用云电脑?网友道出了真相

近期&#xff0c;3A游戏大作《黑神话&#xff1a;悟空》的横空出世&#xff0c;成功激起大多数人对国产游戏的兴趣。然而&#xff0c;没有一台高配置的电脑&#xff0c;就无法在《黑神话&#xff1a;悟空》中获得震撼的游戏体验。想要配齐处理器、显卡、内存等硬件&#xff0c;…

https服务器访问http资源报Mixed Content混合内容错误

1 报错内容 Mixed Content: The page at ‘https://xxx’ was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint ‘http://xxx’. This request has been blocked; the content must be served over HTTPS. 2 报错原因 页面通过 HTTPS 加载&#xff…