YOLOv7基础 | 手把手教你简化网络结构之yolov7.yaml(包括源码+封装步骤+网络结构图)

前言:Hello大家好,我是小哥谈。通过下载YOLOv7源码可知,原始的yolov7.yaml文件是拆开写的,比较混乱,也不好理解,并且为后续改进增添了很多困难。基于此种情况,笔者就给大家介绍一种将yolov7.yaml文件简化的方法,并且参数量和计算量和原来是一致的,区别只是yaml文件的写法不同!~🌈  

     目录

🚀1.背景介绍

🚀2.封装步骤

🚀3.具体方法

💥💥步骤1:common.py文件修改

💥💥步骤2:yolo.py文件修改

💥💥步骤3:创建自定义yaml文件

💥💥步骤4:修改自定义yaml文件

💥💥步骤5:验证是否加入成功

💥💥步骤6:修改默认参数

💥💥步骤7:实际训练测试

🚀1.背景介绍

YOLOv7是一种广泛用于实时目标检测的单阶段算法,其成功的一部分可以归功于灵活的yaml配置文件。然而,随着项目的发展,配置文件可能变得庞大而复杂。在本博文中,我们将学习如何简化YOLOv7的yaml配置文件,以提高可读性可维护性

封装后具体的结构可以参考下列的网络结构图,图中的模块都是和yaml配置文件一一对应的。👇

改进后的代码作者已上传至“下载”中,大家学习的时候可自行下载。 👇


🚀2.封装步骤

针对YOLOv7源码封装,具体步骤如下所示:👇

步骤1:common.py文件修改

步骤2:yolo.py文件修改

步骤3:创建自定义yaml文件

步骤4:修改自定义yaml文件

步骤5:验证是否加入成功

步骤6:修改默认参数

步骤7:实际训练测试


🚀3.具体方法

💥💥步骤1:common.py文件修改

从上述网络结构图上可以看出,我们需要封装的模块分为ELANMP1MP2ELAN_H这几个模块。

common.py中添加ELAN、MP1、MP2、ELAN-H这几个模块的代码,所要添加模块的代码如下所示,将其复制粘贴到common.py文件末尾的位置。

# 需要添加模块的代码
class ELAN(nn.Module):def __init__(self, c1, c2,e=0.5):''':param c1: 输入通道:param c2: 这里给的是中间层的输出通道:param flg: 判断是否为backbone的最后一层,因为这里的输出通道数有所改变'''super(ELAN, self).__init__()c_ = int(c1 *e)self.conv1 = Conv(c1, c_, k=1, s=1)self.conv2 = Conv(c1, c_, k=1, s=1)self.conv3 = Conv(c_, c_, k=3, s=1)self.conv4 = Conv(c_, c_, k=3, s=1)self.conv5 = Conv(c_, c_, k=3, s=1)self.conv6 = Conv(c_, c_, k=3, s=1)self.conv7 = Conv(4 * c_, c2, k=1, s=1)def forward(self, x):# 分支一输出output1 = self.conv1(x)# 分支二输出output2_1 = self.conv2(x)output2_2 = self.conv3(output2_1)output2_3 = self.conv4(output2_2)output2_4 = self.conv5(output2_3)output2_5 = self.conv6(output2_4)output_cat = torch.cat((output1, output2_1, output2_3, output2_5), dim=1)return self.conv7(output_cat)class ELAN_H(nn.Module):def __init__(self, c1, c2,e1=0.5,e2=0.25):''':param c1: 输入通道:param c2: 这里给的是中间层的输出通道:param flg: 判断是否为backbone的最后一层,因为这里的输出通道数有所改变'''super(ELAN_H, self).__init__()c_ = int(c1 * e1)c_hidden = int(c1 *e2)self.conv1 = Conv(c1, c_, k=1, s=1)self.conv2 = Conv(c1, c_, k=1, s=1)self.conv3 = Conv(c_, c_hidden, k=3, s=1)self.conv4 = Conv(c_hidden, c_hidden, k=3, s=1)self.conv5 = Conv(c_hidden, c_hidden, k=3, s=1)self.conv6 = Conv(c_hidden, c_hidden, k=3, s=1)self.conv7 = Conv(2 * c1, c2, k=1, s=1)def forward(self, x):''':param x: 输入:return:'''# 分支一输出output1 = self.conv1(x)# 分支二输出output2_1 = self.conv2(x)output2_2 = self.conv3(output2_1)output2_3 = self.conv4(output2_2)output2_4 = self.conv5(output2_3)output2_5 = self.conv6(output2_4)output_cat = torch.cat((output1, output2_1, output2_2, output2_3, output2_4, output2_5), dim=1)return self.conv7(output_cat)class MPConv(nn.Module):def __init__(self, c1, e=0.5):''':param ch_in: 输如通道:param ch_out: 这里给的是中间层的输出通道'''c_ = int(c1 * e)super(MPConv, self).__init__()# 分支一self.conv1 = nn.Sequential(nn.MaxPool2d(2, 2),Conv(c1, c_, 1, 1),)# 分支二self.conv2 = nn.Sequential(Conv(c1, c_, 1, 1),Conv(c_, c_, 3, 2),)self.cat=Concat()def forward(self, x):# 分支一output1 = self.conv1(x)# 分支二output2 = self.conv2(x)output=self.cat((output1, output2))return output

