【YOLOv5进阶】——模型结构与模型原理YOLOv5源码解析

一、基础知识

1、backbone

backbone是核心组成部分,主要负责提取图像特征。具体来说,backbone通过一系列的卷积层和池化层对输入图像进行处理,逐渐降低特征图的尺寸同时增加通道数,从而保留和提取图像中重要的特征。这些提取出的特征图会进一步传递给后续的特征金字塔网络(neck)和检测头(head)进行处理。

在YOLOv5中,常见的Backbone网络包括CSPDarknet53或ResNet等,这些网络都是相对轻量级的,能够在保证较高检测精度的同时,尽可能地减少计算量和内存占用。其结构主要包括Conv模块、C3模块和SPPF模块,其中Conv模块由卷积层、BN层和激活函数组成,C3模块负责将前面的特征图进行自适应聚合,而SPPF模块则通过全局特征与局部特征的加权融合,获取更全面的空间信息。

2、head

head是负责进行物体检测和边界框预测的关键部分。它的主要工作是对backbone和neck部分提取的特征进行进一步的处理和解析,以生成最终的检测结果。

具体来说,head部分会对特征图进行解码,生成一系列预测框,并对这些预测框进行坐标和类别的预测。它还会对这些预测框进行非极大值抑制(NMS)等后处理操作,以消除冗余的检测结果,并输出最终的物体位置和类别信息。

与backbone相比,head更侧重于对特征的解析和预测,而backbone则更侧重于对原始图像的特征提取。两者在YOLOv5算法中共同协作,以实现高效、准确的目标检测。


二、模型结构yaml文件逐行分析

关于模型结构的文件在项目的“models”目录下,如common.py、yolo.py、yolov5.yaml文件,主要是yaml文件。

之前我们使用的是yolov5s.yaml文件,打开分以下3部分:

1、Parameters

nc为类别,分类类别默认80种,对应模型自带的coco文件。

depth_multiple和width_multiple分别是深度和宽度。backbone和head里面的number和arg参数与这个有关,具体见下面。

anchors为3个特征图,每个特征图里有3组锚框(yolo算法的基础知识)。

# Parameters
nc: 80  # number of classes,分类类别默认80种,对应自带的coco文件
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # 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

2、backbone

第一个重点(对应第1-10层),注释[from, number, module, args]:

from说明从哪里来,如-1表示从上一层来;

number说明当前模块要重复几次,一般为1,C3模块不是1,这个参数需要乘以depth_multiple参数然后与1比较取最大值;

module说明用的哪个模块,如Conv卷积模块、C3模块;

args说明实例化这个模块需要传进的参数,如输出通道数,卷积核大小,步长等参数。如Conv[0]的输出通道数为64,输出通道数需要乘以width_multiple参数然后与1比较取最大值,比如这里64x0.5=32>1说明经过Conv[0]后实际的输出通道数是32(其实与下面Tensorboard可视化方式里展示的结果对应)

# 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-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 6, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 3, C3, [1024]],
   [-1, 1, SPPF, [1024, 5]],  # 9
  ]

各模块一定方式联结就构成了网络结构,只看代码可视化效果不好,可借助“Tensorboard”可视化,pycharm终端输入:

tensorboard --logdir runs

回车会出现一个链接,ctrl+左键点击可跳转TensorBoard网页:

双击中间的DetectModel,可查看详细细节:

比如点击第一个卷积层Conv[0],右侧会出现经过该层后数据的维度等产生了哪些变化:

可见输入通道为3,与下面深入介绍的train.py文件的ch默认参数对应,图像尺寸是640x640,经过第一个卷积层Conv1后输出通道是32,图像尺寸从640x640变为了320x320,尺寸变化与代码的注释# 0-P1/2(除以2)是对应的,而注释中的0代表该层(模块)的编号。往后看可以发现每经过一个Conv卷积层,就相当于经过了一次下采样。

3、head

第二个重点(对应第11-25层),分析方法与上面的backbone类似也是对照上面的图,Conv卷积层;Upsample上采样;Contact意思为做拼接,所以第一个from参数为一个列表,即将上一层和第6层拼接起来(需保证两者维度相同),可对照上面的可视化图...后面以此类推。

注释中需要注意的点,第18、21、24层(对应标号17、20、23)分别做了8倍、16倍、32倍下采样,分别用来检测较小、中等、较大尺寸的目标。

# YOLOv5 v6.0 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

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

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

后续修改模型也是在这里面修改!


三、训练时各文件之间的关系

