YOLOv5目标检测学习(4):YOLOV5源码的文件结构解析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

先看一下

在这里插入图片描述
这里我想先介绍一些关于yolo源码中不同.后缀文件的区别:

①py、cpp、java后缀的文件

.py、.cpp 和 .java 是常见的文件后缀名,分别代表Python、C++ 和 Java 编程语言的源代码文件。

.py 文件:是Python编程语言的源代码文件后缀名。Python源代码文件通常以 .py 结尾,可以使用Python解释器来执行这些文件中的代码。

.cpp 文件:是C++编程语言的源代码文件后缀名。C++源代码文件通常以 .cpp 结尾,可以使用C++编译器将这些文件编译成可执行程序。

.java 文件:是Java编程语言的源代码文件后缀名。Java源代码文件通常以 .java 结尾,可以使用Java编译器将这些文件编译成字节码文件,然后在Java虚拟机上运行。

②md、txt、yml后缀的文件

.md、.txt 和 .yml 是常见的文件后缀名,分别代表Markdown、文本文件和YAML文件。这些文件后缀名通常用于标识不同类型的文本文件,让计算机系统和应用程序能够识别并正确处理这些文件。

.md 文件:是Markdown文件的后缀名。Markdown是一种轻量级标记语言,用于简单而直观地排版文本,常用于编写文档、博客文章、README 文件等。Markdown文件通常以 .md 结尾,可以使用各种Markdown编辑器或在线编辑器来编辑和预览这些文件。

.txt 文件:是文本文件的后缀名。文本文件是一种纯文本格式的文件,通常包含人类可读的文本内容,不包含格式化样式或特殊的编码。文本文件可以使用任何文本编辑器打开和编辑,是最简单的文件格式之一。

.yml 文件:是YAML文件的后缀名。YAML是一种人类可读的数据序列化格式,常用于配置文件、数据传输等场景。YAML文件通常以 .yml 或 .yaml 结尾,可以使用各种编程语言的YAML解析库来读取和处理这些文件。

③yaml后缀的文件

.yaml 文件是一种常见的文件格式后缀名,代表 YAML(YAML Ain’t Markup Language)文件。YAML是一种人类可读的数据序列化格式,旨在成为一种简洁、直观的数据表示方式,适用于配置文件、数据传输、文档等多种应用场景。

YAML 文件通常以 .yaml 或 .yml 结尾,使用一种类似于缩进的方式来表示数据结构,包括标量值、列表、字典等。YAML 文件常用于配置文件、数据传输、API 接口定义等场景,被广泛应用于软件开发和系统管理中。许多编程语言都提供了对 YAML 文件的解析和生成库,方便开发人员读取和处理 YAML 格式的数据。

一、.github文件夹

在一个GitHub仓库中,.github文件夹通常用于存放与GitHub仓库管理和GitHub Actions 相关的配置文件和设置。
在这里插入图片描述
具体来说,.github文件夹中可能包含以下内容:

1.1 workflows文件夹:该文件夹通常包含GitHub Actions 的工作流程配置文件。

1.2 ISSUE_TEMPLATE文件夹:该文件用于定义GitHub 仓库的 Issue 模板,可以规范化用户提交的 Issue 内容,提高 Issue 的质量和可读性。

总的来说,.github文件夹中的内容主要用于规范化GitHub 仓库的管理流程,提高团队协作效率,以及利用GitHub Actions 实现自动化构建和部署。这些配置文件和设置有助于提升项目的质量和可维护性。

所以这个文件夹一般来说不重要,可以不看。

二、classify文件夹

三、data文件夹

在这里插入图片描述
data文件夹主要是存放一些超参数的配置文件(如.yaml文件),是用来配置训练集和测试集还有验证集的路径的,其中还包括目标检测的种类数和种类的名称;还有一些官方提供测试的图片。

YOLOv5有大约30个超参数用于各种训练设置。更好的初始猜测会产生更好的最终结果,因此在演化之前正确初始化这些值很重要。
如果是训练自己的数据集的话,那么就需要修改其中的yaml文件。不过要注意,自己的数据集不建议放在这个路径下面,建议把数据集放到YOLOv5项目的同级目录下面。

