yolov8涨点系列之Concat模块改进

文章目录

  • Concat模块修改步骤
    • (1) BiFPN_Concat3模块编辑
    • (2)在__init_.py+conv.py中声明
    • (3)在task.py中声明
    • yolov8引入BiFPN_Concat3模块
      • yolov8.yaml
      • yolov8.yaml引入C2f_up模块

  在YOLOv8中, concat模块主要用于将多个特征图连接在一起。其具体介绍如下:

  1. 作用
    • 增强特征表达:通过将不同层次的特征图进行组合,能够捕捉到更多的上下文信息,从而增强模型对目标的理解能力,显著提高目标检测的准确性和效率。不同层次的特征图包含了不同尺度和语义级别的信息,将它们拼接起来可以让模型综合利用这些信息进行更准确的预测。
  2. 应用位置:通常出现在网络的不同层次之间,比如在YOLOv8的颈部(neck)部分经常会使用到concat操作。在颈部,需要对来自骨干网络(backbone)不同阶段的特征图进行融合,以便更好地检测不同大小的目标。例如,将低分辨率但富含语义信息的特征图与高分辨率但语义信息较少的特征图进行拼接,从而形成一个更大的输出特征图,这种跨层连接的方式能够同时兼顾细节和感知范围。
  3. 实现方式:在PyTorch等深度学习框架中,concat操作可以通过torch.cat函数实现,一般是沿着某个维度(如通道维度)将多个特征图拼接起来。但在实际应用中,由于YOLO架构中的不同层可能具有不同的空间分辨率,所以在concat之前,通常需要对特征图进行上采样或下采样以匹配所需的尺寸。

  以YOLOv8中的C2f模块为例,它包含了concat操作。首先对输入的特征图进行一次卷积使其通道数变为原来的两倍,然后将其拆分成两部分,一部分进入多个bottleneck模块进行处理,另一部分直接传递到后续的拼接操作。最后,将所有bottleneck模块的输出以及之前直接传递的那部分特征图进行拼接,增加特征的多样性,之后再通过一个卷积层将拼接后的特征图通道数压缩到所需的输出通道数。

Concat模块修改步骤

(1) BiFPN_Concat3模块编辑

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

class Concat(nn.Module):"""Concatenate a list of tensors along dimension."""def __init__(self, dimension=1):"""Concatenates a list of tensors along a specified dimension."""super().__init__()self.d = dimensiondef forward(self, x):"""Forward pass for the YOLOv8 mask Proto module."""return torch.cat(x, self.d)

改进后代码:

class BiFPN_Concat3(nn.Module):def __init__(self, dimension=1):super(BiFPN_Concat3, self).__init__()self.d = dimension# 设置可学习参数 nn.Parameter的作用是:将一个不可训练的类型Tensor转换成可以训练的类型parameter# 并且会向宿主模型注册该参数 成为其一部分 即model.parameters()会包含这个parameter# 从而在参数优化的时候可以自动一起优化self.w = nn.Parameter(torch.ones(3, dtype=torch.float32), requires_grad=True)self.epsilon = 0.0001def forward(self, x):w = self.wweight = w / (torch.sum(w, dim=0) + self.epsilon)  # 将权重进行归一化# Fast normalized fusionx = [weight[0] * x[0], weight[1] * x[1], weight[2] * x[2]]return torch.cat(x, self.d)

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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

(3)在task.py中声明

在这里插入图片描述

yolov8引入BiFPN_Concat3模块

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 GFLOPss: [0.33, 0.50, 1024]  # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPsm: [0.67, 0.75, 768]   # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPsl: [1.00, 1.00, 512]   # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPsx: [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: 6 # 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 GFLOPss: [0.33, 0.50, 1024]  # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPsm: [0.67, 0.75, 768]   # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPsl: [1.00, 1.00, 512]   # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPsx: [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]]  # 9head:- [-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, 6, 12], 1, BiFPN_Concat3, [1]]  # cat head P4- [-1, 3, C2f, [512]]  # 18 (P4/8-medium)- [-1, 1, Conv, [512, 3, 2]]- [[-1, 9], 1, Concat, [1]]  # cat head P5- [-1, 3, C2f, [1024]]  # 21 (P5/16-large)- [[15, 18, 21], 1, Detect, [nc]]  # Detect(P3, P4, P5)

