前言:Hello大家好,我是小哥谈。YOLOv5配置了5种不同大小的网络模型,分别是YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x,其中YOLOv5n是网络深度和宽度最小但检测速度最快的模型,其他4种模型都是在YOLOv5n的基础上不断加深、加宽网络使得网络规模扩大,在增强模型检测性能的同时增加了计算资源和速度消耗。出于对检测精度、模型大小、检测速度的综合考量,本文选择普遍使用的YOLOv5s作为研究对象进行介绍。🌈
前期回归:
YOLOv5源码中的参数超详细解析(1)— 项目目录结构解析
目录
🚀1.什么是yaml
🚀2.参数配置
🚀3.先验框配置
🚀4.Backbone部分
🚀5.Head部分
🚀6.整体模型
🚀1.什么是yaml
YAML是"YAML Ain’t a Markup Language"(YAML不是一种标记语言)的递归缩写。YAML的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),主要强调这种语言是以数据为中心,而不是以标记语言为重心,例如像xml语言就会使用大量的标记。🌷
YAML是一个可读性高,易于理解,用来表达数据序列化的格式。它的语法和其他高级语言类似,并且可以简单表达清单(数组)、散列表、标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等。🌴
YAML是一个类似 XML、JSON 的标记性语言,YAML 的设计目标是:
- 人类容易阅读
- 可用于不同程序间的数据交换
- 适合描述程序所使用的数据结构,特别是脚本语言
- 丰富的表达能力与可扩展性
-
易于使用
说明:
YAML 与 XML、JSON的对比♨️♨️♨️
YAML 与 XML
- 具有 XML 同样的优点,但比 XML 更加简单、敏捷等。
YAML 与 JSON
JSON 可以看作是 YAML 的子集,也就是说 JSON 能够做的事情,YAML 也能够做。
YAML能表示得比 JSON 更加简单和阅读,例如“字符串不需要引号”。所以 YAML 容易可以写成 JSON 的格式,但并不建议这种做。
YAML 能够描述比 JSON 更加复杂的结构,例如“关系锚点”可以表示数据引用(如重复数据的引用)。
🚀2.参数配置
详解:
nc:数据集类别个数。
depth_multiple:模型深度,用于控制层的重复的次数(深度)。通过深度参数depth gain在搭建每一层的时候,子模块数量=int(number*depth),这样就可以起到一个动态调整模型深度的作用。
width_multiple:模型的宽度,用于控制输出特征图的通道数(宽度)。在模型中间层的每一层的卷积核的数量=int(number*width),这样也可以起到一个动态调整模型宽度的作用。
🚀3.先验框配置
YOLOV5使用k-means聚类法来初始化了9个anchors,任意地选择了9个聚类和3个尺度,然后在各个尺度上均匀地划分聚类。🌾
在COCO数据集上,这9个聚类:
(10×13),(16×30),(33×23),(30×61),(62×45),(59×19),(116×90),(156×198), (373x326)。
这9个anchor分别在三个Detect层的feature map中使用,每个feature map的每个grid_cell都有三个anchor进行预测。具体如下图所示:
特征图 | 13*13 | 26*26 | 52*52 |
感受野 | 大 | 中 | 小 |
先验框 | (116×90),(156×198),(373×326) | (30*61),(62*45),(59*119) | (10*13),(16*30),(33*23) |
🚀4.Backbone部分
首先介绍 [from, number, module, args] 这四个参数:
from:表示该层的输入从哪来。-1表示输入取自上一层,-2表示上两层,3表示第3层(从0开始数),[-1, 4]表示取自上一层和第4层,依次类推。网络层数的数法在注释里已经标出来了,从0开始,每一行表示一层,例如0-P1/2表示第0层,特征图尺寸为输入的1/21。
number:表示该层模块堆叠的次数,对于C3、BottleneckCSP等模块,表示其子模块的堆叠,具体细节可以查看源代码,当然最终的次数还要乘上depth_multiple系数。
module:表示该层模块的名称,这些模块写在common.py中,进行模块化的搭建网络。
args:表示类的初始化参数,用于解析作为 moudle 的传入参数,会在网络搭建过程中根据不同层进行改变。
关于上述代码各层解释如下所示:👇
第1层是一个卷积层,输出通道数为 64,卷积核大小为 6x6,步长为 2,填充为 2,输出特征图大小为输入的一半。
第2层是一个卷积层,输出通道数为 128,卷积核大小为 3x3,步长为 2,输出特征图大小为输入的一半。
第3层是一个 C3 模块,包含 3 个卷积层,每个卷积层的输出通道数为 128,卷积核大小分别为 1x1、3x3、1x1,不改变特征图大小。
第4层是一个卷积层,输出通道数为 256,卷积核大小为 3x3,步长为 2,输出特征图大小为输入的一半。
第5层是一个 C3 模块,包含 6 个卷积层,每个卷积层的输出通道数为 256,卷积核大小分别为 1x1、3x3、1x1,不改变特征图大小。
第6层是一个卷积层,输出通道数为 512,卷积核大小为 3x3,步长为 2,输出特征图大小为输入的一半。
第7层是一个 C3 模块,包含 9 个卷积层,每个卷积层的输出通道数为 512,卷积核大小分别为 1x1、3x3、1x1,不改变特征图大小。
第8层是一个卷积层,输出通道数为 1024,卷积核大小为 3x3,步长为 2,输出特征图大小为输入的一半。
第9层是一个 C3 模块,包含 3 个卷积层,每个卷积层的输出通道数为 1024,卷积核大小分别为 1x1、3x3、1x1,不改变特征图大小。
第10层是一个 SPPF 层,具有金字塔式空间池化(Spatial Pyramid Pooling),输出通道数为 1024,使用大小为 5x5 的金字塔空间池化。
🚀5.Head部分
YOLOv5中的Head包括Neck和Detect两部分。Neck采用了FPN+PAN结构,Detect结构和YOLOV3中的Head一样。其中BottleNeckCSP带有False,说明没有使用残差结构,而是采用的backbone中的Conv。🌺
四个参数和上面 backbone 一样,这里就不再解释了。🌺
说明:
搭配着yolo.py一起看,会更清晰每个参数的作用。🍺🍺🍺