使用Yolov5
- 什么是PyTorch?
PyTorch 是一个基于 Python 的开源机器学习库(深度学习框架),它主要用于深度学习任务,为构建和训练神经网络提供了灵活且高效的平台,它们提供了完整的生态系统,包括模型定义、训练、验证和推理功能。简单来说PyTorch可以提供很多神经网络训练所需的工具,只需要调用函数就可以使用,并且PyTorch可以自行定义神经网络结构,具体对PyTorch介绍可以参考我写的文章PyTorch快速入门_conda-CSDN博客,如果你想快速完成ROS实时目标检测,可以不用了解这么详细。除了PyTorch外,TensorFlow也是一种常用的深度学习框架平台。
- 什么是推理引擎?
与PyTorch这种深度学习框架不同,深度学习框架实现的是模型训练、验证、推理,而推理引擎是专门用于模型推理(即模型预测)的工具(专注于推理,不涉及模型训练)。它们通常针对推理任务进行了高度优化,以提高性能和降低资源消耗,部署难度较低(轻量级,无需训练相关组件)。
- 什么是YOLOv5?
YOLOv5是一个基于 PyTorch实现的目标检测算法。它提供了完整的模型定义、训练和推理代码,是一个具体的应用实现。打个比方,YOLOv5相当于一辆汽车。PyTorch相当于制造汽车的工厂(提供了制造汽车的工具和材料)。推理引擎相当于汽车的发动机优化系统(让汽车跑得更快、更省油)。
YOLOv5 是用 PyTorch 来构建神经网络结构并进行训练的模型。也就是说YOLOv5本身就是一个目标检测模型(基于卷积神经网络(CNN)的目标检测模型),而且它同时提供了训练和推理的功能。YOLOv5 提供了完整的训练代码,用户可以使用自己的数据集对模型进行训练。YOLOv5 提供了推理代码,用户可以使用预训练模型或自定义模型进行目标检测。
- Yolov5为什么要用PyTorch部署?
鉴于PyTorch的诸多优点,将Yolov5部署到PyTorch中可以便于调试和修改模型结构,PyTorch支持动态图模式,方便实验和快速迭代。而且PyTorch与YOLOv5代码库完全兼容,无需额外转换,支持直接加载预训练模型(.pt
文件)。PyTorch方便添加自定义功能,如数据增强、后处理逻辑等。除此之外,PyTorch天然支持CUDA,可充分利用GPU进行推理加速。但是需要安装PyTorch及其依赖库,部署环境较复杂,运行时也会占用较多内存和计算资源。
在完成目标检测任务时一般有两种方式:第一种是全过程均使用PyTorch这种深度学习框架,包括模型训练、验证、推理,但这会占用较多内存和计算资源,而且相比优化后的推理引擎(如TensorRT、ONNX Runtime),PyTorch原生推理速度较慢。一般选择后者也就是第二种方式,使用深度学习框架(如PyTorch、TensorFlow)训练模型,然后将模型转换为推理引擎支持的格式(如ONNX、TensorRT),最后使用推理引擎加载模型并进行推理。
模型训练又分为两种方式:第一种是从零开始训练,另一种是基于预训练模型微调,下面是两种不同方式的对比
一般我们要完成的简单目标检测任务使用基于预模型微调的方式即可
也许你还有点模糊,但是真正使用之后你会慢慢理解它到底是个什么
一,克隆仓库及下载依赖
在终端输入git clone https://github.com/ultralytics/yolov5克隆YOLOv5仓库
克隆后cd yolov5进入文件目录
pip install -r requirements.txt 安装依赖
二,YOLOv5所能完成的任务
yolov5的核心功能是目标检测,可以检测图像或视频中的多个目标,并输出目标的类别和边界框。除此之外还有实例分割任务(可以检测目标并生成目标的像素级掩码)和图像分类任务
1,目标检测
对于目标检测任务是本文章的重点,以下所介绍的示例就是完成目标检测的步骤。对于图像分类和实例分割只做简单的说明
2,图像分类
对于图像分类任务,一般步骤和目标检测的类似,只不过用来训练推理的主程序要使用classify文件夹下的各文件,以下是对classify中文件的简单表述
-
train.py
:用于训练图像分类模型的主程序。 -
val.py
:用于验证图像分类模型性能的主程序。 -
predict.py
:用于使用训练好的分类模型进行推理的主程序。
分类模型的预训练权重文件名为 yolov5s-cls.pt
,用yolov5/data/scripts/download_weights.sh脚本下载。以下代码是运行train.py进行训练,如果你没有下载yolov5s-cls.pt权重文件,运行下列代码后,YOLOv5 会自动下载 yolov5s-cls.pt
文件并保存到 weights
文件夹中。
python classify/train.py --data your_dataset.yaml --weights yolov5s-cls.pt
分类模型的模型参数使用models文件下的yolov5s-cls.yaml,yolov5m-cls.yaml,yolov5l-cls.yaml,yolov5x-cls.yaml。
件下如果你的models文件下没有这些参数文件可以访问官网手动下载https://github.com/ultralytics/yolov5/tree/master/models,亦或手动编写
3, 实例分割
对于实例任务,一般步骤和目标检测的类似,修改方式和图像分类一样,训练推理主程序在segment文件夹下,使用的模型权重文件和模型参数文件也在对应的文件夹中,后缀一般为-seg
三,YOLOv5文件结构介绍
由于不同版本的yolov5文件结构有所改变,所以以下的介绍并不是唯一的,但是作用上大差不差。以下是对于文件中个文件的详细解释,如果你想深入了解可以看看,如果你想快速入门也可以跳过文件结构介绍,在后面的实战中我会介绍需要修改的文件和流程。
文件结构如下
yolov5/
├── data/ # 数据集和配置文件
├── models/ # 模型定义文件
├── classify/ # 完成分类任务从训练到部署的全流程
├── utils/ # 工具函数
├── weights/ # 预训练模型权重(空目录,需下载)
├── runs/ # 训练和推理结果(自动生成)
├── detect.py # 推理脚本
├── train.py # 训练脚本
├── test.py # 测试脚本
├── export.py # 模型导出脚本
├── requirements.txt # 依赖库列表
├── README.md # 项目说明文档
└── ...
1,data/
data/
文件夹是 YOLOv5 项目中用于存放 数据集配置文件、示例数据 和 数据加载相关代码 的目录。它的核心功能是为训练和推理提供数据支持。
data/
├── images/ # 示例图像数据
│ ├── train/ # 训练集图像 自己创建这个文件夹
│ └── val/ # 验证集图像 自己创建这个文件夹
├── scripts/ # 数据准备脚本
├── hyps/ # 超参数配置文件
│ └── hyp.scratch-high.yaml # 默认超参数配置文件
| └── hyp.scratch-low.yaml
| └── hyp.scratch-med.yaml
| └── hyp.no-augmentation.yaml
| └── hyp.Objects365.yaml
├── coco.yaml # COCO 数据集配置文件
├── custom.yaml # 自定义数据集配置文件
|——........多个yaml参数文件除此之外还要创建一个labels文件夹用于存放图像标签
(1)images/
images/主要存放示例图像 ,labels/主要存放标签数据。其中images/train/存放的训练集图像,images/val存放的时验证集图像,labels/train存放的为训练集标签,labels/val存放的是验证集图像。
这些图像就是存放你自己拍的想要识别的图像。
(2)scripts/
scripts/存放数据准备脚本,这些脚本的主要作用是帮助用户快速准备数据集、转换数据格式或下载公共数据集。比如
get_coco.sh
- 自动下载 COCO 数据集(包括图像和标签),COCO)是一个广泛使用的公共数据集包含超过 30 万张图像,它与ImageNet,VOC等公共数据集一样都是已经给了图像,如果你想识别类似的物品可以使用公共数据集。运行方式如下
使用以下命令运行脚本(../yolov5/data/scripts文件夹目录下)。注意一定要赋予脚本执行权限!!!
./get_coco.sh
脚本会自动下载 COCO 数据集并解压到 ../datasets/coco/
目录。下载完成后数据集结构如下所示
../datasets/coco/
├── images/ # 图像数据
│ ├── train2017/ # 训练集图像
│ └── val2017/ # 验证集图像
└── labels/ # 标签数据├── train2017/ # 训练集标签└── val2017/ # 验证集标签
get_imagenet.sh
自动下载 ImageNet 数据集。
download_weights.sh
data/scripts/download_weights.sh
是一个 Shell 脚本,其主要功能是自动下载 YOLOv5 预训练模型的权重文件。YOLOv5 提供了多种不同规模和性能的预训练模型,像 YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x 等,这些预训练模型在大规模数据集上经过训练,可用于目标检测、实例分割等任务。download_weights.sh
脚本的作用就是从指定的远程存储库中下载这些预训练权重文件,让用户能够更便捷地使用这些模型。
预训练模型的权重文件通常较大,将它们包含在代码仓库中会显著增加仓库的体积,这不仅会导致克隆仓库时需要更长的时间和更多的存储空间,还会影响仓库的管理和维护。所以一般当你使用 git clone https://github.com/ultralytics/yolov5
命令克隆 YOLOv5 仓库时,仓库里并不包含预训练的模型权重文件(如 yolov5s.pt
、yolov5l.pt
等)。
以下为download_weights.sh的内容,下列代码下载了 YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x多个模型
#!/bin/bash
# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license
# Download latest models from https://github.com/ultralytics/yolov5/releases
# Example usage: bash data/scripts/download_weights.sh
# parent
# └── yolov5
# ├── yolov5s.pt ← downloads here
# ├── yolov5m.pt
# └── ...python - <<EOF
from utils.downloads import attempt_downloadp5 = list('nsmlx') # P5 models
p6 = [f'{x}6' for x in p5] # P6 models
cls = [f'{x}-cls' for x in p5] # classification models
seg = [f'{x}-seg' for x in p5] # classification modelsfor x in p5 + p6 + cls + seg:attempt_download(f'weights/yolov5{x}.pt')EOF
如果你只想使用yolov5l.pt模型可以修改成如下
#!/bin/bash
# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license
# Download latest models from https://github.com/ultralytics/yolov5/releases
# Example usage: bash data/scripts/download_weights.sh
# parent
# └── yolov5
# ├── yolov5s.pt ← downloads here
# ├── yolov5m.pt
# └── ...python - <<EOF
from utils.downloads import attempt_download# 仅下载YOLOv5l模型
attempt_download('weights/yolov5l.pt')EOF
使用以下命令运行脚本(../yolov5/data/scripts文件夹目录下)
./download_weights.sh
(3)hyps/
data/hyps
目录下存放的是超参数(Hyperparameters)配置文件,这些文件以 YAML(YAML Ain't Markup Language)格式存储。
超参数是在模型训练前需要手动设定的参数,与模型在训练过程中自动学习的参数(如权重和偏置)不同。合理选择超参数对模型的性能、训练速度和泛化能力有重要影响。data/hyps
目录下的 YAML 文件用于定义不同场景或任务下的超参数配置。YOLOv5 提供了多个预定义的超参数配置文件,以适应不同的数据集、硬件条件和训练需求。
-
hyp.no-augmentation.yaml
文件用于在训练时不进行数据增强的场景。数据增强是通过对原始图像进行诸如旋转、缩放、翻转等操作来扩充数据集,提升模型的泛化能力。不过在某些情况下,像数据集本身就足够大或者想精确评估模型在原始数据上的表现时,可能就不需要数据增强。文件里的数据增强相关超参数会被设为零或者无效值,以此来禁用数据增强操作。
-
hyp.Objects365.yaml
当使用 Objects365 数据集训练 YOLOv5 模型时,适合采用这个超参数配置文件。Objects365 是一个大规模的目标检测数据集,包含 365 个常见物体类别,其数据分布和特点与其他数据集存在差异。文件中的超参数是针对 Objects365 数据集经过优化的,像学习率、损失函数权重等参数会依据该数据集的特性进行调整,从而使模型在这个数据集上能取得更好的训练效果。
-
hyp.scratch-high.yaml
适用于从头开始(scratch)训练模型,并且期望使用较高的资源配置(如更多的计算资源、更长的训练时间)来获取更好性能的场景。当你有充足的计算资源和时间,想要在特定数据集上训练出高性能的模型时,就可以选用这个配置文件。文件中的超参数设置倾向于激进的训练策略,例如较高的学习率、较大的数据增强幅度等,目的是让模型在训练过程中更快地收敛并学习到更多的特征。
-
hyp.scratch-low.yaml
同样是用于从头开始训练模型,但适用于计算资源有限或者训练时间较短的场景。比如你只有少量的计算资源,或者想快速验证模型在特定数据集上的可行性,就可以使用这个配置文件。 文件中的超参数设置相对保守,例如较低的学习率、较小的数据增强幅度等,以降低计算成本和训练时间。
(4)各种yaml参数文件
YOLOv5 中 data
目录下的这些 YAML 文件是数据集配置文件,用于定义不同数据集的参数(如数据路径、类别信息、训练验证集划分等),让模型知晓数据结构和位置。
1.通用 / 经典数据集配置
coco.yaml
针对 COCO 目标检测数据集的配置,定义 COCO 数据集的类别名称、类别数量(80 类),以及训练集、验证集的文件路径(默认指向 COCO 数据集对应拆分),是目标检测任务的经典配置。coco128.yaml
COCO 数据集的子集(仅 128 张图像),用于快速验证训练流程是否正常,减少全量 COCO 训练的耗时,方便调试代码或测试训练脚本逻辑。VOC.yaml
适配 PASCAL VOC 数据集,定义其 20 类目标(如汽车、行人、狗等),以及训练集、验证集路径,适用于基于 VOC 数据集的目标检测任务。
2. 特定场景数据集配置
Objects365.yaml
针对 Objects365 数据集(含 365 类日常物体),配置其类别信息和数据路径,用于该数据集的目标检测训练。GlobalWheat2020.yaml
适配 Global Wheat 2020 数据集,主要用于麦穗检测任务,定义麦穗数据集的类别(通常为单类 “麦穗”)和数据路径。VisDrone.yaml
服务于 VisDrone 无人机视觉数据集,适用于无人机拍摄场景下的目标检测(如车辆、行人等),配置其类别和数据路径。
3. 分类任务数据集配置
ImageNet.yaml
ImageNet10.yaml
ImageNet100.yaml
ImageNet1000.yaml
针对 ImageNet 图像分类数据集,不同文件对应不同分类规模:ImageNet1000.yaml
:标准 1000 类 ImageNet 分类配置;ImageNet100.yaml
/ImageNet10.yaml
:分别为 100 类、10 类的简化版,用于特定分类任务或快速实验;- 定义类别名称、数量及数据路径,适配分类模型训练。
4. 其他特殊数据集
Argoverse.yaml
适配 Argoverse 数据集,常用于自动驾驶场景下的目标检测,配置该数据集的类别和路径。SKU-110K.yaml
针对 SKU-110K 商品检测数据集,定义商品类别信息和数据路径,适用于商品目标检测任务。
如果你要训练自己的数据集,需要自己建一个yaml文件用于告知 YOLOv5 模型你的数据路径、类别信息等关键内容。
一个标准的自定义数据集 YAML 文件需包含以下字段:
# 示例:my_data.yaml
train: path/to/train/images # 训练集图像路径(可写绝对路径或相对项目根目录的路径)
val: path/to/val/images # 验证集图像路径
nc: 5 # 类别数量(根据实际任务调整,如 5 类目标)
names: ['class1', 'class2', 'class3', 'class4', 'class5'] # 类别名称列表,按顺序对应类别 ID
这个文件会在训练时通过命令行指定
python train.py --data my_dataset.yaml --weights yolov5s.pt # 假设用 yolov5s 预训练权重
2,classify/
在 YOLOv5 的 classify
文件夹中,所有文件均围绕图像分类任务设计,用于实现分类模型的训练、预测、验证等功能。classify
文件夹是 YOLOv5 实现图像分类功能的核心模块,通过这几个文件协作,完成分类任务从训练到部署的全流程。
此文件主要实现的是图像分类任务,与yolov5目录下的各.py文件命名相同,但是yolov5目录下的py文件主要完成的是目标检测
-
predict.py
执行图像分类预测任务。加载预训练的分类模型(如 YOLOv5 分类模型),对输入图像 / 视频 / 文件夹等数据进行推理,输出分类结果(类别标签、置信度等)。用户可通过修改参数指定输入数据路径、模型权重、输出格式等。
-
train.py
训练自定义的图像分类模型。
读取分类数据集配置(如数据路径、类别信息),设置训练超参数(学习率、迭代次数等),调用模型架构,完成模型训练过程。支持加载预训练权重初始化模型,适用于从零训练或迁移学习。
-
tutorial.ipynb
Jupyter Notebook 格式的教程文件。
-
val.py
验证分类模型的性能
加载训练好的分类模型,对验证集数据进行推理,计算评估指标(如准确率、混淆矩阵等),用于分析模型在分类任务上的泛化能力,辅助调优模型。
3,models/
在 YOLOv5 的 models
目录下,各文件夹及文件承担不同功能,共同支撑模型架构定义、组件构建等核心任务
-
hub/
与 PyTorch Hub 集成:
- 存放模型发布到 PyTorch Hub 的相关代码,支持通过
torch.hub.load()
便捷加载 YOLOv5 模型,简化模型调用流程。
PyTorch Hub 是 PyTorch 框架中的一个预训练模型库和共享平台,旨在方便研究人员和开发者分享、复用预训练模型,促进研究的可重复性。它集合了众多来自官方和社区贡献者的预训练模型,如计算机视觉领域的 ResNet、EfficientNet,自然语言处理领域的 BERT、GPT 相关模型 ,音频处理领域的各类模型等。开发者无需自行寻找模型代码和预训练权重,通过简单的torch.hub.load()
API 即可加载使用,比如model = torch.hub.load('pytorch/vision:v0.10.0', 'resnet18', pretrained=true)
,这行代码从pytorch/vision
库的v0.10.0
版本中加载了resnet18
模型,并使用预训练权重。模型开发者想分享自己的预训练模型时,只需在 GitHub 仓库中添加一个简单的hubconf.py
文件,定义好模型的入口函数等内容,就可将模型发布到 PyTorch Hub 供他人使用
借助 models/hub
文件夹中的配置,你能够使用 PyTorch Hub 的 API 快速加载预训练的 YOLOv5 模型。使用的是预训练的 YOLOv5s 模型,该模型在 COCO 数据集上进行了训练,所以它可以检测 COCO 数据集中定义的 80 种常见目标类型,例如人、汽车、狗、猫、椅子等。如下:
import torch# 加载预训练的 YOLOv5s 模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)# 对图像进行推理
results = model('path/to/your/image.jpg')# 显示检测结果
results.show()
不需要修改
-
segment/
服务于实例分割任务:
- 包含分割任务特有的模型组件(如分割头网络),定义分割模型的架构逻辑,配合训练代码实现目标检测与实例分割功能。
目标检测主要是找出图像中目标的位置和类别,而实例分割不仅要完成目标检测的任务,还需要精确地分割出每个目标实例的像素级掩码。models/segment
文件夹中的代码和配置文件就是为了实现 YOLOv5 模型的实例分割功能。
先介绍一下实例分割: 同时定位图像中的目标实例并分割出每个实例的精确像素级掩码。它是目标检测和语义分割的结合,解决了传统目标检测无法区分同类不同实例的问题。比如区分同一画面的两辆不同汽车,处理目标间的相互遮挡(如重叠的车辆、人群),准确分割目标的边缘和复杂形状(如树木的枝叶、车辆的反光)等等
里面包括5个yaml文件。该文件夹下包含用于实例分割的模型配置文件,例如 yolov5s-seg.yaml
、yolov5m-seg.yaml
等。这些文件定义了适用于实例分割任务的模型架构,其结构与目标检测的配置文件类似,但会有一些针对实例分割的特殊设计。
使用方法:使用以下命令基于预训练的 YOLOv5s 实例分割模型进行训练。
python segment/train.py --img 640 --batch 16 --epochs 50 --data your_data.yaml --weights yolov5s-seg.pt
-
__init__.py
Python 包初始化文件,标识 models
为 Python 模块,方便其他文件导入该目录下的类或函数。
此文件不需要修改
-
common.py
定义模型通用组件,如:
- 基础卷积模块(
Conv
)、瓶颈层(Bottleneck
)、CSP 模块(C3
)等。 - 激活函数(如
SiLU
)、归一化层(BatchNorm2d
)等基础操作。 - 是搭建 YOLOv5 网络结构的底层模块库。
此文件不需要修改
-
experimental.py
存放实验性模块,用于测试新架构或技术:
- 例如实验性的卷积模块、新型网络结构等,供开发者探索模型改进方向,非稳定正式功能。
此文件不需要修改
-
tf.py
提供 TensorFlow 模型转换工具:
- 支持将 YOLOv5 的 PyTorch 模型转换为 TensorFlow 格式(如
.pb
文件),便于在 TensorFlow 生态中部署。
此文件不需要修改
-
yolo.py
核心模型构建文件:
- 解析 YAML 配置文件(如
yolov5s.yaml
),生成对应的 YOLOv5 模型架构。 - 定义模型前向传播逻辑,处理输入图像到检测结果的计算流程。
此文件不需要修改
剩下的.yaml文件
定义不同规模 YOLOv5 模型的网络架构:
- 描述每层网络的类型、参数(如卷积核大小、通道数)、模块连接方式等。
- 例如
yolov5s.yaml
对应小尺寸模型,yolov5x.yaml
对应大尺寸模型,训练或推理时通过解析这些文件生成具体模型结构。
训练自己的数据集需要修改的:
如果你想要训练自己的数据集,你根据自己的需求选择合适的模型配置文件(yolov5s.yaml
、yolov5m.yaml
、yolov5l.yaml
和 yolov5x.yaml
等)并修改其中的类别数量。 打开你选择使用的模型配置文件将第一行nc: 后的数字修改,如果你要检测的目标有3种就改为3。除此之外其他参数几乎不需要修改,当然,如果你有丰富的经验和特定的需求,可以对这些参数进行调整以优化模型的复杂度和性能。
除此之外,如果你要实现实例分割功能,要使用segment/中的配置文件,它的结构和目标检测配置结构类似,也要修改nc来指定数据集中的类别数量。
4,segment/
可以发现segment下的文件和classify下的文件是一样的。实际上它们是类似的,只不过segment/还多了一个实例分割功能。以下为具体不同
train.py
classify/train.py
- 任务:专注图像分类训练。
- 核心逻辑:加载分类数据集(如 ImageNet 格式),定义分类损失函数(如交叉熵),训练模型对图像整体类别进行预测,优化目标是提升分类准确率。
segment/train.py
- 任务:实现实例分割训练。
- 核心逻辑:处理带目标框和实例掩码的数据集,同时优化目标检测损失(如框回归损失、分类损失)和分割损失(如掩码预测损失),训练模型输出目标位置、类别及像素级分割掩码。
predict.py
classify/predict.py
- 功能:输入图像,输出图像所属类别及对应置信度。
- 示例:判断输入图片是 “猫” 还是 “狗”。
segment/predict.py
- 功能:输入图像,输出目标检测框、类别标签,以及每个目标的实例分割掩码。
- 示例:不仅标出图像中的狗,还生成狗轮廓的像素级掩码。
val.py
classify/val.py
- 作用:验证分类模型性能,计算准确率、混淆矩阵等分类任务专属指标,评估模型对各类别的区分能力。
segment/val.py
- 作用:验证实例分割模型,计算检测指标(如 mAP)和分割指标(如 PQ,全景质量),综合评估目标定位、分类、分割的整体效果。
tutorial.ipynb
classify/tutorial.ipynb
- 内容:以图像分类为主题,演示分类任务全流程,包括数据准备、模型训练、预测推理,示例围绕分类数据集(如 ImageNet 子集)展开。
segment/tutorial.ipynb
- 内容:聚焦实例分割,讲解如何准备带掩码标注的数据集,训练分割模型,展示推理结果(检测框 + 分割掩码),流程和数据均适配实例分割场景。
5,utils/
在 YOLOv5 中,utils
文件夹包含了一系列辅助工具函数和类,这些工具在模型训练、推理、数据处理、日志记录等各个环节都发挥着重要作用。
此文件不需要修改
aws/
主要和 Amazon Web Services(AWS)相关,用于支持在 AWS 环境下运行相关任务。
Amazon Web Services(AWS) 是亚马逊公司旗下的云计算服务平台,为全球用户提供全面且丰富的云计算服务。从全球数据中心提供超过 200 项功能齐全的服务,涵盖计算(如弹性计算云 EC2,可按需租用虚拟服务器运行应用程序 )、存储(如简单存储服务 S3,提供高可扩展的对象存储 )、数据库(如关系型数据库服务 RDS,支持多种数据库引擎 ;完全托管的 NoSQL 数据库服务 DynamoDB )、网络(如虚拟私有云 VPC,可创建隔离的网络环境 )、分析、机器学习、人工智能、物联网等多个领域。
AWS 环境指的是基于 AWS 云计算平台构建的一系列资源和配置组合,用于支持各类应用程序和业务需求的运行。用户可以根据需求选择不同规格的虚拟服务器实例(EC2),还能利用 AWS Lambda 实现无服务器计算。
__init__.py
这是 Python 包的初始化文件,在 Python 中,当一个目录包含 __init__.py
文件时,该目录就被视为一个 Python 包。虽然这个文件内容可能为空,但它起到标识 aws
为一个可导入模块的作用,方便其他 Python 代码从该目录导入函数、类等。
mime.sh
这是一个 shell 脚本文件。它可能用于处理与多用途互联网邮件扩展(MIME)相关的任务。在 AWS 环境中,可能涉及到数据传输、文件上传下载等操作,而 MIME 类型用于标识文件格式等信息,mime.sh
或许是用来设置、检测或者转换 MIME 类型,确保数据在 AWS 服务(如 S3 存储桶)之间能正确传输和处理。在 AWS 环境中进行文件上传、下载和存储时,正确处理文件的 MIME 类型很重要。mime.sh
脚本可以帮助你设置、检测或转换文件的 MIME 类型,确保文件在不同的 AWS 服务(如 S3 存储桶)之间能够正确传输和处理。例如,当你将训练好的模型权重文件上传到 S3 时,脚本可以确保文件的 MIME 类型被正确设置,方便后续使用。
resume.py
在 AWS 上训练 YOLOv5 模型时,可能会因为各种原因(如实例中断、训练时间限制等)导致训练过程中断。resume.py
脚本可以帮助你从上次中断的位置继续训练。它会加载之前保存的模型权重和训练状态,让训练任务能够无缝恢复,避免从头开始训练浪费大量时间和计算资源。
userdata.sh
userdata.sh
是一个 shell 脚本,通常在 AWS 云服务中,userdata
用于在启动实例(如 EC2 实例)时自动执行一些初始化脚本。这个文件可能包含了在 AWS 实例启动时安装必要软件(如 YOLOv5 所需的依赖)、配置环境变量、下载数据集或模型权重等操作,以确保 YOLOv5 能在 AWS 实例上顺利运行。
何时使用此文件?
如果你本地的计算资源有限,无法满足大规模数据训练或高并发推理的需求,就可以选择使用 AWS 的弹性计算云(EC2)实例。utils/aws
文件夹中的脚本可以帮助你在 EC2 实例上快速搭建 YOLOv5 的运行环境。例如,userdata.sh
脚本可以在实例启动时自动安装所需的依赖库、下载 YOLOv5 代码和数据集,让你能够迅速开始训练或推理任务。除此之外,AWS 的简单存储服务(S3)提供了高可扩展性和可靠性的对象存储功能。你可以将训练数据、模型权重文件和日志等存储在 S3 中。utils/aws
相关工具可以协助处理文件在 S3 中的存储和访问,确保数据的安全和有效管理。
一般情况下不使用此文件,如果你的计算资源有限,你还可以在谷歌,阿里云等等云服务平台上训练或者是在网上找别人给你训练。
docker/
utils/docker
文件夹下的文件主要用于创建 Docker 镜像,方便在不同环境中部署和运行 YOLOv5
Dockerfile
这是构建 Docker 镜像的基础文件,定义了镜像的内容和运行环境。它通常包含了安装 YOLOv5 所需的系统依赖、Python 依赖,以及复制 YOLOv5 代码到镜像内等操作,让用户可以在一个隔离且一致的环境中运行 YOLOv5 ,避免因本地环境差异导致的问题。
Dockerfile-arm64
此文件专门为基于 ARM64 架构的设备(如一些移动设备、部分云服务器等)构建 Docker 镜像。由于 ARM64 架构和常见的 x86 架构存在差异,一些软件和库的安装方式也有所不同,该文件针对 ARM64 架构进行了适配,确保 YOLOv5 能在这类设备上正常部署和运行。
Dockerfile-cpu
该文件用于构建仅使用 CPU 资源运行 YOLOv5 的 Docker 镜像。在没有 GPU 或者不想使用 GPU 资源的情况下,通过这个镜像可以方便地在 CPU 环境中运行 YOLOv5 ,对于一些对计算资源要求不高,或者 GPU 资源有限的场景很有帮助。
何时使用此文件?
在团队开发项目时,不同成员的本地开发环境可能存在差异,比如 Python 版本、依赖库版本等不一致,这可能导致在一个人电脑上能正常运行的 YOLOv5 代码,在其他人电脑上出错。通过使用 Docker 文件构建镜像,团队成员可以基于相同的运行环境进行开发、训练和测试,避免因环境问题产生的错误。当你需要将 YOLOv5 项目从一个环境迁移到另一个环境,如从本地开发环境迁移到服务器上部署时,使用 Docker 镜像可以确保项目在新环境中也能以相同的配置运行,无需在新环境中重新配置繁琐的依赖和系统设置。
在将 YOLOv5 部署到云平台(如 AWS、阿里云等)时,使用 Docker 镜像可以简化部署流程。你只需将构建好的镜像上传到云平台的容器服务中,即可快速启动应用,无需在云服务器上一步步安装和配置环境。对于边缘计算设备,如工业物联网中的智能摄像头、智能传感器等,Docker 镜像便于在这些设备上快速部署 YOLOv5 进行本地实时的目标检测,减少部署时间和复杂度。
总结来说就是完成快速部署
/flask_rest_api
在 YOLOv5 的 utils/flask_rest_api
目录中,这些文件主要与基于 Flask 框架创建 REST API 来使用 YOLOv5 模型相关
Flask 是一个轻量级的 Python Web 框架,被称为 “微框架”(Microframework),它为开发者提供了构建 Web 应用程序的基础工具和功能。Flask 的核心代码简洁,易于理解和上手。它没有强制的项目结构和复杂的依赖,开发者可以根据自己的需求灵活选择和添加扩展。例如,你可以轻松地创建一个简单的 Web 应用,只需要几行代码。
REST API(Representational State Transfer Application Programming Interface)即表述性状态传递应用程序编程接口,是一种基于 HTTP 协议的 API 设计风格,用于在不同的系统之间进行数据交互。基于 Flask 框架创建 REST API 来使用 YOLOv5 模型,意味着将 YOLOv5 模型封装成一个可通过网络访问的服务。
具体步骤和含义如下:
- 封装 YOLOv5 模型:使用 Flask 框架将 YOLOv5 模型的目标检测功能封装成一个或多个 API 接口。例如,创建一个 API 接口用于接收用户上传的图像,然后调用 YOLOv5 模型对图像进行目标检测,并将检测结果返回给用户。
- 提供统一的访问方式:通过 REST API,不同的客户端(如 Web 应用、移动应用等)可以使用标准的 HTTP 请求(如 GET、POST 等)来调用 YOLOv5 模型的服务。例如,客户端可以使用 POST 请求将图像数据发送到 API 接口,API 接口处理请求并返回检测结果。
- 实现松耦合和可扩展性:将 YOLOv5 模型封装成 REST API 可以实现模型与客户端的松耦合,客户端不需要了解模型的具体实现细节,只需要按照 API 文档的要求发送请求即可。同时,这种方式也便于对模型进行扩展和更新,只需要修改 API 服务端的代码,而不会影响到客户端的使用
example_request.py
这是一个 Python 示例文件,用于展示如何向基于 Flask 搭建的 YOLOv5 API 发送请求。通过这个示例,你可以了解请求的格式、参数设置等内容,方便在自己的项目中集成并调用该 API。例如,它可能包含如何准备图像数据、设置请求头,以及处理 API 返回结果的代码,让你能够快速上手使用这个 API 来进行目标检测等操作。
README.md
这是一个说明文档文件,通常包含了搭建和使用基于 Flask 的 YOLOv5 REST API 的详细说明。比如,介绍该 API 的功能特点、安装和配置步骤(包括所需的依赖库)、示例请求和响应的格式说明,以及可能遇到的问题和解决方法等内容。通过阅读这个文档,你可以全面了解如何利用这些文件构建和使用 API 服务。
server.py
该文件是基于 Flask 构建的 REST API 服务器的核心代码。它定义了 API 的路由(如用于接收图像进行目标检测的路由),处理客户端发送过来的请求,调用 YOLOv5 模型对输入数据(如图片)进行处理,并将检测结果以合适的格式(如 JSON 格式)返回给客户端。借助这个文件,能够将 YOLOv5 模型部署为一个可通过网络访问的服务,方便在不同的应用场景中进行调用。
何时使用此文件?
当你希望不同平台(如 Windows、Linux、macOS)或不同编程语言(如 Python、Java、JavaScript 等)的程序都能方便地使用 YOLOv5 模型时,通过这个文件构建 REST API,其他程序可以通过标准的 HTTP 请求来访问 YOLOv5 的检测服务,无需关心模型具体的运行环境和实现细节 。例如,一个基于 JavaScript 的前端网页应用想要实现目标检测功能,就可以通过向该 API 发送包含图片的请求,获取 YOLOv5 模型的检测结果。
在前后端分离的项目中,前端负责界面展示和用户交互,后端提供数据和业务逻辑支持。flask_rest_api
文件可以帮助你将 YOLOv5 模型作为后端服务的一部分,通过 API 向前端提供目标检测功能,使前后端开发人员可以并行工作,提高开发效率。
为不同的客户端提供统一的访问方式,方便客户端调用 YOLOv5 模型进行目标检测,降低客户端的开发成本和技术门槛。
为不同的客户端提供统一的访问方式,方便客户端调用 YOLOv5 模型进行目标检测,降低客户端的开发成本和技术门槛。
当 YOLOv5 模型有更新或改进时,只需要在 API 服务端进行修改和部署,客户端无需进行大量的代码修改,只需要按照新的 API 文档进行调用即可,便于模型的版本管理和功能迭代。
/loggers
在 YOLOv5 中,utils/loggers
文件夹主要用于记录和管理训练过程中的各种信息,方便用户监控模型训练状态、分析训练结果以及进行超参数优化等。
/clearml
__init__.py
作为 Python 包的初始化文件,标识该目录为一个可导入的 Python 包
clearml_utils.py
包含与 ClearML 交互的实用工具函数。例如,这些函数可能用于将训练中的指标(如损失值、准确率)、模型参数、数据集信息等发送到 ClearML 平台,以便在 ClearML 的界面中进行可视化和管理。
hpo.py
与超参数优化(Hyperparameter Optimization,HPO)相关。它定义了使用 ClearML 进行超参数搜索和优化的逻辑,比如设置超参数的搜索空间、选择优化算法(如随机搜索、贝叶斯优化等),并将优化过程中的结果记录到 ClearML 中。
README.md
提供关于如何使用该模块与 ClearML 集成的说明文档,包括安装 ClearML、配置项目、运行 YOLOv5 训练并记录到 ClearML 等操作步骤和注意事项。
/comet
comet
是另一个机器学习实验管理和可视化平台,loggers/comet
下的文件用于 YOLOv5 与 Comet 的集成
__init__.py
comet_utils.py
包含与 Comet 平台交互的工具函数。这些函数可以将训练过程中的各种数据(如训练损失、验证损失、指标变化等)发送到 Comet 上,以便在 Comet 的界面中进行可视化展示,帮助用户直观地了解模型的训练进展。
hop.py
类似于 clearml
中的 hpo.py
,用于定义使用 Comet 进行超参数优化的相关逻辑,记录超参数优化过程中的实验结果和指标变化。
README_config.json
包含了与 Comet 平台进行交互所需的一些配置信息,如 API 密钥、项目名称等。
README.md
介绍如何将 YOLOv5 与 Comet 集成的文档,包括注册 Comet 账号、安装相关依赖、配置项目以及如何在训练中使用 Comet 记录和监控实验等内容
/wandb
wandb
(Weights & Biases)也是一个广泛使用的机器学习实验跟踪和管理平台,loggers/wandb
下的文件用于实现 YOLOv5 与 wandb 的集成
__init__.py
wandb_utils.py
包含与 wandb 进行交互的工具函数。这些函数可以将训练过程中的数据(如模型权重、训练日志、评估指标等)记录到 wandb 平台上,用户可以在 wandb 的界面中查看实验的详细信息、对比不同实验结果以及进行可视化分析。
__init__.py
/segment
utils
目录下的文件服务于 YOLOv5 整体框架,涵盖分类、检测、分割等多种任务的通用功能支持;而 utils/segment
下的文件专门为实例分割任务定制 。
__init__.py
作为 Python 包的初始化文件,它标识 utils
为一个可导入的包。在该文件中可定义一些初始化代码,比如设置默认的导入行为,当其他 Python 脚本导入 utils
包时,相关初始化操作会自动执行。
activations.py
包含各种激活函数的定义和实现。在神经网络中,激活函数用于为神经元引入非线性,使模型能够学习和表示复杂的模式。例如,常见的 ReLU、Swish 等激活函数的代码可能会在这个文件中。
augmentations.py
负责定义数据增强的方法。在训练目标检测模型时,为了增加数据集的多样性,提升模型的泛化能力,会对图像进行各种变换,如随机翻转、旋转、缩放、颜色抖动等,该文件就包含了这些数据增强操作的具体实现。
autoanchor.py
用于自动计算锚框(Anchor Boxes)。锚框是目标检测模型中用于预测目标位置的预定义框。此文件通过一定的算法,根据数据集的特点自动生成合适的锚框尺寸,使模型能更好地检测不同大小和形状的目标
autobatch.py
主要涉及自动批量大小调整功能。在训练过程中,根据系统的硬件资源(如 GPU 显存)和模型的复杂度,自动确定合适的批量大小,以优化训练效率,避免因批量过大导致内存不足或批量过小使资源利用不充分。
callbacks.py
定义训练过程中的回调函数。回调函数会在训练的特定阶段(如每个 epoch 开始、结束,训练结束等)被调用,可用于执行诸如保存模型权重、记录训练日志、动态调整学习率等操作。
dataloaders.py
负责数据加载器的实现。数据加载器用于从磁盘读取数据(图像和对应的标注信息),并将其整理成模型训练或推理时能够接受的格式,同时支持数据的批量处理和多线程加载,以提高数据读取效率。
downloads.py
提供下载功能,用于从指定的远程地址下载预训练模型权重、数据集等资源。方便用户快速获取所需的文件,无需手动去网页下载。
general.py
包含一系列通用的工具函数,如文件和目录操作、数据类型转换、计算交并比(IoU)、非极大值抑制(NMS)等。这些函数在 YOLOv5 的各个环节都会被频繁使用。
loss.py
定义模型训练过程中使用的损失函数。在目标检测任务中,损失函数用于衡量模型预测结果与真实标注之间的差距,通过不断最小化损失函数来优化模型参数,比如包含目标分类损失和边界框回归损失等的计算逻辑。
metrics.py
用于计算各种评估指标,如平均精度均值(mAP)、F1 分数等。在训练完成后,通过这些指标可以评估模型在目标检测任务中的性能表现,帮助用户了解模型的优劣。
plots.py
提供绘图相关的函数,用于可视化训练过程中的各种信息,如绘制训练损失曲线、验证指标曲线,以及可视化目标检测的结果(在图像上绘制检测框和类别标签),方便用户直观地分析训练效果和模型输出。
torch_utils.py
包含与 PyTorch 相关的工具函数,例如模型的初始化、多 GPU 训练的支持、混合精度训练的设置等。由于 YOLOv5 是基于 PyTorch 开发的,这个文件有助于更好地利用 PyTorch 的特性来训练和部署模型。
triton.py
与 NVIDIA Triton 推理服务器集成相关。Triton 推理服务器可以优化和加速模型的推理过程,该文件可能包含将 YOLOv5 模型转换为适合在 Triton 服务器上运行的格式,以及与 Triton 服务器进行交互的代码,以实现高效的推理服务。
何时使用utils下的py文件?
在训练自己的自定义 YOLOv5 模型时,大部分情况下 YOLOv5 已经为你调用好了这些文件中的功能,也就是说这些文件一般不需要我们动,甚至不需要我们了解,它只是被yolo的核心代码所调用,例如utils
文件夹下的 dataloaders.py
和 augmentations.py
文件负责数据加载和增强,在运行 train.py
脚本时,YOLOv5 会自动调用这些文件中的函数来完成数据的加载、预处理和增强操作。loss.py
和 metrics.py
文件分别用于计算损失函数和评估模型性能,YOLOv5 在训练和验证过程中会自动调用这些文件中的函数。torch_utils.py
文件提供了与 PyTorch 相关的工具函数,如模型初始化、多 GPU 训练支持等,YOLOv5 会自动调用这些函数来完成模型的初始化和训练设置。
但在某些特殊情况下,如果你需要实现一些特殊的数据处理或增强方法,可以手动修改 augmentations.py
文件或在自己的代码中调用其中的函数。例如,你想添加一种新的数据增强方式,可以在 augmentations.py
中添加相应的函数,并在数据加载器中调用。如果你对模型的评估指标有特殊要求,可以手动调用 metrics.py
文件中的函数或添加自定义的评估指标计算方法。例如,你想计算除了 mAP 之外的其他指标,可以在自己的代码中调用相关函数进行计算。如果你需要在训练过程中添加一些自定义的回调函数,如在每个 epoch 结束时保存模型的中间结果,可以手动调用 callbacks.py
文件中的相关函数或添加自定义的回调函数。
6,其余各文件
配置与说明文件
.dockerignore
:用于指定在构建 Docker 镜像时,哪些文件或目录应该被忽略,不添加到镜像中,从而减小镜像体积。.gitattributes
:定义 Git 仓库中文件的属性,比如可以设置某些文件的文本换行符样式、是否进行关键字展开等。.gitignore
:告诉 Git 哪些文件或目录不需要被跟踪,例如日志文件、临时文件等,避免将不必要的文件提交到版本库中。CITATION.cff
:提供项目的引用信息,方便他人在学术论文等场景中正确引用 YOLOv5。CONTRIBUTING.md
:说明如何为 YOLOv5 项目做贡献,包括代码提交规范、问题反馈流程等内容,鼓励社区成员参与项目开发。LICENSE
:声明项目的开源许可证,规定了用户使用、修改和分发该项目代码的权利和限制。pyproject.toml
:用于配置项目的构建、依赖管理等信息,是 Python 项目的一种配置文件格式。README.md
和README.zh-CN.md
:项目的说明文档,前者是英文版本,后者是中文版本,主要介绍项目的功能、特点、安装步骤、使用方法等内容。readme.txt
:也是项目的说明文件,内容和README.md
有一定相似性,提供基本的项目介绍和使用指引
代码文件
benchmarks.py
:用于运行基准测试,评估模型在不同硬件环境下的性能表现,如推理速度、资源占用等。detect.py
:实现目标检测推理功能的脚本。可输入图像、视频或摄像头实时流,利用训练好的 YOLOv5 模型进行目标检测,并输出检测结果,可视化展示在图像或视频上。export.py
:将训练好的 YOLOv5 模型导出为其他格式,方便在不同的平台或框架中部署使用,如 ONNX、TorchScript 等格式。hubconf.py
:用于支持通过 PyTorch Hub 便捷地加载 YOLOv5 模型,方便用户快速获取和使用预训练模型。requirements.txt
:列出项目运行所需的依赖库及其版本要求,通过pip install -r requirements.txt
命令可一键安装这些依赖。
训练与评估脚本
train.py
:核心训练脚本,用于训练自定义的 YOLOv5 模型。可配置训练参数,如训练轮数、批量大小、学习率等,加载数据集进行模型训练,并保存训练过程中的最佳模型权重。tutorial.ipynb
:Jupyter Notebook 格式的教程文件,逐步演示 YOLOv5 的使用方法,包括数据准备、模型训练、推理等过程,帮助用户快速上手。val.py
:验证脚本,用于评估训练好的模型在验证集上的性能,计算如平均精度均值(mAP)等评估指标,判断模型的泛化能力和效果。
三,模型训练
模型训练需要大量计算资源和显存,如果你的配置较低的话可以在网上租一个,一般RTX3090二三十元就可以
拿到(租到)训练模型用的电脑后。对于租用,一般会让你选择镜像,其中包括pytorch和python环境和cuda版本,你可以先在自己的电脑上完成下面的"克隆YOLOv5仓库",按照步骤知晓自己要使用的Pytorch版本,这样就不用再进行安装cuda,pytorch等复杂的步骤。对于你自己的电脑,除了以下教程,还要完成相关的python3配置,网上教程较多,这里就不做说明了。
1,环境准备
(1)克隆YOLOv5仓库和PyTorch安装
git clone https://github.com/ultralytics/yolov5
cd yolov5
克隆完YOLOv5的仓库后,先打开yolov5文件夹里的requirements.txt ,找到所需要的pytorch版本,如下图所示,即torch版本1.8.0,tochvision0.9.0。
知道所需的pytorch版本后我们下载pytorch的GPU版本。知道pytorch版本后进入cuDNN Archive | NVIDIA Developer选择对应的CUDA的版本(比如CUDA11.3),根据自己选择的CUDA版本然后将下面的cu113替换。
pip install torch==1.7.0+cu113 torchvision==0.8.1+cu113 torchaudio==0.7.0 --extra-index-url https://download.pytorch.org/whl/cu113
- PyTorch的官方包分为CPU版本和GPU版本(支持CUDA)。默认情况下,
pip
会从PyPI(Python Package Index)下载包,但PyPI只提供CPU版本的PyTorch。--extra-index-url
可以指定从PyTorch官方的预编译包仓库下载GPU版本的PyTorch。 -
cu113
表示该版本的PyTorch是为CUDA 11.3编译的。如果你使用的是其他CUDA版本(如CUDA 11.7或CUDA 12.1),需要将cu113
替换为对应的版本号(如cu117
或cu121
)。
单独安装pytorch目的:为了使用GPU加速,必须安装与CUDA版本匹配的PyTorch。requirements.txt
默认安装的PyTorch是CPU版本,无法利用GPU。
安装YOLOv5所需要的依赖
pip install -r requirements.txt
这里requirements.txt中也有pytorch的安装,但是由于我们之前已经安装过了pip
会跳过这些包的安装。
(2)安装CUDA和cuDNN
-
CUDA: 安装与你的GPU驱动程序兼容的CUDA版本。
-
cuDNN: 安装与CUDA版本匹配的cuDNN。
首先要确定显卡支持的CUDA的版本
打开命令提示符(Windows)或终端(Linux/Mac),输入以下命令:
nvidia-smi
在输出结果中,查找“CUDA Version”字段,例如“CUDA Version: 12.1”。这表示您的显卡支持的最高CUDA版本
如果nvidia-smi
未显示CUDA版本,可以使用以下命令:这将显示当前安装的CUDA版本,如果你的电脑上没有安装CUDA,则会提示命令未找到
nvcc -V
确保选择的CUDA版本不超过显卡支持的最高版本。例如,如果nvidia-smi
显示支持CUDA 12.1,则可以选择CUDA 11.x或12.x,但不能选择12.2或更高版本
然后确定PyTorch支持的版本,访问PyTorch官网,查看当前PyTorch版本支持的CUDA版本。例如,PyTorch 2.0支持CUDA 11.7和11.8 ,PyTorch1.8支持CUDA11.1
接下来下载CUDA
CUDA Toolkit Archive | NVIDIA Developer访问NVIDIA:CUDA Toolkit Archive | NVIDIA Developer。选择与显卡和PyTorch兼容的CUDA版本,下载适合你当前操作系统的安装包(Windows/Linux/Mac)。
-
运行下载的安装程序,选择“自定义安装”。
确保勾选以下组件:
-
CUDA Toolkit:核心组件。
-
CUDA Samples:可选,用于测试CUDA安装。
-
NVIDIA驱动:如果未安装最新驱动,建议勾选
安装完成后,验证CUDA是否安装成功:如果显示CUDA版本信息,则安装成功
nvcc -V
接下来下载和配置cuDNN
cuDNN是CUDA的加速库,必须与CUDA版本匹配。
cuDNN Archive | NVIDIA Developer访问cuDNN Archive | NVIDIA Developer,登录后下载与CUDA版本对应的cuDNN
解压下载的cuDNN文件,将其中的bin
、include
和lib
文件夹复制到CUDA安装目录(如C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8
)
验证CUDA和cuDNN
在Python环境中运行以下代码:
import torch
print(torch.cuda.is_available()) # 应返回True
print(torch.backends.cudnn.is_available()) # 应返回True
如果两者均返回True
,则CUDA和cuDNN配置成功
2,数据集准备
在yolov5文件夹下的data文件夹内创建成如下结构(没有的文件夹就新建,有了的就不用管了)
data/
├── images/
│ ├── train/
│ └── val/
└── labels/├── train/└── val/
-
images/train/
和images/val/
分别存放训练和验证图像。将数据集划分为训练集和验证集,通常比例为 80:20 或 70:30。 -
labels/train/
和labels/val/
存放对应的标注文件(.txt
格式)。
使用标注工具完成标注
安装labelImg
pip install labelImg
打开标注工具
labelImg
点击 Open Dir
选择图像文件夹(如 /dataset/images/train
)
在 View
菜单中选择 Auto Save mode
和 PascalVOC
或 YOLO
格式。
使用 Create RectBox
工具绘制边界框。
输入类别名称,如 person
或 car
。
标注文件会自动保存到指定目录(如 /dataset/labels/train
)。
3,创建数据集配置文件
和上方的yaml文件一样,在yolov5/data下创建一个yaml文件(假如为custom_dataset.yaml)作为配置文件
yaml文件内输入内容与下图类似
train: /path/to/custom_dataset/images/train
val: /path/to/custom_dataset/images/valnc: <number_of_classes>
names: 0: ...1: ...2: ........
train
和 val
: 训练和验证图像的路径。
nc
: 类别数量。
names
: 类别名称列表。
4,调整超参数
是否需要调整超参数根据你的需求而定:
如果你想从头训练(不使用预训练权重,完全从随机初始化的权重开始训练模型。从头训练通常需要几万张甚至更多的图像) ,在这种情况下需要调整如hyp.scratch-low.yaml
或hyp.scratch-high.yaml(
模型需要从头学习特征,因此需要较大的学习率和较强的数据增强),超参数的设置直接影响模型的收敛速度和最终性能。
如果你想微调训练(使用预训练权重(如在COCO数据集上训练的权重)作为初始权重,然后在自定义数据集上进一步训练,通常只需几百张图片训练即可),在这种情况下调整hyp.finetune.yaml(模型已经具备一定的特征提取能力,因此不需要太大的学习率和过强的数据增强)。在新版本yolov5中可能没有hyp.finetune.yaml,微调的超参数已经被合并到hyp.scratch-low.yaml
或hyp.scratch-high.yaml
中。微调训练一般不需要调整超参数。
甚至你也可以自己常见一个超参数文件,例如下
# Hyperparameters for fine-tuning
lr0: 0.001 # 初始学习率
momentum: 0.937 # 动量
weight_decay: 0.0005 # 权重衰减
warmup_epochs: 3.0 # 学习率预热轮数
hsv_h: 0.015 # 色调增强
hsv_s: 0.7 # 饱和度增强
hsv_v: 0.4 # 亮度增强
translate: 0.1 # 平移增强
scale: 0.5 # 缩放增强
flipud: 0.0 # 上下翻转概率
fliplr: 0.5 # 左右翻转概率
mosaic: 0.0 # Mosaic数据增强概率
mixup: 0.0 # Mixup数据增强概率
5,开始训练
python train.py --img 640 --batch 16 --epochs 100 --data custom_dataset.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --name custom_yolov5s
如果需要使用你修改的超参数文件可以加上--hyp
data/hyps/hyp.scratch-low.yaml
运行训练脚本时可以调整的参数如下
-
--weights
:指定预训练权重文件。如果从头训练,设置为空(--weights ''
);如果微调,设置为预训练权重(如yolov5s.pt
)。 -
--cfg
:指定模型配置文件(如models/yolov5s.yaml
)。 -
--data
:指定数据集配置文件(如data/custom_dataset.yaml
)。 -
--hyp
:指定超参数文件(如data/hyps/hyp.scratch-low.yaml
)。 -
--epochs
:训练轮数。 -
--batch
:批量大小。根据GPU内存调整。 -
--img
:输入图像尺寸(如640
)。 -
--device
:指定训练设备(如--device 0
表示使用GPU 0)。
如何选择预训练模型?
首先要知道,训练过程需要大量的计算资源,尤其是反向传播和梯度更新(使用高性能 GPU(如 NVIDIA RTX 3060、3090 或 A100),显存越大越好。),而推理过程只需要前向传播,计算量远小于训练(可以使用较低性能的 GPU,甚至仅使用 CPU)。
如果在训练时使用 yolov5l
,那么训练出的模型权重文件(如 best.pt
)是基于 yolov5l
架构的。这个模型在推理时仍然是 yolov5l
,对硬件配置要求较高,可能不适合嵌入式设备。
如果已经在高性能设备上使用 yolov5l
训练了模型,但希望推理时使用小型模型,可以使用蒸馏的方法(将大型模型(教师模型)的知识迁移到小型模型(学生模型)的技术),基本步骤如下,这里就不做过多介绍了
-
使用
yolov5l
训练教师模型,得到yolov5l.pt
。 -
使用
yolov5s
架构初始化学生模型。 -
在训练学生模型时,使用教师模型的输出(如分类概率或特征图)作为监督信号。
-
训练完成后,得到基于
yolov5s
的学生模型权重文件(如yolov5s-distilled.pt
)。
6,实时监测
(1)关键指标
损失值(Loss)
-
训练损失(Train Loss):包括分类损失、边界框损失和目标置信度损失。
-
趋势:训练损失应逐渐下降并趋于稳定。
-
问题:
-
如果训练损失不下降,可能是学习率过低或模型架构不合适。
-
如果训练损失波动较大,可能是学习率过高或批量大小过小。
-
-
-
验证损失(Val Loss):验证集上的损失。
-
趋势:验证损失应逐渐下降并趋于稳定。
-
问题:
-
如果验证损失开始上升,可能是过拟合。
-
-
平均精度(mAP)
-
mAP@0.5:IoU阈值为0.5时的平均精度。
-
mAP@0.5:0.95:IoU阈值从0.5到0.95时的平均精度。
-
趋势:mAP应逐渐上升并趋于稳定。
-
问题:
-
如果mAP不上升,可能是模型容量不足或数据增强过强。
-
如果mAP波动较大,可能是学习率过高或数据分布不均匀。
-
-
精确率(Precision)和召回率(Recall)(验证模型时才有此指标)
-
精确率:检测结果中正确预测的比例。
-
召回率:实际目标中被正确检测的比例。
-
趋势:精确率和召回率应逐渐上升并趋于稳定。
-
问题:
-
如果精确率低但召回率高,可能是置信度阈值过低。
-
如果精确率高但召回率低,可能是置信度阈值过高。
-
-
如果验证损失或mAP在连续若干轮(如10轮)内没有提升,则可以停止训练。
如果模型在训练集上表现良好,但在验证集上表现较差,可能是过拟合,基本表现为训练损失持续下降,但验证损失开始上升,训练集mAP较高,但验证集mAP较低。
如果模型在训练集和验证集上表现均较差,可能是训练不足(欠拟合),基本表现为训练损失和验证损失均较高,mAP较低且未趋于稳定。
在训练过程中ctrl+c即可终止训练,并且YOLOv5会捕获中断信号,并尝试保存当前训练的模型权重。
YOLOv5默认会在每个训练轮次(Epoch)结束时保存模型权重:
-
last.pt
:保存当前轮次的模型权重。 -
best.pt
:保存验证集上性能最好的模型权重。
YOLOv5在训练过程中会定期在验证集上评估模型性能,并根据验证集的指标(如mAP@0.5)决定是否保存当前模型为best.pt
。 如果当前模型的验证集性能(如mAP@0.5)优于之前的最佳模型,YOLOv5会将当前模型权重保存为best.pt
。
(2)可视化监控
YOLOv5的训练脚本(train.py
)默认会在命令行中实时输出训练进度和性能指标,输出信息如下。
-
当前轮数(Epoch):例如
Epoch 10/100
。 -
损失值(Loss):包括分类损失、边界框损失和目标置信度损失。
-
学习率(LR):当前的学习率值。
-
mAP@0.5:验证集的平均精度(IoU阈值为0.5)。
-
mAP@0.5:0.95:验证集的平均精度(IoU阈值从0.5到0.95)。
我建议使用TensorBoard实时检测
在训练过程中,YOLOv5会自动将日志保存到runs/train/exp/
目录下。可以通过以下命令启动TensorBoard:tensorboard --logdir runs/train
在浏览器中打开TensorBoard的URL(通常是http://localhost:6006
),可以查看以下内容:
-
损失曲线(Loss):包括分类损失、边界框损失和目标置信度损失。
-
mAP曲线:验证集的mAP@0.5和mAP@0.5:0.95。
-
学习率曲线(LR):学习率的变化情况。
-
图像示例:训练过程中的图像增强效果。
7,验证模型
训练完成的模型默认保存在runs/train/
目录下,每次训练会生成一个新的子目录,例如runs/train/exp/
、runs/train/exp2/
等。run/文件会自动生成
python val.py --data custom_dataset.yaml --weights runs/train/custom_yolov5s/weights/best.pt --img 640
-
--data
:指定数据集配置文件。 -
--weights
:指定训练好的模型权重文件(如best.pt
)。 -
--img
:输入图像尺寸(与训练时一致)。 -
--batch
:批量大小。 -
--device
:指定设备(如0
表示GPU 0,cpu
表示CPU)。
验证完成后,脚本会输出以下指标:
-
mAP@0.5:平均精度(IoU阈值为0.5)。
-
mAP@0.5:0.95:平均精度(IoU阈值从0.5到0.95)。
-
Precision:精确率。
-
Recall:召回率。
验证结果会保存在runs/val/
目录下,例如runs/val/exp/
四,模型推理
在训练得到自己的 .pt
模型权重文件后,可以使用 YOLOv5 提供的 detect.py
脚本进行推理(目标检测)。
python detect.py --source <输入源> --weights <模型权重> --conf <置信度阈值> --img-size <图像尺寸> --device <设备>
-
--source
:指定输入源,可以是以下内容:-
图像文件:
image.jpg
-
视频文件:
video.mp4
-
文件夹:
/path/to/folder
-
摄像头:
0
(默认摄像头)或1
(第二个摄像头) -
URL:
http://example.com/image.jpg
-
-
--weights
:指定训练好的模型权重文件(如runs/train/exp/weights/best.pt
)。 -
--conf
:置信度阈值(默认0.25
),低于该阈值的检测结果会被过滤。 -
--img-size
:输入图像的尺寸(默认640
),应与训练时的尺寸一致。 -
--device
:指定推理设备(如0
表示 GPU 0,cpu
表示 CPU)。
对单张图像进行推理
python detect.py --source image.jpg --weights runs/train/exp/weights/best.pt --conf 0.25 --img-size 640 --device 0
对视频进行推理
python detect.py --source video.mp4 --weights runs/train/exp/weights/best.pt --conf 0.25 --img-size 640 --device 0
对文件夹中的所有图像进行推理
python detect.py --source /path/to/folder --weights runs/train/exp/weights/best.pt --conf 0.25 --img-size 640 --device 0
使用摄像头进行实时推理
python detect.py --source 0 --weights runs/train/exp/weights/best.pt --conf 0.25 --img-size 640 --device 0
检测结果会以边界框和类别标签的形式标注在图像或视频上,详细信息会保存为 .txt
文件:runs/detect/exp/labels/image.txt
除此之外,还有以下参数:
-
--save-txt
:保存检测结果的文本文件(边界框坐标和类别)。不加的话不会生成.txt
文件,但会保存标注后的图像。如果你在摄像头实时检测时使用--save-txt,那么会将目标检测到时的每一帧图片检测信息都给保存 -
--save-conf
:在文本文件中保存置信度。不加的话不会生成.txt
文件,但会保存标注后的图像 -
--save-crop
:保存检测到的目标裁剪图像。
python detect.py --source image.jpg --weights best.pt --save-txt --save-conf --save-crop
--workers
:数据加载的线程数(默认8
)。增加线程数可以加快数据加载速度。
python detect.py --source /path/to/folder --weights best.pt --workers 4
- 重要:
--classes
:只检测指定类别的目标。例如,只检测类别 0 和 1:
python detect.py --source image.jpg --weights best.pt --classes 0 1
-
--view-img
:实时显示检测结果(适用于图像或视频)。--nosave
:不保存检测结果(仅显示或打印)。
python detect.py --source image.jpg --weights best.pt --view-img --nosave
--save-vid
:将检测结果保存为视频文件
python detect.py --source 0 --weights best.pt --save-vid
如果你想在检测到目标后,只在前10帧保存检测信息到.txt文件,这需要修改detect.py文件
在 detect.py
中找到 for path, im, im0s, vid_cap, s in dataset:
循环,并在循环内添加以下逻辑:可以根据需要调整 max_frames_to_save
的值,以保存更多或更少的帧。
# 初始化计数器
frame_count = 0
max_frames_to_save = 10for path, im, im0s, vid_cap, s in dataset:# 推理pred = model(im)# 处理检测结果pred = non_max_suppression(pred, conf_thres, iou_thres, classes, agnostic_nms, max_det=max_det)# 如果检测到目标且未达到保存帧数上限if len(pred[0]) > 0 and frame_count < max_frames_to_save:# 保存检测结果的文本文件save_path = str(save_dir / 'labels' / Path(path).stem) + '.txt'with open(save_path, 'w') as f:for *xyxy, conf, cls in reversed(pred[0]):# 将边界框坐标转换为归一化格式 [x_center, y_center, width, height]xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / torch.tensor([im.shape[2], im.shape[1], im.shape[2], im.shape[1]]) # 归一化line = (cls, *xywh, conf) if save_conf else (cls, *xywh) # 格式: class_id x_center y_center width height [confidence]f.write(('%g ' * len(line)).rstrip() % line + '\n')# 增加帧数计数器frame_count += 1print(f'Saved frame {frame_count}/{max_frames_to_save}')# 如果达到保存帧数上限,退出循环if frame_count >= max_frames_to_save:break
如果想在主函数运行的文件中调用 detect.py
的功能,并获取检测结果(如目标类别和坐标)可以利用yolov5保存的txt文件:
YOLOv5 保存的 .txt
文件每行对应一个检测目标,格式如下:
<class_id> <x_center> <y_center> <width> <height> [<confidence>]
-
<class_id>
:目标类别 ID(从 0 开始)。 -
<x_center>
、<y_center>
、<width>
、<height>
:归一化后的边界框坐标(值在 0 到 1 之间)。 -
<confidence>
:置信度(仅在使用了--save-conf
参数时保存)。
YOLOv5 默认将检测结果保存到 runs/detect/exp/labels/
目录下,文件名为输入图像或视频帧的名称(如 image.txt
)。
使用 Python 的文件操作读取 .txt
文件,并解析每行的内容。
def parse_detection_file(file_path):detections = []with open(file_path, 'r') as f:for line in f:parts = line.strip().split()class_id = int(parts[0])x_center = float(parts[1])y_center = float(parts[2])width = float(parts[3])height = float(parts[4])confidence = float(parts[5]) if len(parts) > 5 else None # 如果保存了置信度detections.append({'class': class_id,'bbox': [x_center, y_center, width, height],'confidence': confidence})return detections
def main():# 设置检测结果文件路径file_path = 'runs/detect/exp/labels/image.txt'# 读取检测结果results = parse_detection_file(file_path)# 处理检测结果if results:print('Target detected!')for result in results:class_id = result['class']bbox = result['bbox']confidence = result['confidence']print(f'Detected: class={class_id}, confidence={confidence}, bbox={bbox}')else:print('No target detected.')if __name__ == '__main__':main()
返回的检测结果results
是一个列表,每个元素是一个字典
[{'class': 0,'bbox': [0.512, 0.634, 0.123, 0.456],'confidence': 0.89}
]
如果希望将类别 ID 转换为类别名称,可以在 main.py
中添加类别名称列表:
# 假设数据集的类别名称如下
names = ['person', 'car', 'dog', 'cat']# 处理检测结果
if results:print('Target detected!')for result in results:class_id = result['class']class_name = names[class_id] # 将类别 ID 转换为类别名称bbox = result['bbox']confidence = result['confidence']print(f'Detected: class={class_name}, confidence={confidence}, bbox={bbox}')
else:print('No target detected.')
class_name就是检测的类别名称,bbox就是坐标位置,confidence就是置信度