改进前:
在这里插入图片描述
改进后:
在这里插入图片描述
YOLOv8的concat模块与BiFPN模块融合具有多方面的好处:

  1. 增强多尺度特征融合能力
    • 更全面的信息整合
      • concat模块主要是将不同层次的特征图进行连接,能捕捉到多尺度的上下文信息,但简单的连接可能无法充分考虑不同特征的重要性差异。BiFPN模块引入了双向连接,允许信息在不同分辨率级别之间双向传播,使得高层语义信息和低层细节信息能够更充分地交互和融合。与concat模块融合后,不仅能将多尺度特征图连接起来,还能通过BiFPN的双向路径更好地整合这些特征,让模型更全面地理解不同大小的目标,提高对多尺度物体的检测性能。
      • 例如,对于远处的小目标,通过BiFPN的双向信息传播,可以将高层的语义信息传递到低层,增强对小目标特征的理解,再结合concat模块将不同尺度特征图连接起来,有助于更准确地检测小目标。
    • 自适应特征调整:BiFPN采用加权特征融合机制,拥有可学习的权重参数来调整不同层级特征的贡献程度。在与concat模块融合后,可以根据不同任务和数据的特点,自适应地调整融合后的特征,使得重要的特征得到更突出的表达,进一步提高特征的质量和有效性。相比之下,单纯的concat操作对所有特征的融合是平等对待的,缺乏这种自适应调整能力。
  2. 提高模型的准确性和鲁棒性
    • 优化特征传递concat模块在连接特征图时,只是简单地将它们拼接在一起,但在特征传递过程中可能会存在信息丢失或不充分利用的情况。BiFPN模块的引入可以改善这种情况,其独特的网络结构和连接方式能够优化特征在不同层级之间的传递,使特征的传递更加高效和准确。与concat模块融合后,能够更好地利用和传递特征信息,减少信息的损失,从而提高模型的准确性。
    • 增强模型的鲁棒性:在复杂的场景中,目标的大小、形状、姿态等变化多样,对模型的鲁棒性提出了很高的要求。concat模块与BiFPN模块的融合可以使模型更好地适应这些变化,通过多尺度特征融合和优化的特征传递,能够更准确地识别和定位不同形态的目标,提高模型在复杂场景下的检测能力和鲁棒性。
  3. 提升模型的灵活性和可扩展性
    • 灵活的模块组合:将concat模块与BiFPN模块融合,可以根据具体的需求和任务进行灵活的调整和优化。例如,可以根据不同的数据集和目标检测任务,调整BiFPN的层数、节点连接方式以及concat模块的连接位置和方式,以获得更好的性能。这种灵活性使得模型能够适应不同的应用场景,提高了模型的通用性和可扩展性。
    • 易于与其他模块集成:BiFPN模块的模块化设计使其易于与其他模块集成,与concat模块融合后,也可以方便地与其他改进模块或技术相结合,如注意力机制、残差连接等,进一步提升模型的性能。这种可扩展性为模型的不断优化和改进提供了便利,使得模型能够不断适应新的挑战和需求。

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

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

相关文章

基于Spring Boot和Vue的电子商城系统功能设计

基于Spring Boot和Vue的电子商城系统功能设计 该系统是一个基于Spring Boot和Vue框架的电子商城平台,包含前台商城和后台管理系统。系统功能设计包括用户购物体验和管理员管理功能,支持商品的分类展示、收藏、购物车和订单管理等模块。以下是系统功能的简…

【课程总结】day34:多模态大模型之ViT模型、CLIP模型论文阅读理解

前言 在【课程总结】day31:多模态大模型初步了解一文中,我们对多模态大模型的基本原理有了初步了解,本章内容将通过论文阅读理解,更进一步理解多模态大模型中所涉及的 Vit 架构、Transformer在视觉应用的理念以及 Clip图像与文本…

实现数传数据转网口(以太网)和遥控器SBUS信号转串口的功能

