YOLOv5s网络模型讲解(一看就会)

news2024/10/3 4:34:03

文章目录

  • 前言
  • 1、YOLOv5s-6.0组成
  • 2、YOLOv5s网络介绍
    • 2.1、参数解析
    • 2.2、YOLOv5s.yaml
    • 2.3、YOLOv5s网络结构图
  • 3、附件
    • 3.1、yolov5s.yaml 解析表
    • 3.2、 yolov5l.yaml 解析表
  • 总结

前言

最近在重构YOLOv5代码,本章主要介绍YOLOv5s的网络结构

1、YOLOv5s-6.0组成

我们熟知YOLOv5s由三部分组成,分别为backbone、neck、head

  1. backbone:主干网络,大多时候指的是提取特征的网络,其作用就是提取图片中的信息,供后面的网络使用。backbone主干网络可以直接加载官方已经训练好的模型参数,此外其后面,添加自己需要的网络,让自定义模型更加贴合实际使用。
  2. neck:放在backbone和head之间,进一步利用backbone提取的特征,提高模型的鲁棒性
  3. head:获取网络输出,head利用之前提取的特征,做出预测。

2、YOLOv5s网络介绍

2.1、参数解析

  1. nc:数据集中的类别数

  2. depth_multiple:模型层数因子(用来调整网络的深度)

    1. 为了控制层的重复的次数。它会和后面的backbone & head的number相乘后取整,代表该层的重复的数量
    2. 如:[[-1, 1, Conv, [64, 6, 2, 2]],当depth_multiple为1时候,则重复1*1个
  3. width_multiple:模型通道数因子(用来调整网络的宽度)

    1. 为了控制输出特征图的通道数,它会和出特征图的通道数相乘,代表该层的输出通道数。
    2. 如:[[-1, 1, Conv, [64, 6, 2, 2]],当width_multiple为0.5时候,则输出通道为64*0.5=32通道
  4. anchors:锚定框

    1. yolov5 初始化了 9 个 anchors,分别在三个特征图 (feature map)中使用,每个 feature map 的每个 grid cell (网络单元)都有三个 anchor 进行预测。分配规则:
      • 尺度越大的 feature map 越靠前,相对原图的下采样率越小,感受野越小,所以相对可以预测一些尺度比较小的物体(小目标),分配到的 anchors 越小。
      • 尺度越小的 feature map 越靠后,相对原图的下采样率越大,感受野越大,所以可以预测一些尺度比较大的物体(大目标),所以分配到的 anchors 越大。
      • 即在小特征图(feature map)上检测大目标,中等大小的特征图上检测中等目标,在大特征图上检测小目标。
  5. [from, number, module, args] 参数

  6. 第一个参数 from :从哪一层获得输入,-1表示从上一层获得,[-1, 6]表示从上层和第6层两层获得。

  7. 第二个参数 number:表示有几个相同的模块,如果为9则表示有9个相同的模块。

  8. 第三个参数 module:模块的名称,这些模块写在common.py中。

  9. 第四个参数 args:类的初始化参数,用于解析作为 moudle 的传入参数。

    1. args参数依次为:输出channel,卷积核尺寸kernel size,步长stride,l零填充大小

2.2、YOLOv5s.yaml

nc: 80  # number of classes 数据集中的类别数,也就是你要检测的类别数
depth_multiple: 0.33  # model depth multiple  模型层数因子(用来调整网络的深度)
width_multiple: 0.50  # layer channel multiple 模型通道数因子(用来调整网络的宽度)
 
anchors: # 表示作用于当前特征图的Anchor大小为 xxx
# 9个anchor,其中P表示特征图的层级,P3/8该层特征图缩放为1/8,是第3层特征
  - [10,13, 16,30, 33,23]  # P3/8, 表示[10,13],[16,30], [33,23]3个anchor
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32
 
 
# YOLOv5s v6.0 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2,通过该层之后特征图的大小变成原图的1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4,通过该层之后特征图的大小变成原图的1/4
   [-1, 3, C3, [128]],          # 2,通过该层之后特征图的大小不变
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8,过该层之后特征图的大小变成原图的1/8
   [-1, 6, C3, [256]],			# 4,通过该层之后特征图的大小不变
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16,,过该层之后特征图的大小变成原图的1/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 3, C3, [1024]],
   [-1, 1, SPPF, [1024, 5]],  # 9
  ]
 
# YOLOv5s v6.0 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']], #11 不改变通道数,特征图的长和宽会增加一倍
   [[-1, 6], 1, Concat, [1]],  # 12 cat backbone P4 与第6层的输出进行特征图的融合
   [-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,与第4层的输出进行特征图的融合。
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)
 
   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4,与第14层的输出进行特征图的融合
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)
 
   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5,与第10层的输出进行特征图的融合
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)
 
   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