详解:

3.1 hyps文件:模型训练时存放yaml格式的超参数配置文件

①. hyps.scratch-high.yaml #数据增强高,适用于大型型号,即v3、v3-spp、v5l、v5x. hyps.scratch-low.yaml #数据增强低,适用于较小型号,即v5n、v5s. hyps.scratch-med.yaml #数据增强中,适用于中型型号。即v5m

比如med文件:
在这里插入图片描述
lr0:初始学习率,控制模型参数的更新速度。在这个示例中,初始学习率为0.01。
lrf:OneCycleLR学习率的最终值,通常是初始学习率乘以一个系数。在这里,最终学习率为初始学习率的10倍。
momentum:SGD动量或Adam优化器的beta1参数,用于加速优化过程。
weight_decay:优化器的权重衰减参数,用于控制模型的复杂度。
warmup_epochs:预热训练的轮数,用于在训练初期逐渐增加学习率。
box、cls、obj:损失函数中不同部分的权重,用于平衡不同损失项的重要性。
iou_t:IoU训练阈值,用于目标检测中的真实框和预测框匹配。
mosaic、mixup、flipud等:数据增强技术的概率,用于增加训练数据的多样性。

这些超参数是干嘛的呢?

这些超参数通常用于训练深度学习模型时进行调优和优化,以影响模型的训练过程和性能。以下是这些超参数在训练过程中的作用和含义:
学习率(learning rate):控制模型参数更新的速度,过大的学习率可能导致模型不稳定,而过小的学习率可能导致训练过慢或陷入局部最优解
动量(momentum):对于优化算法(如SGD、Adam)来说,动量可以帮助加速收敛过程,避免陷入局部最优解。
权重衰减(weight decay):用于控制模型的复杂度,防止过拟合。通过惩罚较大的权重值,可以使模型更加简单且泛化能力更强。
损失函数中不同部分的权重:在多任务学习或复杂损失函数中,不同部分的权重可以调整损失函数中各项的重要性,以平衡不同损失项的影响。
数据增强技术的概率:数据增强可以增加训练数据的多样性,提高模型的泛化能力。通过调整数据增强的概率,可以控制不同的数据增强技术在训练中的应用程度。
预热训练轮数(warmup epochs):在训练初期逐渐增加学习率,有助于稳定训练过程,避免模型在初始阶段出现不稳定的情况。

3.2. images文件:存放着官方给的两张测试图片

在这里插入图片描述
在这里插入图片描述

公交车和齐达内

3.3 . scripts #存放数据集和权重下载shell脚本

在这里插入图片描述
①. Argoverse.yaml #Argoverse数据集的配置文件
②. coco.yaml # cOCO数据集配置文件
③. coco128.yaml# cOCo128数据集配置文件
④GlobalWheat2020.yaml 数据集
⑤imageNet.yaml 数据集
⑥object365.yaml
⑦SKU-110K
⑧VisDrone.yaml
⑨VOC.yaml
⑩Xview.yaml

这些基本就是一些数据集的配置文件,下面介绍一下这些数据集:

Argoverse:Argoverse数据集是专为自动驾驶领域设计的数据集,包含了大规模的自动驾驶场景数据,如高清地图、传感器数据、车辆轨迹等。这些数据可用于自动驾驶系统的训练、测试和评估。

COCO:COCO数据集是一个用于目标检测、图像分割和关键点检测的大规模数据集,包含了超过33万张图像和80个不同类别的物体实例标注。

COCO128:COCO128是COCO数据集的一个子集,包含了128个类别的物体实例标注,适用于小规模目标检测和分类任务。

GlobalWheat2020:Global Wheat Detection 2020数据集是专为小麦检测任务设计的数据集,包含了各种小麦植株的图像和标注信息,用于推动农业领域的图像识别技术。

ImageNet:ImageNet是一个用于图像分类任务的大规模数据集,包含了超过1400万张图像和1000个类别,是深度学习领域中常用的基准数据集之一。

