YOLOv5源码中的参数超详细解析(2)— 配置文件yolov5s.yaml

YOLOv5源码中的参数超详细解析(2)— 配置文件yolov5s.yaml_第1张图片

前言:Hello大家好,我是小哥谈。YOLOv5配置了5种不同大小的网络模型,分别是YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x,其中YOLOv5n是网络深度和宽度最小但检测速度最快的模型,其他4种模型都是在YOLOv5n的基础上不断加深、加宽网络使得网络规模扩大,在增强模型检测性能的同时增加了计算资源和速度消耗。出于对检测精度、模型大小、检测速度的综合考量,本文选择普遍使用的YOLOv5s作为研究对象进行介绍。

YOLOv5源码中的参数超详细解析(2)— 配置文件yolov5s.yaml_第2张图片 前期回归:

     YOLOv5源码中的参数超详细解析(1)— 项目目录结构解析

           目录

1.什么是yaml

2.参数配置

3.先验框配置

4.Backbone部分

5.Head部分

6.整体模型

YOLOv5源码中的参数超详细解析(2)— 配置文件yolov5s.yaml_第3张图片

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.参数配置

YOLOv5源码中的参数超详细解析(2)— 配置文件yolov5s.yaml_第4张图片

详解:

nc:数据集类别个数

depth_multiple:模型深度,用于控制层的重复的次数(深度)。通过深度参数depth gain在搭建每一层的时候,子模块数量=int(number*depth),这样就可以起到一个动态调整模型深度的作用。

width_multiple:模型的宽度,用于控制输出特征图的通道数(宽度)。在模型中间层的每一层的卷积核的数量=int(number*width),这样也可以起到一个动态调整模型宽度的作用。


3.先验框配置

YOLOv5源码中的参数超详细解析(2)— 配置文件yolov5s.yaml_第5张图片

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部分

YOLOv5源码中的参数超详细解析(2)— 配置文件yolov5s.yaml_第6张图片

首先介绍 [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源码中的参数超详细解析(2)— 配置文件yolov5s.yaml_第7张图片

YOLOv5中的Head包括NeckDetect两部分。Neck采用了FPN+PAN结构,Detect结构和YOLOV3中的Head一样。其中BottleNeckCSP带有False,说明没有使用残差结构,而是采用的backbone中的Conv。

四个参数和上面 backbone 一样,这里就不再解释了。

说明:

搭配着yolo.py一起看,会更清晰每个参数的作用。


6.整体模型

YOLOv5源码中的参数超详细解析(2)— 配置文件yolov5s.yaml_第8张图片


你可能感兴趣的:(YOLOv5,YOLO,人工智能,深度学习,机器学习,计算机视觉)