2.3、YOLOv5s网络结构图

在这里插入图片描述

3、附件

在yolov5中有l,n,m,s,x,5种配置文件,这5种配置文件只是depth_multiple和width_multiple两个参数不同,其它部分都相同的。

3.1、yolov5s.yaml 解析表

  1. yolov5s.yaml的width_multiple都为0.50
  2. 举例:[[-1, 1, Conv, [64, 6, 2, 2]],当width_multiple为0.5时候,则输出通道为64*0.5=32通道
层数frommouduleargumentsinputoutput
0-1Conv[3, 32, 6, 2, 2][3, 640, 640][32, 320, 320]
1-1Conv[32, 64, 3, 2][32, 320, 320][64, 160, 160]
2-1C3[64, 64, 1][64, 160, 160][64, 160, 160]
3-1Conv[64, 128, 3, 2][64, 160, 160][128, 80, 80]
4-1C3[128, 128, 2][128, 80, 80][128, 80, 80]
5-1Conv[128, 256, 3, 2][128, 80, 80][256, 40, 40]
6-1C3[256, 256, 3][256, 40, 40][256, 40, 40]
7-1Conv[256, 512, 3, 2][256, 40, 40][512, 20, 20]
8-1C3[512, 512, 1][512, 20, 20][512, 20, 20]
9-1SPPF[512, 512, 5][512, 20, 20][512, 20, 20]
10-1Conv[512, 256, 1, 1][512, 20, 20][256, 20, 20]
11-1Upsample[None, 2, ‘nearest’][256, 20, 20][256, 40, 40]
12[-1, 6]Concat[1][1, 256, 40, 40],[1, 256, 40, 40][512, 40, 40]
13-1C3[512, 256, 1, False][512, 40, 40][256, 40, 40]
14-1Conv[256, 128, 1, 1][256, 40, 40][128, 40, 40]
15-1Upsample[None, 2, ‘nearest’][128, 40, 40][128, 80, 80]
16[-1, 4]Concat[1][1, 128, 80, 80],[1, 128, 80, 80][256, 80, 80]
17-1C3[256, 128, 1, False][256, 80, 80][128, 80, 80]
18-1Conv[128, 128, 3, 2][128, 80, 80][128, 40, 40]
19[-1, 14]Concat[1][1, 128, 40, 40],[1, 128, 40, 40][256, 40, 40]
20-1C3[256, 256, 1, False][256, 40, 40][256, 40, 40]
21-1Conv[256, 256, 3, 2][256, 40, 40][256, 20, 20]
22[-1, 10]Concat[1][1, 256, 20, 20],[1, 256, 20, 20][512, 20, 20]
23-1C3[512, 512, 1, False][512, 20, 20][512, 20, 20]
24[17, 20, 23]Detect[80, [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]], [128, 256, 512]][1, 128, 80, 80],[1, 256, 40, 40],[1, 512, 20, 20][1, 3, 80, 80, 85],[1, 3, 40, 40, 85],[1, 3, 20, 20, 85]

3.2、 yolov5l.yaml 解析表

注:yolov5l.yaml的depth_multiple和width_multiple都为1

