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,一经查实,立即删除!

相关文章

企业如何判断定岗定编是否合理?

定岗定编是一项最为基础的人力资源管理工作。定岗是指明确企业所需要的岗位;定编是指明确企业需要多少适合企业发展的个人。在企业组织结构确定之后,紧接着的问题就是定岗定编。定岗定编涉及企业业务目标的落实、员工能力和数量的匹配,科学合…

已解决java.lang.NoSuchFieldException异常的正确解决方法,亲测有效!!!

已解决java.lang.NoSuchFieldException异常的正确解决方法,亲测有效!!! 文章目录 问题分析 报错原因 解决思路 解决方法 总结 问题分析 NoSuchFieldException是一个常见异常,它通常与反射(Reflectio…

深入理解 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…

开发你的第一个 Python3 程序

简介 “Hello, World!” 程序是一个经典的,确立已久的传统电脑程序。"Hello, World!"因为能展示一个语言的基本句法,因此常被用作初学者的第一个"简单但完整"的程序,并可以被用来测试编程环境。 这个教程将指导你写出第…

宝塔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…

投手最核心的能力是什么?

巨量广告的本质是用户体验和流量成本 广告投放系统升级的越智能说明三点&#xff1a; 1: 流量顶到天了 2: 系统对用户人群价值计算的准确度提高 3&#xff1a;素材越来越卷 而对于投手来说&#xff1a; 入行门槛降低&#xff0c;操作层面简单&#xff0c;系统能用算法集合…