上面简单介绍了定义模型结构的yaml文件,那么具体底层运行时怎么生成网络结构的呢?

打开train.py文件,找到定义的train函数


大概在第130行左右有一行,里面的cfg参数就是传入上面定义模型结构的yaml文件,ch为输入输出通道数,nc是上面在yaml文件的类别,这里可以传参,传后就按传入的新的类别,anchors为上面介绍的锚框:

model = Model(cfg, ch=3, nc=nc, anchors=hyp.get('anchors')).to(device)  # create

若想查看Model类的定义,按住ctrl,鼠标左击Model类,跳转到yolo.py文件,该文件设定了网络结构的传参细节


上图可以发现Model=DetectionModel,再跳转到DetectionModel类,可发现cfg参数默认就是yolov5s.yaml,说明当train.py中不指定模型结构参数cgf时,默认使用这个.yaml文件。


DetectionModel类第178行-185行定义模型:

  • 判断nc类别与默认是否相同,不相同传入设置的nc类别
  • anchors锚框。。。
  • parse_model函数传入.yaml网络结构配置文件,传入输入通道数ch

跳转到parse_model函数的定义处,d参数就是传配置文件.yaml(对照上图),函数里读取配置文件d的一些参数,然后对锚框的参数进行一些计算;从第210行开始就开始遍历yaml文件的backbone和head网络结构;第316行的n(depth gain)就是Parameters里面讲的depth_multiple深度参数,做一些缩放;

第317行开始对网络结构传入一些参数,如Conv的原始定义可跳转到common.py文件进行分析,该文件定义了每个模块实现的详情

博主讲的非常细icon-default.png?t=N7T8https://www.bilibili.com/video/BV1bL411r7bJ/?p=12&share_source=copy_web&vd_source=8f7729bb666414c7bb823ad003dc6e38

总结:网络的具体结构在common.py、yolo.py、yolov5s.yaml这三个文件,修改网络结构是从这三个文件入手!

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

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

相关文章

标准发布 | 废水处理减污降碳协同评估指南(碳中和标准)

本文件主编单位:北京林业大学、北京交通大学、中国电建集团华东勘测设计研究院有限公司、 眉山市城投中恒能环保科技有限公司、 中华环保联合会水环境治理专业委员会。 本文件参编单位:中国市政工程中南设计研究总院有限公司、湖北君集环境科技股份有 公…

新型的余热回收系统为印染行业的节能减排助力

上海国际纺织机械展会上,一款新型的余热回收系统引起了印染界大佬们的关注。我国是纺织大国,纺织行业是我国的重要支柱产业。作为传统的能耗大户,印染行业能源消耗占非常高,尤其是定型机能耗。在能源价格不断上涨和环保要求日益严格的背景下,降低定型机能耗、提高能源利用效率成…

【Spring Cloud Alibaba】服务注册与发现+远程调用

目录 注册微服务到Nacos(服务提供者)创建项目修改依赖信息添加启动注解添加配置信息启动服务,Nacos控制台查看服务列表 注册微服务到Nacos(服务消费者)创建项目添加依赖信息添加启动注解添加配置信息启动服务&#xff…

学生信息管理系统C++

设计目的 使学生进一步理解和掌握课堂上所学的面向对象C编程知识,巩固和加深学生对C面向对象课程的基本知识的理解和掌握。掌握C面向对象编程和程序调试的基本技能,学会利用C语言进行基本的软件设计,着重提高运用C面向对象语言解决实际问题的…

生成式 AI——ChatGPT、Dall-E、Midjourney 等算法理念探讨

1.概述 艺术、交流以及我们对现实世界的认知正在迅速地转变。如果我们回顾人类创新的历史,我们可能会认为轮子的发明或电的发现是巨大的飞跃。今天,一场新的革命正在发生——弥合人类创造力和机器计算之间的鸿沟。这正是生成式人工智能。 生成模型正在模…

【遂愿赠书 - 1期】:安恒“网安三剑客”-大模型时代下的网络安全实战指南

文章目录 一、图书背景二、网安实战宝典2.1《内网渗透技术》2.2《渗透测试技术》2.3《Web应用安全》 三、校企合作,产学研结合四、大模型时代的数字安全五、 网络安全无小事 一、图书背景 大模型风潮已掀起,各大巨头争相入局,从ChatGPT到Sor…

研学活动报名收集材料怎么写?教程来了!