层数frommouduleargumentsinputoutput
0-1Conv[3, 64, 6, 2, 2][3, 640, 640][64, 320, 320]
1-1Conv[64, 128, 3, 2][64, 320, 320][128, 160, 160]
2-1C3[128,128, 1][128, 160, 160][128 160, 160]
3-1Conv[128,256, 3, 2][128 160, 160][256, 80, 80]
4-1C3[256,256, 2][256, 80, 80][256, 80, 80]
5-1Conv[256,512, 3, 2][256, 80, 80][512, 40, 40]
6-1C3[512, 512, 3][512, 40, 40][512, 40, 40]
7-1Conv[512, 1024, 3, 2][512, 40, 40][1024, 20, 20]
8-1C3[1024, 1024, 1][1024, 20, 20][1024, 20, 20]
9-1SPPF[1024, 1024, 5][1024, 20, 20][1024, 20, 20]
10-1Conv[1024,512, 1, 1][1024, 20, 20][512, 20, 20]
11-1Upsample[None, 2, ‘nearest’][512, 20, 20][512, 40, 40]
12[-1, 6]Concat[512+512][1, 512, 40, 40],[1, 512, 40, 40][1024, 40, 40]
13-1C3[1024,512, 1, False][1024, 40, 40][512, 40, 40]
14-1Conv[512,256, 1, 1][512, 40, 40][256, 40, 40]
15-1Upsample[None, 2, ‘nearest’][256, 40, 40][256, 80, 80]
16[-1, 4]Concat[256+256][1, 256, 80, 80],[1, 256, 80, 80][512, 80, 80]
17-1C3[512, 256, 1, False][512, 80, 80][256, 80, 80]
18-1Conv[256, 256, 3, 2][256, 80, 80][256, 40, 40]
19[-1, 14]Concat[256+256][1, 256, 40, 40],[1, 256, 40, 40][512, 40, 40]
20-1C3[512, 512, 1, False][512, 40, 40][512, 40, 40]
21-1Conv[512, 512, 3, 2][512, 40, 40][512, 20, 20]
22[-1, 10]Concat[512+512][1, 512, 20, 20],[1, 512, 20, 20][1024 20, 20]
23-1C3[1024,1024, 1, False][1024, 20, 20][1024, 20, 20]
24[17, 20, 23]Detect[80, [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]], [128, 256, 512]][1, 256, 80, 80],[1, 512, 40, 40],[1, 1024, 20, 20][1, 3, 80, 80, 85],[1, 3, 40, 40, 85],[1, 3, 20, 20, 85]

总结

其实看懂代码,结合画的网络结构图,就很容易理解YOLO的模型。后续,将会介绍如何利用YOLOv5进行训练。

参考文章

  1. YOLOv5 模型结构及代码详细讲解
  2. YOLOv5-网络结构
  3. YOLOv5 Focus C3 各模块详解及代码实现

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

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

相关文章

openFoam中cellZone的使用及编程

简介 通常在流体计算中需要对某个特定区域进行处理(比如添加源项,可参考这篇文章OpenFOAM编程:VOF法与多孔介质模型相结合),这是就需要用到cellZone. 通常有两种产生cellZone的方式: (1)从其他划分网格的…

一文带你看透通用文字识别 OCR

什么是 OCR? OCR技术指的是 Optical Character Recognition 或光学文字识别技术,即从图像中识别文字,并将其转换为电子文本或机器可读格式。它可以被广泛应用于图像处理,文字处理,自然语言处理,计算机视觉…

Kubernetes学习(五)持久化存储

Volume 卷 容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用带来了一些问题。首先,当容器崩溃时,kubectl将重新启动容器,容器中的文件将会丢失--应为容器会以干净的状态重建。其次,当在一个Pod中运行多个容…

【算法题目】【Python】彻底刷遍DFS/BFS的算法题目

文章目录参考资料树的前序、中序、后序遍历树的层次遍历回溯与剪枝组合组合总和 III电话号码的字母组合组合总和组合总和 II参考资料 参考这里面的一些讲解: https://github.com/youngyangyang04/leetcode-master。 树的前序、中序、后序遍历 看完 树的种类 之后…

网络 | UDP与TCP协议讲解 | TCP可靠性是怎样实现的?

文章目录前置知识查看网络状态的工具查看进程idUDP协议协议格式UDP只有接收缓冲区基于UDP的应用层协议TCP协议流的理解协议格式确认应答机制缓冲区序号的作用流量控制超时重传机制6位标志位紧急数据的处理三次握手listen的第二个参数全连接和半连接队列都维护了什么信息&#x…

史上最全若依管理系统修改页面标题和logo

整理若依框架去除 若依标题、logo及其他内容。一:网页上的logo进入ruoyi-ui --> public --> favicon.ico,把这个图片换成你自己的logo二:页面中的logo进入ruoyi-ui --> src --> assets --> logo --> logo.png,把…

Git版本控制工具(详解)

Git版本控制工具 Git常见命令速查表 集中式版本控制 cvs和svn都是属于集中式版本控制系统 他们的主要特点是单一的集中管理服务器 保存所有文件的修订版本协同开发人员通过客户端连接到这台服务器 取出最新的文件或者提交更新 优点每个人都可以在一定程度上看到项目中的其他…

动态规划——子序列、编辑距离、回文子串

目录 子序列问题 300.最长递增子序列 674.最长连续递增序列 718.最长重复子数组 1143.最长公共子序列 1035.不相交的线 53.最大子序和 编辑距离 392.判断子序列 115.不同的子序列 583.两个字符串的删除操作 72.编辑距离 回文子串 647.回文子串 516.最长回文子序列…

使用sapply函数改写for循环并绘制迟滞温度与污染物效应图

