YOLOv5改进 | 主干网络 | 用SimRepCSP作为主干网络提取特征【全网独家 + 降本增效】

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡

SimRepCSP 类似于 YOLOv7的主干网络,由卷积模块和重参数化卷积(RepConv)模块组合而成,以 Cross Stage Partial(CSP)网络作为模块之间的连接。通过将 SimRepCSP 作为替代主干纳入 YOLOv5,本文介绍了一种简单而有效的替代模块SimRepCSP 。在本文中,给大家带来的教程是在原来的主干网络修改为SimRepCSP 。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。

专栏地址: YOLOv5改进+入门——持续更新各种有效涨点方法 点击即可跳转

目录

1. 原理

2. SimRepCSP的代码实现

2.1 将SimRepCSP添加到YOLOv5中

SimRepCSP 主要流程:

2.2 新增yaml文件

2.3 注册模块

 2.4 执行程序

3. 完整代码分享

4. GFLOPs

5.总结


1. 原理

官方论文:Modified YOLO Model for Small Platform Application using SimRepCSP Module with Case Study——点击即可跳转

SimRepCSP 是一种针对 YOLO 模型的改进背骨模块,其设计旨在提高训练效率和模型性能,同时降低成本。以下是 SimRepCSP 的主要原理及其应用:

SimRepCSP 主要原理

  1. 模块组合:

    • 卷积模块:SimRepCSP 集成了标准的卷积模块。

    • 重新参数化卷积模块(RepConv):这些是专门设计的卷积层,通过增加模型参数来提高性能,而不会显著增加计算成本。

    • 跨阶段部分网络(CSP):该网络结构连接不同的模块,增强特征传播和网络学习能力。

  2. 结构和效率:

    • SimRepCSP 通过组合三个卷积模块、一个 RepConv 模块和一个连接到 CSP 网络的级联模块构建而成。

    • 这些模块排列的目的是最大化特征提取和重用,从而在减少参数数量的情况下提升性能。

    • 每个卷积模块都包含批量归一化和 SiLU 激活函数。

  3. 与 YOLO 的集成:

    • SimRepCSP 可以作为替代背骨集成到 YOLOv8 模型中,分别称为 SimRepCSPv1 和 SimRepCSPv2。这种集成旨在提升模型性能指标,相较于原始的 YOLOv8 背骨。

    • SimRepCSP 的架构包括一个焦点层、多层 SimRepCSP 模块和一个 SPPF(快速空间金字塔池化)模块,用于多尺度特征聚合。

  4. 实验结果:

    • 在 GlobalWheat2020 数据集上进行的实验表明,带有 SimRepCSP 模块(SimRepCSPv1 和 SimRepCSPv2)的模型在减少训练和应用成本的同时,实现了更高的性能指标。

    • 主要改进包括减少了 FLOPS(每秒浮点运算次数)、GPU 内存使用量和整体模型重量,同时保持或提高了目标检测的准确性。

  5. 目标和优势:

    • 降低计算成本:通过减少所需操作次数,SimRepCSP 旨在使模型更加高效。

    • 增强参数性能:通过微调和优化参数来提高模型的准确性和有效性。

    • 降低 GPU 内存成本:最小化内存需求以允许更大的批处理大小和更高效的训练。

    • 减少模型重量:创建一个轻量级模型,便于部署而不影响性能。

总结

SimRepCSP 通过优化网络架构、减少计算和内存成本以及增强特征提取和参数调优,显著提高了 YOLO 模型的效率和性能。

2. SimRepCSP的代码实现

2.1 将SimRepCSP添加到YOLOv5中

关键步骤一: 将下面代码粘贴到/projects/yolov5-6.1/models/common.py文件中

*注:代码过长,请查看完整代码 