为了帮助你实现数传数据转网口(以太网)和SBUS信号转串口的功能,这里提供一个基本的框架。我们将使用STM32微控制器来完成这些任务。假设你已经具备了STM32的基本开发经验,并且已经安装了相应的开发环境(如STM32CubeIDE…

【大数据学习 | kafka高级部分】kafka的快速读写

1. 追加写 根据以上的部分我们发现存储的方式比较有规划是对于后续查询非常便捷的,但是这样存储是不是会更加消耗存储性能呢? 其实kafka的数据存储是追加形式的,也就是数据在存储到文件中的时候是以追加方式拼接到文件末尾的,这…

【超级详细】基于Zynq FPGA对雷龙SD NAND的测试

目录 一、SD NAND特征1.1 SD卡简介1.2 SD卡Block图 二、SD卡样片三、Zynq测试平台搭建3.1 测试流程3.2 SOC搭建 一、SD NAND特征 1.1 SD卡简介 雷龙的SD NAND有很多型号,在测试中使用的是CSNP4GCR01-AMW与CSNP32GCR01-AOW。芯片是基于NAND FLASH和 SD控制器实现的…

[357]基于springboot的中小型制造企业质量管理系统

摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古…

数据结构:跳表实现(C++)

个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言跳表跳表的优化思路skiplist,平衡搜索树,哈希表的对比 实现思路SkiplistNodesearch 搜索add 增加earse 删除 整体…

Rancher的安装

1. 概览 1.1 用户界面优势 Rancher 提供了一个直观的图形用户界面(GUI)。对于不熟悉 Kubernetes 复杂的命令行操作(如使用kubectl)的用户来说,通过 Rancher 的界面可以方便地进行资源管理。例如,用户可以在…

文件上传和下载

目录 一、准备工作 二、文件上传 三、文件下载 一、准备工作 如果想使用Spring的文件上传功能,则需要再上下文中配置MultipartResolver前端表单要求:为了能上传文件,必须将表单的method设置为post,并将enctype设置为multipart…

Docker 镜像拉不动?自建 Docker Hub 加速站 解决镜像拉取失败

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 众所周知,6 月份的时候,Docker Hub 的镜像就已经无法正常拉取,那会随手用 Nginx 反代了一下 Docker Hub,建了个自用的镜像站,一直用到了 9 月份&…

真·香!深度体验 zCloud 数据库云管平台 -- DBA日常管理篇

点击蓝字 关注我们 zCloud 作为一款业界领先的数据库云管平台,通过云化自治的部署能力、智能巡检和诊断能力、知识即代码的沉淀能力,为DBA的日常管理工作带来了革新式的简化与优化。经过一周的深度体验,今天笔者与您深入探讨 zCloud 在数据库…

Qt的程序如何打包详细教学

生成Release版的程序 在打包Qt程序时,我们需要将发布程序需要切换为Release版本(Debug为调试版本),编译器会对生成的Release版可执行程序进行优化,使生成的可执行程序会更小。 debug版本 debug版本是一种开发过程中的…

适配器模式:类适配器与对象适配器

适配器模式是一种结构性设计模式,旨在将一个接口转换成客户端所期望的另一种接口。它通常用于解决由于接口不兼容而导致的类之间的通信问题。适配器模式主要有两种实现方式:类适配器和对象适配器。下面,我们将详细探讨这两种方式的优缺点及适…

语音识别:docker部署FunASR以及springboot集成funasr

内容摘选自: https://github.com/modelscope/FunASR/blob/main/runtime/docs/SDK_advanced_guide_offline_zh.md FunASR FunASR是一个基础语音识别工具包,提供多种功能,包括语音识别(ASR)、语音端点检测(VAD&#xf…

oracle-函数-NULLIF (expr1, expr2)的妙用

【语法】NULLIF (expr1, expr2) 【功能】expr1和expr2相等返回NULL,不相等返回expr1经典的使用场景: 1. 数据清洗与转换 在数据清洗过程中,NULLIF 函数可以用于将某些特定值(通常是无效或不需要的值)替换为 NULL&…

【LLM】Agentic Workflow的四种常见思路

note Reflection 和 Tool Use 属于比较经典且相对已经广泛使用的方式,Planning 和 Multi-agent 属于比较新颖比较有前景的方式。 文章目录 note一、四种设计模式1. Reflection2. Tool use3. Planning4. Multi-agent collaboration 二、相关代码实践 一、四种设计模…

Python数据可视化seaborn

产品经理在做数据分析时可能需要通过可视化来分析。seaborn官网 1. relplot 散点图 https://seaborn.pydata.org/examples/scatterplot_sizes.html import pandas as pd import seaborn as sns df pd.DataFrame({x: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],y: [8, 6, 7, 8, 4, 6,…

基于ssm的个人健康管理系统

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

CSS3新增渐变(线性渐变、径向渐变、重复渐变)

1.线性渐变 代码: 效果图: 使文字填充背景颜色: 效果图: 2.径向渐变 代码: 效果图: 代码图: 效果图: 3.重复渐变 代码: 效果图:

[mysql]mysql的DML数据操作语言增删改,以及新特性计算列,阿里巴巴开发手册mysql相关

1DML数据操作语言,增加删除改数据 插入数据INSERT 插入添加数据,两种方法 方式1:VALUES添加数据 #准备工作 USE atguigudb; CREATE TABLE IF NOT EXISTS emp1( id INT, name VARCHAR(15), hire_data DATE, salary DOUBLE(10,2)); SELECT * FROM emp1 INSERT INTO em…