Object365:Object365数据集包含365个类别的目标检测数据,用于更广泛的目标检测任务和多类别物体识别。

SKU-110K:SKU-110K数据集是一个用于商品识别和检测的数据集,包含了11万个SKU(库存单位)的商品图像和标注信息。

VisDrone:VisDrone数据集是专为无人机视觉任务设计的数据集,包含了各种场景下的无人机图像和标注信息,用于目标检测、跟踪和行为分析。

VOC:VOC数据集是一个常用的目标检测和图像分割数据集,包含了20个类别的物体标注信息,用于评估目标检测和分割算法的性能。

xView:xView数据集是一个用于灾害响应和地理信息分析的数据集,包含了各种自然灾害场景的高分辨率图像和标注信息,用于灾害监测和应急响应。

这些数据集的yaml文件有什么用?

这些数据集的 YAML 文件通常用于存储数据集的配置信息,包括数据集的路径、类别标签、数据预处理方式等。具体来说,YAML 文件在计算机视觉领域的数据集中扮演着以下几个重要的作用:

数据集配置信息:YAML 文件可以包含数据集的元数据信息,如数据路径、类别标签、数据划分方式等。这些信息对于加载和处理数据集非常重要。

数据预处理参数:YAML 文件可以定义数据预处理的参数,如图像大小、归一化方式、数据增强方式等。这些参数在训练和评估模型时需要用到。

训练参数设置:有时候,YAML 文件还可以包含训练过程中的超参数设置,如学习率、优化器类型、批量大小等。这些参数可以帮助用户灵活地调整训练过程。

数据集统计信息:YAML 文件中可能还包含数据集的统计信息,如数据样本数量、类别分布情况等。这些信息有助于用户了解数据集的特点。

四、models文件夹:神经网络构建的配置文件和一些函数

4.1 hub文件夹

在这里插入图片描述
models是模型文件夹。里面主要是一些网络构建的配置文件和函数,其中包含了该项目的四个不同的版本,分别为是s、m、l、x.
从名字就可以看出,这几个版本的大小。他们的检测速度分别都是从快到慢,但是精确度分别是从低到高。如果训练自己的数据集的话就需要修改这里面相对应的yaml文件来训练自己模型。

详解:

. hub#存放yolov5各版本目标检测网络模型配置文件
. anchors.yaml # cOCo数据的默认锚点
. yolov3-spp.yaml # 带spp的yolov3. yolov3-tiny.yaml #精简版yolov3. yolov3.yaml # yolov3
. yolov5-bifpn.yaml#带二值fpn的yolov5l. yolov5-fpn.yaml # 带fpn的yolov5
. yolov5-p2.yaml # (P2,P3,P4,P5)都输出,宽深与large版本相同,相当于比large版本能检测更小物体. yolov5-p34.yaml #只输出(P3,P4),宽深与small版本相同,相当于比small版本更专注于检测中小物体. yolov5-p6.yaml #(P3,P4,P5, P6)都输出,宽深与large版本相同,相当于比large版本能检测更大物体
. yolov5-p7.yaml #(P3,P4,P5,P6,P7)都输出,宽深与large版本相同,相当于比large版本能检测更更大物体. 
yolov5-panet.yaml # 带PANet的yolov5l
. yolov5n6.yaml #(P3,P4,P5,P6)都输出,宽深与nano版本相同,相当于比nano版本能检测更大物体,anchor已预定义。 yolov5s6.yaml #(P3, P4,P5,P6)都输出,宽深与small版本相同,相当于比small版本能检测更大物体,anchor已预定义. yolov5m6.yaml#(P3, P4,P5,P6)都输出,宽深与middle版本相同,相当于比middle版本能检测更大物体,anchor已预定义.
yolov5l6.yaml #(P3,P4,P5,P6)都输出,宽深与large版本相同,相当于比large版本能检测更大物体,anchor已预定义
推测是作者做实验的产物
yolov5x6.yaml#(P3,P4,P5,P6)都输出,宽深与Xlarge版本相同,相当于比Xlarge版本能检测更大物体,anchor已预定义. yolov5s-ghost.yaml # backbone的卷积换成了GhostNet形式的yolov5s,anchor已预定义
.yolov5s-transformer.yaml # backbone最后的C3卷积添加了Transformer模块的yolov5s,anchor已预定义