class RepConv(nn.Module):# Represented convolution# https://arxiv.org/abs/2101.03697def __init__(self, c1, c2, k=3, s=1, p=None, g=1, act=True, deploy=False):super(RepConv, self).__init__()self.deploy = deployself.groups = gself.in_channels = c1self.out_channels = c2assert k == 3assert autopad(k, p) == 1padding_11 = autopad(k, p) - k // 2self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity()) #if deploy:self.rbr_reparam = nn.Conv2d(c1, c2, k, s, autopad(k, p), groups=g, bias=True)else:self.rbr_identity = (nn.BatchNorm2d(num_features=c1) if c2 == c1 and s == 1 else None)self.rbr_dense = nn.Sequential(nn.Conv2d(c1, c2, k, s, autopad(k, p), groups=g, bias=False),nn.BatchNorm2d(num_features=c2),)self.rbr_1x1 = nn.Sequential(nn.Conv2d( c1, c2, 1, s, padding_11, groups=g, bias=False),nn.BatchNorm2d(num_features=c2),)def forward(self, inputs):if hasattr(self, "rbr_reparam"):return self.act(self.rbr_reparam(inputs))if self.rbr_identity is None:id_out = 0else:id_out = self.rbr_identity(inputs)return self.act(self.rbr_dense(inputs) + self.rbr_1x1(inputs) + id_out)def get_equivalent_kernel_bias(self):kernel3x3, bias3x3 = self._fuse_bn_tensor(self.rbr_dense)kernel1x1, bias1x1 = self._fuse_bn_tensor(self.rbr_1x1)kernelid, biasid = self._fuse_bn_tensor(self.rbr_identity)return (kernel3x3 + self._pad_1x1_to_3x3_tensor(kernel1x1) + kernelid,bias3x3 + bias1x1 + biasid,)def _pad_1x1_to_3x3_tensor(self, kernel1x1):if kernel1x1 is None:return 0else:return nn.functional.pad(kernel1x1, [1, 1, 1, 1])def _fuse_bn_tensor(self, branch):if branch is None:return 0, 0if isinstance(branch, nn.Sequential):kernel = branch[0].weightrunning_mean = branch[1].running_meanrunning_var = branch[1].running_vargamma = branch[1].weightbeta = branch[1].biaseps = branch[1].epselse:assert isinstance(branch, nn.BatchNorm2d)if not hasattr(self, "id_tensor"):input_dim = self.in_channels // self.groupskernel_value = np.zeros((self.in_channels, input_dim, 3, 3), dtype=np.float32)for i in range(self.in_channels):kernel_value[i, i % input_dim, 1, 1] = 1