说明:♨️♨️♨️

MPConv模块包括两种结构,分别是MP1和MP2,请注意分别,关于详细差异请参考后续对yolov7.yaml文件的解析文章。

💥💥步骤2:yolo.py文件修改

修改1,在yolo.py文件中找到parse_model函数(443行左右),加入ELAN、ELAN_H。

修改2,在yolo.py文件中找到parse_model函数,然后再找到elif m is nn.BatchNorm2d:语句(493行左右),在其前面加入代码:

        elif m is MPConv:if args[0] == 1:c2 = ch[f] * 2args = [ch[f], *args]

关于这两处修改,具体如下图所示:

💥💥步骤3:创建自定义yaml文件

cfg/traning中复制yolov7.yaml,粘贴并重命名为yolov7_simplify.yaml具体如下图所示:

💥💥步骤4:修改自定义yaml文件

根据上述YOLOv7网络结构图进行修改。修改后的完整yaml文件如下所示:

# parameters
nc: 80  # number of classes
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple# anchors
anchors:- [12,16, 19,36, 40,28]  # P3/8- [36,75, 76,55, 72,146]  # P4/16- [142,110, 192,243, 459,401]  # P5/32# yolov7 backbone
backbone:# [from, number, module, args][[-1, 1, Conv, [32, 3, 1]],  # 0[-1, 1, Conv, [64, 3, 2]],  # 1-P1/2[-1, 1, Conv, [64, 3, 1]],[-1, 1, Conv, [128, 3, 2]],  # 3-P2/4[-1, 1, ELAN, [256,0.5]],  # 4[-1, 1, MPConv, [0.5]],[-1, 1, ELAN, [512, 0.5]],  # 6[-1, 1, MPConv, [0.5]],[-1, 1, ELAN, [1024,0.5]],  # 8[-1, 1, MPConv, [0.5]],[-1, 1, ELAN, [1024,0.25]],  # 10]# yolov7 head
head:[[-1, 1, SPPCSPC, [512]], # 11 54[-1, 1, Conv, [256, 1, 1]],#12[-1, 1, nn.Upsample, [None, 2, 'nearest']],[8, 1, Conv, [256, 1, 1]], # 14 route backbone P4[[-1, -2], 1, Concat, [1]], # 15[-1, 1, ELAN_H, [256,0.5,0.25]], #16[-1, 1, Conv, [128, 1, 1]], #17[-1, 1, nn.Upsample, [None, 2, 'nearest']], #18[6, 1, Conv, [128, 1, 1]], # route backbone P3 19[[-1, -2], 1, Concat, [1]], # 20[-1, 1, ELAN_H, [128,0.5,0.25]], #21[-1, 1, MPConv, [1]], # 22[[-1, 16], 1, Concat, [1]],# 23[-1, 1, ELAN_H, [256,0.5,0.25]], # 24[-1, 1, MPConv, [1]], # 25[[-1, 11], 1, Concat, [1]], # 26[-1, 1, ELAN_H, [512,0.5,0.25]], #27[21, 1, RepConv, [256, 3, 1]],[24, 1, RepConv, [512, 3, 1]],[27, 1, RepConv, [1024, 3, 1]],[[28,29,30], 1, Detect, [nc, anchors]],   # Detect(P3, P4, P5)]

💥💥步骤5:验证是否加入成功

yolo.py文件里,将配置改为我们刚才自定义的yolov7_simplify.yaml

修改1,位置位于yolo.py文件237行左右,具体如图所示:

修改2,位置位于yolo.py文件529行左右,具体如下图所示: 

注意,需要修改的代码格式如下所示:

../cfg/training/yolov7_simplify.yaml

配置完毕之后,点击“运行”,结果如下图所示:

由运行结果可知,与我们前面的封装后的YOLOv7网络结构图相一致,证明封装成功了!✅ 

💥💥步骤6:修改默认参数

train.py文件中找到parse_opt函数,然后将第二行 '--cfg的default改为 'cfg/training/yolov7_simplify.yaml',然后就可以开始进行训练了。🎈🎈🎈 

💥💥步骤7:实际训练测试

经过实际训练测试,没有发生报错,模型正常训练,具体如下图所示:

安全帽数据集上,经过100轮实际训练测试,得到结果如下:


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

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

相关文章

深入理解 Spark(三)SparkTask 执行与 shuffle 详解

SparkTask 的分发部署与启动流程分析 Spark Action 算子触发 job 提交 Spark 当中 Stage 切分源码详解 Task 的提交与执行 SparkShuffle 机制详解 MapReduceShuffle 全流程深度剖析 MapReduce 全流程执行过程中参与工作的组件以及他们的执行先后顺序:InputFormat …

【AIGC】电影风格的一组绝美高清图提示词解析

实际示例 女人主角,以时尚电影风格为灵感,追求照片般的逼真度,运用伦勃朗式光线,创造奇幻且细节丰富的场景,充满象征意义,使用3D渲染技术达到8K超高清晰度。 分类相关信息主角女人风格时尚电影风格逼真度…

LLM漫谈(三)| 使用Chainlit和LangChain构建文档问答的LLM应用程序

一、Chainlit介绍 Chainlit是一个开源Python包,旨在彻底改变构建和共享语言模型(LM)应用程序的方式。Chainlit可以创建用户界面(UI),类似于由OpenAI开发的ChatGPT用户界面,Chainlit可以开发类似…

5 个适用的免费数据恢复软件【2024 年 版本】

互联网上有许多免费的数据恢复软件产品。有些产品是免费软件,而其他产品则提供该工具的免费试用下载以进行评估。我们列出了2024 年 5 款最佳数据恢复工具 ,可以免费下载和试用。 5 个适用的免费数据恢复软件 1.奇客数据恢复(Windows和Mac&am…

Apache-Common-Pool2中对象池的使用方式

最近在工作中,对几个产品的技术落地进行梳理。这个过程中发现一些朋友对如何使用Apache的对象池存在一些误解。所以在写作“业务抽象”专题的空闲时间里,本人觉得有必要做一个关于对象池的知识点和坑点讲解。Apache Common-Pool2 组件最重要的功能&#…

中仕公考:2024年上半年中小学教师资格考试(笔试)报名已开始

2024年上半年中小学教师资格考试(笔试)报名工作于1月12日开始,此次笔试在31个省(自治区、直辖市)举办,各省(自治区、直辖市)的报名公告将陆续上网。 个别地区报名截止时间有所差异,上海1月13日报名截止,浙江、天津、河南1月14日截…

负荷预测 | Python基于CEEMDAN-VMD-BiGRU的短期电力负荷时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 提出一种分解去噪、重构分解的 CEEMDAN-VMD-BiGRU组合预测方法: 1 采用CEEMDAN将原始电力负荷数据分解成一组比较稳定的子序列,联合 小波阈值法将含有噪声的高频分量去噪,保留含有信…

微服务技术要点

一、服务注册到nacos 1.下载nacos,修改nacos启动模式为单机模式,另外需要在环境变量配置JAVA_HOME,否则启动不起来。 2.启动类加注解EnableDiscoveryClient 3.application.yml配置nacos地址 spring:cloud:nacos:discovery:server-addr: 127.0.0.1:884…

springboot怎样设置全局的traceId(包括MQ)

一、Controller打印TraceId 1、拦截所有的controller,输入输出将traceId放入MDC中: package com.perkins.ebicycle.mobile.trace;import java.util.Arrays; import java.util.List; import java.util.UUID; import java.util.stream.Collectors;import…

华为设备登录安全配置案例

知识改变命运,技术就是要分享,有问题随时联系,免费答疑,欢迎联系! 厦门微思网络​​​​​​ https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle O…

Python+甘特图及标签设置

图示 甘特图代码 import matplotlib.pyplot as plt import numpy as npclass ProjectEmement:def __init__(self, name_, starttime_: float, endtime_: float, fact_endtime_: float, grade_, rootlist_: list, keylist_: list, isover_=-1):self.name = name_self.starttime…

宝塔nginx部署前端页面刷新报404

问题: 当我们使用脚手架打包前端项目的时候,如果前端项目并没有静态化的配置,如以下 当我们刷新页面,或进行路由配置访问的时候就会报404的错误 原因: 这是因为通常我们做的vue项目属于单页面开发。所以只有index.html…

【教程】华为数据恢复的5个简单方法

您刚刚不小心从华为手机中删除了一些重要文件,现在您迫切希望将它们找回来。如果是这样,那么您现在可能会感到沮丧和无助。您可能已向您的朋友寻求帮助或在互联网上搜索答案,但似乎无济于事。 华为数据恢复的5个简单方法 好吧,别…

MyBatis第二课,灰度发布,@Results注解,使用xml书写mysql

目录 打印MyBatis的日志配置: 灰度发布:指发布环境,比如发布环境有200台机器,发布的时候是一批一批的机器的发布 2.删除与修改 使用Results注解,这样就和上面的别名一个意思,column是数据库的列 自动转驼峰&#…

学习资料: uni-app HBuilderX

编译器:HBuilderX HBuilderX-高效极客技巧 uni-app介绍:uni-app官网 uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序&#…

根据gbt81702008数值修约的C#函数

#region 修约函数/// </summary>/// <param name"data_val">输入数值</param>/// <param name"len">保留几位小数</param>/// <returns></returns>public static decimal round_gbt8170(decimal data_val,int l…

Unity组件开发--UI管理器

1.Canvas组件&#xff1a; 注意属性&#xff1a; &#xff08;1&#xff09;渲染模式是&#xff1a;屏幕空间相机 &#xff08;2&#xff09;创建一个UICamera节点&#xff0c;管理相机 &#xff08;3&#xff09;屏幕画布缩放模式 &#xff08;4&#xff09;画布下挂载两…

Android-基础

Activity生命周期 1.启动Activity&#xff1a;系统会先调用onCreate方法&#xff0c;然后调用onStart方法&#xff0c;最后调用onResume&#xff0c;Activity进入运行状态。 2.当前Activity被其他Activity覆盖其上或被锁屏&#xff1a;系统会调用onPause方法&#xff0c;暂停当…

Pandas实战100例-专栏介绍

Pandas&#xff0c;Python数据科学的心脏&#xff0c;是探索和分析数据世界的强大工具。想象一下&#xff0c;用几行代码就能洞察庞大数据集的秘密&#xff0c;无论是金融市场趋势还是社交媒体动态。 通过Pandas&#xff0c;你可以轻松地整理、清洗、转换数据&#xff0c;将杂…

山西电力市场日前价格预测【2024-01-15】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-15&#xff09;山西电力市场全天平均日前电价为399.10元/MWh。其中&#xff0c;最高日前电价为583.33元/MWh&#xff0c;预计出现在18:15。最低日前电价为275.09元/MWh&#xff0c;预计…