①anchors.yaml # cOCo数据的默认锚点

anchors.yaml文件通常用于目标检测任务中的目标检测器(如YOLO、Faster R-CNN等)中,用于定义目标检测器的anchor boxes(锚框)的大小和比例。锚框是一种预定义的边界框,用于在图像中生成候选目标区域,以便目标检测器可以预测目标的位置和类别。

在anchors.yaml文件中,通常会包含以下信息:
Anchor Box的数量:定义了目标检测器使用的anchor boxes的数量。
Anchor Box的尺寸和比例:指定每个anchor box的宽度、高度以及宽高比,通常以像素为单位。
Anchor Box的缩放因子:有时候还会包含anchor box的缩放因子,用于在不同尺度的特征图上生成不同大小的anchor boxes。

②yolov5m6.yaml #yolov5的版本6的神经网络配置

# Parameters
nc: 80 # number of classes
depth_multiple: 0.67 # model depth multiple
width_multiple: 0.75 # layer channel multiple
anchors:
  - [19, 27, 44, 40, 38, 94] # P3/8
  - [96, 68, 86, 152, 180, 137] # P4/16
  - [140, 301, 303, 264, 238, 542] # P5/32
  - [436, 615, 739, 380, 925, 792] # P6/64

# 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, [768, 3, 2]], # 7-P5/32
    [-1, 3, C3, [768]],
    [-1, 1, Conv, [1024, 3, 2]], # 9-P6/64
    [-1, 3, C3, [1024]],
    [-1, 1, SPPF, [1024, 5]], # 11
  ]

# YOLOv5 v6.0 head
head: [
    [-1, 1, Conv, [768, 1, 1]],
    [-1, 1, nn.Upsample, [None, 2, "nearest"]],
    [[-1, 8], 1, Concat, [1]], # cat backbone P5
    [-1, 3, C3, [768, False]], # 15

    [-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]], # 19

    [-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]], # 23 (P3/8-small)

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

    [-1, 1, Conv, [512, 3, 2]],
    [[-1, 16], 1, Concat, [1]], # cat head P5
    [-1, 3, C3, [768, False]], # 29 (P5/32-large)

    [-1, 1, Conv, [768, 3, 2]],
    [[-1, 12], 1, Concat, [1]], # cat head P6
    [-1, 3, C3, [1024, False]], # 32 (P6/64-xlarge)

    [[23, 26, 29, 32], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5, P6)
  ]

Parameters:这部分包含了模型的一些参数设置,如类别数量(nc: 80)、模型深度倍数(depth_multiple: 0.67)、层通道倍数(width_multiple: 0.75)以及每个输出层对应的锚框信息。在这里,每个输出层都有自己的一组锚框,用于目标检测。

YOLOv5 v6.0 backbone:这部分描述了模型的主干网络(backbone),包括了一系列卷积层(Conv)、C3块(C3)和SPPF块(SPPF),用于提取图像特征

YOLOv5 v6.0 head:这部分描述了模型的头部结构(head),包括了一系列卷积层(Conv)、上采样层(nn.Upsample)、拼接层(Concat)和C3块(C3),用于生成目标检测的输出

Detect:最后一部分是Detect层,用于在不同尺度的特征图上进行目标检测,生成最终的检测结果。这里的锚框信息会被传递给Detect层,用于目标检测。

整个代码段描述了一个完整的目标检测模型的结构,包括了主干网络、头部结构和检测层的设置。

4.2 segment文件夹

在这里插入图片描述

4.3 同级的几个py文件

在这里插入图片描述
. int.py#空的,里面什么都没有

. common.py #放的是一些网络结构的定义通用模块,包括autopad、Conv、DWConv、TransformerLayer等,这个文件比较复杂,总共一千多行,后面再慢慢分析。