SimRepCSP 主要流程:

  1. 输入图片预处理:

    • 图片读取:从存储介质或摄像头读取输入图片。

    • 图片缩放:将图片缩放到模型所需的输入尺寸(例如,YOLOv8 通常使用 640x640 像素的输入大小)。

    • 归一化处理:将图片像素值归一化到 [0, 1] 区间。

  2. 特征提取(通过 SimRepCSP 模块):

    • 初始卷积和下采样:输入图片首先通过一个初始卷积层和下采样层,这有助于减少图片的空间尺寸并提取基本特征。

    • CSP 模块处理:图片特征进入多个 SimRepCSP 模块,每个模块由标准卷积、RepConv 和 CSP 网络组成。具体流程如下:

      • 标准卷积:标准卷积层提取局部特征。

      • RepConv:重新参数化卷积层在训练期间增强模型的表示能力。

      • CSP 网络:跨阶段部分网络将特征进行跨层传递和整合,进一步丰富特征表示。

  3. 多尺度特征提取:

    • 特征金字塔网络(FPN):SimRepCSP 结合特征金字塔网络,提取不同尺度的特征以应对不同尺寸的目标物体。

    • 空间金字塔池化(SPPF):在 SimRepCSPv1 和 SimRepCSPv2 中引入 SPPF 模块,用于多尺度特征的聚合和增强。

  4. 特征融合与预测:

    • 特征融合:将不同尺度的特征融合,生成最终的特征图。

    • 检测头:最终特征图传递给检测头,进行目标的分类和定位预测。检测头包括一系列的卷积层和激活函数,用于输出目标的类别和边界框坐标。

    2.2 新增yaml文件

    关键步骤二:在下/projects/yolov5-6.1/models下新建文件 yolov5_SimRepCSP.yaml并将下面代码复制进去

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# Parameters
nc: 80  # number of classes
depth_multiple: 1  # model depth multiple
width_multiple: 1  # layer channel multiple
anchors:- [10,13, 16,30, 33,23]  # P3/8- [30,61, 62,45, 59,119]  # P4/16- [116,90, 156,198, 373,326]  # P5/32# YOLOv5 v6.0 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2[-1, 1, Conv, [128, 3, 2]], #1 1-P2/4[-1, 1, Conv, [64, 1, 1]], #2[-1, 1, RepConv, [64, 3, 1]], #3[[-1,-2], 1, Concat, [1]], #4[-1, 1, Conv, [128, 1, 1]], #5[-1, 1, Conv, [256, 3, 2]],  #6/ 3-P3/8[-1, 1, Conv, [128, 1, 1]], #7[-1, 1, RepConv, [128, 3, 1]], #8[[-1,-2], 1, Concat, [1]], #9[-1, 1, Conv, [256, 1, 1]],  #10 -P4/16 [-1, 1, Conv, [512, 3, 2]], #11[-1, 1, Conv, [256, 1, 1]], #12[-1, 1, RepConv, [256, 3, 1]], #13[[-1,-2], 1, Concat, [1]], #14[-1, 1, Conv, [512, 1, 1]], #15[-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32 16[-1, 1, Conv, [512, 1, 1]], #17[-1, 1, RepConv, [512, 3, 1]], #18[[-1,-2], 1, Concat, [1]], #19[-1, 1, Conv, [1024, 1, 1]], #20[-1, 1, SPPF, [1024, 5]],  # 21]# YOLOv5 v6.0 head
head:[[-1, 1, Conv, [512, 1, 1]], #22[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 11], 1, Concat, [1]],  # cat backbone P4[-1, 3, C3, [512, False]],  # 25[-1, 1, Conv, [256, 1, 1]], #26[-1, 1, nn.Upsample, [None, 2, 'nearest']],[[-1, 6], 1, Concat, [1]],  #28 cat backbone P3[-1, 3, C3, [256, False]],  # 29 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1,26], 1, Concat, [1]],  # 31 cat head P4[-1, 3, C3, [512, False]],  # 32 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 22], 1, Concat, [1]],  #34 cat head P5[-1, 3, C3, [1024, False]],  #35 (P5/32-large)[[29, 32, 35], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)]

温馨提示:本文只是对yolov5l基础上添加模块,如果要对yolov5n/l/m/x进行添加则只需要指定对应的depth_multiple 和 width_multiple。


# YOLOv5n
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple# YOLOv5s
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple# YOLOv5l 
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple# YOLOv5m
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple# YOLOv5x
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple

2.3 注册模块

关键步骤三:在yolo.py中注册, 大概在260行左右添加 ‘RepConv’

 2.4 执行程序

在train.py中,将cfg的参数路径设置为yolov5_SimRepCSP.yaml的路径

建议大家写绝对路径,确保一定能找到

🚀运行程序,如果出现下面的内容则说明添加成功🚀

3. 完整代码分享

https://pan.baidu.com/s/17lq0bRONXbtMRgAalj77gA?pwd=39uq

 提取码: 39uq  

4. GFLOPs

关于GFLOPs的计算方式可以查看:百面算法工程师 | 卷积基础知识——Convolution

未改进的GFLOPs

改进后的GFLOPs

5.总结

SimRepCSP 是一种针对 YOLO 模型的改进backbone模块,其设计旨在提高训练效率和模型性能,同时降低成本。它通过集成标准卷积模块、重新参数化卷积模块(RepConv)和跨阶段部分网络(CSP)来增强特征传播和网络学习能力。SimRepCSP 的结构包括三个卷积模块、一个 RepConv 模块和一个连接到 CSP 网络的级联模块,这些模块的排列旨在最大化特征提取和重用,从而在减少参数数量的情况下提升性能。每个卷积模块都包含批量归一化和 SiLU 激活函数。SimRepCSP 可以作为替代backbone集成到 YOLOv5 模型中,分别称为 SimRepCSPv1 和 SimRepCSPv2,这种集成旨在提升模型性能指标,相较于原始的backbone。SimRepCSP 的架构包括一个焦点层、多层 SimRepCSP 模块和一个 SPPF(快速空间金字塔池化)模块,用于多尺度特征聚合。带有 SimRepCSP 模块的模型在减少训练和应用成本的同时,实现了更高的性能指标,主要改进包括减少了 FLOPS(每秒浮点运算次数)、GPU 内存使用量和整体模型重量,同时保持或提高了目标检测的准确性。SimRepCSP 的目标和优势在于通过减少所需操作次数降低计算成本,通过微调和优化参数增强参数性能,最小化内存需求以允许更大的批处理大小和更高效的训练,并创建一个轻量级模型,便于部署而不影响性能。总体而言,SimRepCSP 通过优化网络架构、减少计算和内存成本以及增强特征提取和参数调优,显著提高了 YOLO 模型的效率和性能。

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

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

相关文章

WPF Command 的使用

一、Command类的创建 >> 构造函数方法中传入了一个委托 public class MyCommand : ICommand { public readonly Action _action; public MyCommand(Action action) { this._action action; } public event EventHandler CanExecuteChanged;…

学习使用 Frida 过程中出现的问题

一、adb shell命令报错:error: no devices found 目前该问题解决方法仅供参考,可先看看再选择试试!!!!! 查看此电脑也会发现没有出现手机型号文件夹。 第一步: 检查一下手机开了u…

谷神后端代码模板:导入

SELECT NULL AS MID,NULL AS FILE_NAME,NULL AS FILE_PATH FROM DUAL;

【打印100个常用Linux命令】

#!/bin/bash 定义一个函数,用于打印100个常用Linux命令 print_commands() { echo “以下是一些常用的Linux命令:” echo “----------------------------------” echo “1. pwd - 显示当前工作目录” echo “2. ls - 列出当前目录下的文件和文件夹” …

qmt量化交易策略小白学习笔记第16期【qmt编程之获取北向南向资金(沪港通,深港通和港股通)】

qmt编程之获取北向南向资金 qmt更加详细的教程方法,会持续慢慢梳理。 也可找寻博主的历史文章,搜索关键词查看解决方案 ! 北向南向资金(沪港通,深港通和港股通) #北向南向资金交易日历 获取交易日列表…

【CentOS 7】CentOS 7极致指南:高级部署PyCharm 2022.3.3专业版,实现定制化配置与无缝桌面集成

【CentOS 7】CentOS 7极致指南:高级部署PyCharm 2022.3.3专业版,实现定制化配置与无缝桌面集成 大家好 我是寸铁👊 总结了一篇CentOS 7极致指南:高级部署PyCharm 2022.3.3专业版,实现定制化配置与无缝桌面集成✨ 喜欢的…

线性代数|机器学习-P10最小二乘法的四种方案

文章目录 1. 概述2. SVD奇异值分解3. 最小二乘法方程解4. 最小二乘法图像解释5. Gram-Schmidt 1. 概述 当我们需要根据一堆数据点去拟合出一条近似的直线的时候,就会用到 最小二乘法 .根据矩阵A的情况,有如下四种方法 在r n m 时,SVD奇异…

Day16—API爬取与数据整合

在网络爬虫的领域,API(应用程序编程接口)提供了一种更为直接和高效的方式来获取数据。与直接从网页内容中提取数据相比,API通常提供更结构化、更易于解析的数据格式。 1. API爬取的优势 速度:API请求通常比网页加载更快,因为它们返回的是数据本身,而不是包裹数据的HTML…

计算机网络-数制转换与子网划分

目录 一、了解数制 1、计算机的数制 2、二进制 3、八进制 4、十进制 5、十六进制 二、数制转换 1、二进制转十进制 2、八进制转十进制 3、十六进制转十进制 4、十进制转二进制 5、十进制转八进制 6、十进制转十六进制 三、子网划分 1、IP地址定义 2、IP的两种协…

Web前端初级考证:探索与征服数字世界的初始之旅

Web前端初级考证:探索与征服数字世界的初始之旅 在数字浪潮席卷而来的今天,Web前端技术成为了连接现实与虚拟的桥梁。对于初学者而言,通过Web前端初级考证,不仅是对自身技能的检验,更是迈向更高层次的关键一步。本文将…

【NetTopologySuite类库】C#生成带约束(线、面)的Delaunay三角网

介绍 API地址:https://nettopologysuite.github.io/NetTopologySuite/api/NetTopologySuite.Triangulate.ConformingDelaunayTriangulationBuilder.html#NetTopologySuite_Triangulate_ConformingDelaunayTriangulationBuilder_Constraints 约束为线 效果图 红色…

经典文献阅读之--P2O-Calib(利用点对空间遮挡关系的相机-激光雷达标定)

Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务,并且需要GPU资源,可以考虑使用UCloud云计算旗下的Compshare的GPU算力云平台。他们提供高性价比的4090 GPU,按时收费每卡2.6元,月卡只需要1.7元每小时&…

整除及求余运算符、数字的提取、顺序结构程序

1.运算符 在有余数的除法运算中,如果要知道商和余数分别是多少,可以用/和%这两个运算符号来得到。 (1)/(整除),当被除数和除数均为整数时,结果也为整型,只取商的整数部分。 如:10/25 10/33 5/10 0 (2)%(求余)&…

实战:部署三台kafka服务集群

欢迎围观+留言评论 部署三台kafka服务集群 安装Java环境 sudo yum update sudo yum install java-1.8.0-openjdk-devel java -version准备kafka安装包 kafka_2.13-2.8.2.tgz上传到服务器 解压缩 tar -xzf kafka_2.13-2.8.2.tgz建立软链接 ln -s /opt/kafka_2.13-2.8.2 /o…

倩女幽魂搬砖攻略:云手机自动托管搬砖刷本选哪家云手机?

欢迎来到《倩女幽魂手游》的世界,一个充满江湖恩怨的世界。在这个游戏中,你将扮演各个门派中的不同职业,踏上一段属于你自己的江湖之路。本攻略将为你详细介绍如何利用多开挂机搬砖,快速提升自己的实力,成为江湖中的一…

python - pandas常用计算函数

文中所用数据集有需要的可以私聊我获取 学习目标 知道排序函数nlargest、nsmallest和sort_values的用法 知道Pandas中求和、计数、相关性值、最小、最大、平均数、标准偏差、分位数的函数使用 1 排序函数 导包并加载数据集 import pandas as pd ​ # 加载csv数据, 返回df对…

Web前端HC:探索用户体验的深层次奥秘

Web前端HC:探索用户体验的深层次奥秘 在数字化时代的浪潮中,Web前端作为连接用户与数字世界的桥梁,其重要性不言而喻。而HC(Human-Computer Interaction,人机交互)作为Web前端领域的核心,更是直…

【C++数据结构与算法】队列

C队列 文章目录 C队列队列:queue基本函数经典例题 双端队列:deque成员类型基础函数访问与赋值容量修改器详细说明:assign() 详细说明:insert()详细介绍:resize() 双端例题:LC103 二叉树的锯齿形层序遍历 优…

VBA excel 表格将多行拆分成多个表格或 文件 或者合并 多个表格

excel 表格 拆分 合并 拆分工作表按行拆分为工作表工作表按行拆分为工作薄 合并操作步骤 拆分 为了将Excel中的数万行数据拆分成多个个每个固定行数的独立工作表,并且保留每个工作表的表头,你可以使用以下VBA脚本。这个脚本会复制表头到每个新的工作表&…

Java案例:找素数

文章目录 题目问题反思代码改进 题目 找素数 判断101-200之间有多少个素数&#xff0c;并输出所有素数 只需要除到 n/2 即可。 算数平方根。&#xff08;j*j<i&#xff09;实际上可以更高效地只除到Math.sqrt(n)&#xff08;或者说Math.sqrt(n) 1为了处理整数除法&#xf…