研学活动作为学校教育的重要组成部分,不仅能够拓宽学生的视野,还能促进家校沟通。学生们报名还是十分积极踊跃的,然而研学活动报名收集材料该怎么写却困扰着不少老师,其实只需要把姓名和联系方式等收集全就可以了,主要…

Go Modules 使用

文章参考https://blog.csdn.net/wohu1104/article/details/110505489 不使用Go Modules,所有的依赖包都是存放在 GOPATH /pkg下,没有版本控制。如果 package 没有做到完全的向前兼容,会导致多个项目无法运行(包版本需求不同)。 于是推出了g…

遥感卫星影像处理流程

当空中的遥感卫星获取了地球数字影像,并传回地面,是否工作就结束了?答案显然是否定的,相反,这正是遥感数字图像处理工作的开始。 遥感数字图像(Digital image,后简称“遥感影像”)是…

FTP

文章目录 概述主动模式和被动模式的工作过程注意事项 概述 文件传输协议 FTP(File Transfer Protocol)在 TCP/IP 协议族中属于应用层协议,是文件传输标准。主要功能是向用户提供本地和远程主机之间的文件传输,尤其在进行版本升级…

数据分析每周挑战——心衰患者特征数据集

这是一篇关于医学数据的数据分析,但是这个数据集数据不是很多。 背景描述 本数据集包含了多个与心力衰竭相关的特征,用于分析和预测患者心力衰竭发作的风险。数据集涵盖了从40岁到95岁不等年龄的患者群体,提供了广泛的生理和生活方式指标&a…

【Linux终端探险】:从入门到熟练,玩转基础命令的秘密(二)

文章目录 🚀Linux基础命令(二)🌈1. 寻找目录/文件命令⭐2. 创建文件命令👊3. 网络接口查询命令❤️4. 打包命令💥5. 解压命令 上期回顾: 🔥🔥🔥【Linux终端探…

CMakeFile.txt通过sysroot方式后生成makefile报错

报错信息如下: -- The C compiler identification is unknown -- The CXX compiler identification is unknown -- Check for working C compiler: /home/xj/asm/host/bin/aarch64-buildroot-linux-gnu-gcc -- Check for working C compiler: /home/xj/asm/host/bi…

英伟达GeForce发布《星球大战:亡命之徒》宣传片,8月30日开售

易采游戏网6月3日消息:英伟达GeForce近日发布了一款激动人心的宣传片,展示了备受期待的游戏大作《星球大战:亡命之徒》。该宣传片不仅展现了游戏的华丽画面和引人入胜的故事情节,还重点介绍了支持NVIDIA DLSS 3.5、光线追踪和Refl…

工业级物联网边缘网关解决方案-天拓四方

随着工业4.0时代的到来,越来越多的企业开始寻求智能化升级,以提高生产效率、降低运营成本并增强市场竞争力。然而,在实际的转型升级过程中,许多企业面临着数据孤岛、设备兼容性差、网络安全风险高等问题,这些问题严重制…

mybatis+vue2前后端分离

目录 后端样例目录结构: ​编辑pom.xml文件 连接数据库信息(mysql): config.properties 全部配置文件:mybatis-config.xml 包装sqlSessionFactory(减少代码耦合) 实体类food: 编写mapper.…

SpringCloud网关-gateway

一 什么是网关?为什么选择 Gateway? 网关功能如下: 身份认证和权限校验服务路由、负载均衡请求限流 在 Spring Cloud 中网关的实现包含两种: Gateway(推荐):是基于 Spring5 中提供的 WebFlux &#xff…

仿真文件下载审核 有效保障HPC环境下的数据安全性

仿真文件在科学、工程和技术领域中具有重要性,所以确保仿真文件的安全性是非常重要的,特别是当这些文件包含敏感信息或涉及到关键的业务操作时。在获取仿真文件时,仿真文件下载审核这个流程也比较重要的。 审核仿真文件下载,你需要…

SAP 日期函数

1.计算两个时间的时间差:cl_abap_tstmp>subtract DATA: tstmp1 TYPE timestampl, tstmp2 TYPE timestampl, diff TYPE tzntstmpl. " P代表秒 " 获取两个时间戳 tstmp1 20230911183000. tstmp2 20230911153000. diff cl_abap_tstmp&g…

第 53 期:MySQL 创建了用户却无法登陆

社区王牌专栏《一问一实验:AI 版》全新改版归来,得到了新老读者们的关注。其中不乏对 ChatDBA 感兴趣的读者前来咨询,表达了想试用体验 ChatDBA 的意愿,对此我们表示感谢 🤟。 目前,ChatDBA 还在最后的准备…