For循环应该是我们在R语言使用得最普遍的循环了,优势就是简单、易上手,缺点就是慢,特别对于跑数据量比较大的数据。Apply家族函数使用C来编写,运行得非常快,非常适合代替for循环。今天介绍一下sapply函数改写for循环并…

abp.net 5.0 部署IIS10

今天遇到了abp.net 5.0部署iis10被卡住的问题,网上找了一些资料,都不是我要的,最后我总结一下我用的是 5.0的版本,所以我需要给服务器安装 iis5.0的相关运行环境 1:https://dotnet.microsoft.com/zh-cn/download/dotne…

html--学习

javascrapt交互&#xff0c;网页控制JavaScript&#xff1a;改变 HTML 图像本例会动态地改变 HTML <image> 的来源&#xff08;src&#xff09;&#xff1a;点亮灯泡<script>function changeImage() {elementdocument.getElementById(myimage) #内存变量&#xff0…

Linux---基本指令

专栏&#xff1a;Linux 个人主页&#xff1a;HaiFan. 基本指令ls 指令pwd命令cd 指令touch指令mkdir指令&#xff08;重要&#xff09;rmdir指令 && rm 指令&#xff08;重要&#xff09;man指令&#xff08;重要&#xff09;cp指令&#xff08;重要&#xff09;mv指令…

win10 C++调用conda的python

普通 比如说是conda的DL环境&#xff0c;路径是D:\Miniconda3\envs\DL VC目录->包含目录里加入D:\Miniconda3\envs\DL\include VC目录->库目录里加入D:\Miniconda3\envs\DL\libs 链接器->输入->附加依赖项里加入D:\Miniconda3\envs\DL\libs\python37.lib 在l…

“ 寻友之旅 “ 的三种解决办法

题目来源于&#xff1a;稀土掘金 " 寻友之旅 " 的三种解决办法&#xff01; 本文将分别讲解如何使用BFS、双向BFS以及 Dijsktra堆优化的方法来解决此题~ 一起来看看吧&#xff01; 附Java题解代码&#xff01; 文章目录" 寻友之旅 " 的三种解决办法&#…

如何将两个或多个PDF文件合并成一个?这3个方法可以看看

在工作中&#xff0c;有时候我们需要把两个或多个PDF文件合并成一个&#xff0c;这样一来&#xff0c;可以方便阅读、修改&#xff0c;还能快速打印文件。 下面分享3个工具&#xff0c;看看如何将两个或多个PDF文件合并成一个文件。 方法一&#xff1a;使用美图工具 如果PDF文…

【Spring AOP】如何统一“拦截器校验、数据格式返回、异常返回”处理?

目录 一、Spring 拦截器 1.1、背景 1.2、实现步骤 1.3、拦截原理 二、 统一url前缀路径 2.1、方法一&#xff1a;在系统的配置文件中设置 2.2、方法二&#xff1a;在 application.properies 中配置 三、统一异常处理 四、统一返回数据返回格式处理 4.1、背景 4.2、…

PTA:L1-025 正整数A+B、L1-026 I Love GPLT、L1-027 出租(C++)

目录 L1-025 正整数AB 问题描述&#xff1a; 实现代码&#xff1a; L1-026 I Love GPLT 问题描述&#xff1a; 实现代码&#xff1a; L1-027 出租 问题描述&#xff1a; 实现代码&#xff1a; 原理思路&#xff1a; 出租那道题有点意思哈 L1-025 正整数AB 问题描述…

【Java学习笔记】13.Java StringBuffer 和 StringBuilder 类

Java StringBuffer 和 StringBuilder 类 当对字符串进行修改的时候&#xff0c;需要使用 StringBuffer 和 StringBuilder 类。 和 String 类不同的是&#xff0c;StringBuffer 和 StringBuilder 类的对象能够被多次的修改&#xff0c;并且不产生新的未使用对象。 在使用 St…

Tomcat8安装

1、前置环境 Tomcat 8 对应jdk 1.8 版本&#xff1b;如果你的jdk版本是8以上&#xff0c;则安装对应的tomcat版本。 jdk8 官方下载安装时&#xff0c;先安装jdk版本&#xff0c;最后单独安装jre。所以电脑会有两套jre&#xff0c;一套是jdk中的jre&#xff0c;位于 \jre 目录下…

客户案例|三强联手,深度集成,实现四方共赢

关键发现&#xff1a; 用户痛点&#xff1a;以现有ERP系统台账表单模式管理设备&#xff0c;已经不能满足伯恩业务增长所需的设备管理优化与革新的要求。 解决方案&#xff1a;利用西门子Mendix低代码平台与SAP PM模块进行集成开发的联合解决方案&#xff0c;为实现客户设备资…