. experimental.py#实验性质的代码,包括MixConv2d、跨层权重Sum等

. tf.py # tensorflow版的yolov5代码

. yolo.py # yolo的特定模块,包括BaseModel,DetectionModel,ClassificationModel,parse_model等

这几个py文件其实都很有深意,后面专门写一篇来进行分析。

五、runs文件夹:运行后输出一个模型的相关结果

在这里插入图片描述
这里由于我还没有开始训练一个自己的模型,因此就暂时不写这部分的内容,等后续再补充吧

六、utils文件夹

在这里插入图片描述
utils存放的是工具类的函数,里面有loss函数, metrics函数, plots函数等等。
详解:
●aws #恢复中断训练, 和aws平台使用相关的工具
●flask_ rest api #和flask相关的工具
●google
app engine #和谷歌app引擎相关的工具
●loggers #日志打印.
● init_ .py # notebook的初始化, 检查系统软件和硬件
●activations.py #激活函数
●augmentations #存放各种图像增强技术
●autoanchor.py # 自动生成锚框
●autobatch.py #自动生成批量大小
●benchmarks.py #对模型进行性能评估(推理速度和内存占用上的评估)
●callbacks.py #回调函数,主要为logger服务
●datasets # dateset和dateloader定义代码
,downloads.py #谷歌云盘内容下载
●general.py #全项目通用代码,相关实用函数实现
●loss.py #存放各种损失函数
●metrics.py #模型验证指标,包括ap,混淆矩阵等
●plots.py #绘图相关函数,如绘制loss、 ac曲线, 还能单独将一 个bbox存储为图像
,torch
_utils.py #辅助函数

七、其他一级目录的文件

在这里插入图片描述
.dockerignore # docker的ignore文件
.gitattributes#用于将.ipynb后缀的文件剔除GitHub语言统计.
.gitignore# docker的ignore文件
.CONTRIBUTING.md # markdown格式说明文档
. detect.py#目标检测预测脚本
. export.py #模型导出
. hubconf.py # pytorch hub相关
.LICENSE#证书
README.md # markdown格式说明文档
. requirements.txt #可以通过pip install requirement进行依赖环境下载
. setup.cfg # 项目打包文件
. train.py#目标检测训练脚本
. tutorial.ipynb #目标检测上手教程. val.py #目标检测验证脚本
. yolov5s.pt # coco数据集模型预训练权重,运行代码的时候会自动从网上下载

这里面最重要的几个文件是:
①推理部分:detect.py
②训练部分:train.py
③验证部分:val.py

由于代码量比较大,所以我会放到下一节进行分析。

八、总结一下

我认为yolov5的源码基本以两个部分的文件为核心,一个是.yaml文件,另一个是.py文件
yaml文件一个是关于数据集的配置,一个是关于神经网络结构的配置。
.py文件一个是关于一些工具类的配置,一个是关于推理、训练、验证方面的配置

后续几篇文章将深入解析这些文件的内容:

①推理部分:detect.py
②训练部分:train.py
③验证部分:val.py
④配置文件:yolov5s.yaml‘
⑤网络结构之:yolo.py
⑥网络结构之:common.py

为了完成一个深度学习目标检测的全过程,会按照以下顺序进行:

①配置部分(yolov5s.yaml):用于确定yolov5的网络结构和参数,包括模型的架构、数据预处理方式、训练参数等重要信息

②工具部分(yolo.py、common.py):提供一些函数,用于辅助后续部分,包括定义网络结构、损失函数、激活函数等

③训练部分(train.py):首先,使用训练部分的代码(train.py)来训练模型。在训练过程中,模型会根据训练数据集进行参数更新,以便更好地识别目标物体。

④验证部分(val.py):在训练过程中,通常会使用验证部分的代码(val.py)来评估模型在验证数据集上的性能。这有助于监控模型的泛化能力和避免过拟合。

⑤推理部分(detect.py):最后,在完成训练和验证后,可以使用推理部分的代码(detect.py)来对新的图像或视频进行目标检测。推理部分通常用于实际应用场景中使用训练好的模型进行预测。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值