深度学习算法-Yolo系列

作者
尚凡兴的头像尚凡兴
协作者
韩文凯的头像韩文凯董佳辉的头像董佳辉周晓龙的头像周晓龙孙江辉的头像孙江辉崔桐汇的头像崔桐汇
发布于 2024/07/19更新于 2026/08/20

该系列总体基调在于如何实现,因此数学公式能减少就尽量少的出现 (包括引用的文章)

-YOLO-Detect算法初步使用指南-

【Yolov8-v11官方指导网址】https://docs.ultralytics.com/zh

【Yolov8-v11官方工程地址】https://github.com/ultralytics/ultralytics/

一、前言

这一部分仅为初次接触YOLO系列或初次接触深度学习的同学制作

若大体流程熟悉请移步至第二部分

一般来说我们需要通过拥有好显卡的电脑训练模型文件,然后丢给低功耗的上位机去跑模型文件

前置知识学习

  • 何为深度学习

在这里不详细赘述,如若不熟悉的小伙伴可以看这篇知乎专栏,介绍的比较详细

  • 何为神经网络

同样不过多赘述,如若不熟悉的小伙伴可以移步这里

  • 何为卷积神经网络

这部分不可避免的会出现比较多的数学公式,若出现数学公式恐惧症可以大概看看原理,具体可见卷积神经网络

简介

YOLO (You Only Look Once)是一种目标检测算法,它的主要特点是将目标检测任务转化为一个回归问题。与传统的目标检测方法相比,YOLO算法具有速度快、精度高的优势,因此在实时性要求较高的场景中得到了广泛应用。

YOLO的核心思想是将整个图像划分为SxS的网格,每个网格负责预测一个目标。每个网格输出一个边界框以及对应的置信度和类别概率。YOLO通过一个卷积神经网络(CNN)直接在图像上进行单次前向传播来完成整个检测过程,从而实现了目标检测任务的端到端(End to End)处理。

二、快速上手-PC端环境配置

如果你只是想先快速体验,并且电脑配置是以下情况,可以按照视频快速完成配置:

  1. 如果你的电脑配置是:Windows系统+英伟达独显,直接参考如下视频和文档

【YOLOv8环境配置视频教程】:使用GPU进行加速推理的yolov8环境配置

https://www.bilibili.com/video/BV1fY411y7Xq?vd_source=2a70e8cbccfb71570f2b97be1853e0df

【注意】

如果在cuda、cudann、pytorch环境配置过程中存在问题或者为了保险,请一定要看文档;

  1. 如果你的电脑配置是:Windows系统,没有独立显卡,你的安装会简单很多

    • **第一步:**安装pytorch的cpu版本;

      • 登录pytorch官网https://pytorch.org/get-started/locally/,按照如图选择,并复制下面的pip终端指令到你的pycharm终端中;

image\.png

    - 如果已经安装了错误版本的 PyTorch,也可以通过以下命令卸载安装:

    `pip uninstall torch torchvision torchaudio`

- **第二步:**安装Yolov8包。

    - 在终端执行该指令`pip install ultralytics`

- **第三步(可无):**

    - 在GitHub**拉取**或者**复制粘贴**yolov8的工程到pycharm,方便学习和使用

    - 网址:https://github\.com/ultralytics/ultralytics

    ```Bash
    # Clone the ultralytics repository
    git clone https://github.com/ultralytics/ultralytics

    # Navigate to the cloned directory
    cd ultralytics

    # Install the package in editable mode for development
    pip install -e .
    ```

- **第四步:**看上面的视频36min往后的东西。

三、各种设备配置及问题解决

在开始使用YOLO进行目标检测之前,首先需要准备好相应的开发环境。

  • 训练模型电脑所需环境 (一般为自用Windows电脑,以下教程均基于Windows)

  • 高性能的CPU与GPU (推荐12代i5及以上,4060及以上)保证训练速度

安装CUDA和CUDANN

在安装cuda与cudaNN之前切记去PyTorch官网上看看支持到哪一个版本的cuda了,以免发生cuda版本太高Pytorch不兼容

在PC端配置(仅限有英伟达独显的电脑设备)

工控机配置

  • 工控机上所需环境 (一般为Linux环境,以下教程基于Jetson系列电脑)

    • Linux的各种基础源请独立配置好,具体安装教程请参考Linux教程

    接下来重要一步是看好架构是ARM64还是AMD64(x86_64)

    • 安装CUDA与cudaNN(如果还是用的Jetson系列工控机,可以略过),Linux下安装cuda与cudaNN较Windows下有所不同,具体安装教程请参考Linux教程,先安装驱动,再进行CUDA与cudaNN的安装

工控机上的其他配置

如果是jetson系列则不需要安装TensorRT,切勿手贱重复安装

四、Yolov8整体工程介绍

在上面”快速上手-PC端环境配置“部分,我们都采用pip指令终端部署了Yolov8,并且在Github上拉取ultralytics的整体工程,事实上,这两部分完成任意一种都可以实现模型的使用和训练,那么两者有什么区别:

yolo这个深度学习算法v1-v4版本都是由作者开发维护的,从v5开始原作者不再参与开发,分别由不同的公司负责开发和维护,其中到目前为止ultralytics公司负责了v8-v11的开发,从v8开始ultralytics公司在工程中集成了更加便利的用终端指令训练和使用模型的方式,比如上述视频教程中的终端指令yolo detect train data=coco8.yaml model=yolov8n.yaml epochs=100 imgsz=640就可以用来训练一个目标检测模型。

  • 如果你想使用**”便利的终端指令来训练使用模型“或者”使用代码训练使用模型“**就需要使用pip终端部署yolov8的方式;

  • 如果你想能够修改工程源码,就需要到Github拉取ultralytics整体工程,并且仅可以使用代码的方式训练和使用模型;

两种方式其实都将ultralytics整个工程加载到了你的电脑中,到目前为止yolo已经更新到v11版本,所以当你配置好后,你实际上可以训练v8-v11各版本的模型,下面我根据Github上的ultralytics工程详细讲讲。

  • Github_ultralytics工程

image\.png

image\.png

  • ultralytics/ultralytics/cfg

image\.png

image\.png

image\.png

image\.png

⭐**yolov8\.yaml文件,用于目标检测的模型配置文件:**

在模型训练时要用到,这里配置文件包含了五个模型,按照模型从轻量化到重量化(模型深度和宽度不断增加的顺序)排列:

- yolov8n\~yolov8x模型   (参数量增加);

- 我们最常用的为n模型和s模型;

- 如果你要训练一个n模型,则需要将s、m、l、x所在行注释掉;

- nc为类别数,最大为80,也就是说yolov8模型最多能检测80个种类的目标,训练自己的模型时,有几个种类对应将nc的值做更改。

image\.png

⭐**default\.yaml文件,终端指令参数默认值文件:**

在使用Yolov8的终端指令训练推理模型时,全部可写入的参数都在这个文件中,这些参数一般都有默认值,有一些我们经常修改的:

- **mode:** train  *\(str\) 模式,例如训练、验证、预测、导出、跟踪*

- **model:**  *\(str, 可选\) 模型文件路径,例如 yolov8n\.pt, yolov8n\.yaml*

- **data:**  *\(str, 可选\) 数据文件路径,例如 coco128\.yaml*

- **epochs:** 100  *\(int\) 训练轮次数*

- **time:**  *\(float, 可选\) 训练时间,如果提供,将覆盖epochs*

- **patience: **100  *\(int\) 早停等待轮次,对于没有可观察改进的训练早期停止*

- **batch:** 16  *\(int\) 每批次的图像数量(\-1表示自动批次)*

- **imgsz: **640  *\(int \| list\) 训练和验证模式的输入图像大小为int,或预测和导出模式的list\[w,h\]*

- **save:** True  *\(bool\) 保存训练检查点和预测结果*

- **val:** True  *\(bool\) 在训练期间进行验证/测试*

- **source: ** *\(str, 可选\) 图像或视频的源目录*

- **format:** torchscript  *\# \(str\) 导出的格式*

- **show:** False  *\(bool\) 如果环境允许,显示预测的图像和视频*

- **tracker: **botsort\.yaml  *\(str\) 跟踪器类型,选项=\[botsort\.yaml, bytetrack\.yaml\]*

五、训练自己的Detect模型

自定义数据集制作

数据集格式

image\.png

Image\_1734194717193\.jpg

a937e4efafe497620ee4274a67e6e4ad\.jpeg

如图为我们常见的两种Yolo的数据集格式,我们一般习惯于使用格式一;

一个标准的dataset/(数据集文件夹)下一般有train/(训练集)、valid/(验证集)、test/(测试集)三个文件夹,这三个文件夹下又分别包含images/(图像文件夹)、labels/(标签文件夹),和一个yolov8.yaml文件;

**labels/ :**存放和images/文件夹中图片命名相同的.txt文件,这些文件中被写入对应图片中需要被识别目标的位置信息;

**data.yaml:**按照yolo规定的格式要求书写了该数据集的相关信息;

image\.png

labels/:valid/:test/ 文件中存放的图片量约等于 7:2:1


**获取图像 **

如果你想做一个识别特定物品的模型(鼠标、手机),那么你需要获取大量这两种物品的图像,图像要尽可能比例协调、清晰,格式尽可能一样(png、jpg);

在数据量上,对于一个相对简单的物品来说,每个需要识别的种类图片量应保持在几百到几千左右,图片量和质量将直接影响到模型识别的准确性**;**

在一张图像中可以同时存在你想识别的多种类物品(比如同时存在鼠标和手机);

你的数据可以来源于网络下载,也可以自行拍摄。

对图像进行批量命名:将所有图像先放到一个文件夹里,通过以下python脚本将所有图像命名为:

00000000.jpg

00000001.jpg

00000002.jpg

.....

00001000.jpg

这样的格式,然后按照 7:2:1的比例把图像放到各个文件夹中的images/文件夹中。

*'''*
*Author: Fanxing Shang *
*Date: 2023-1-14*
*//////////////////// __2号脚本__  ->  'test01.py'//////////////////////*
*        重命名格式 00000000.jpg*
*                 00000001.jpg*
*                 00000002.jpg*
*                 ... ...*
*        如果不喜欢这个格式,可以在此脚本基础上改写*
*'''*
import os

folder_path = r'.\\dataset\\test\\labels'   # 写入存放图片的文件夹地址
num =1000                                   # 需要重命名的图片数量

if __name__ == '__main__':
    files = os.listdir(folder_path)
    files.sort()  # 对文件列表进行排序
    for file in files:
        s = '%08d' % num  # 前面补零占位
        os.rename(os.path.join(folder_path, file), os.path.join(folder_path, str(s) + '.txt'))
        num += 1

为图像打标签

  1. 下载打标签工具,我们常用的工具为Labelimg,下载方式终端输入指令:

    # 下载 labelimg, 下载时尽量挂梯子
    pip install labelimg
    
    # 打开 Labelimg
    labelimg

    【Lebalimg教程】

    https://blog.csdn.net/2402_83140078/article/details/138021307

  2. 选择Yolo格式,选择你存放图片的文件夹(一般为images/文件夹),设置好你保存标签的文件夹(一般为labels/文件夹),开始标注:

image\.png

- 这里给大家一个数据集标注规范,是针对ROBOCON2023的:

[https://blog.csdn.net/DaveBraid/article/details/131350009]()

- 标注完成后,打开labels/文件夹,可以看到里面都是txt文件;

- 记得把train/、valid/、test/文件夹中的图片都完成标注。

*脚本库

通过上面这三步,即可完成一份自定义的数据集的制作

在制作数据集的时候可能会存在一些问题,在这里我会对应给出一些其他的python脚本,帮助快速解决这些问题:

test01.py:可以将一个文件夹中所有不同格式的图像都转化成jpg格式,用于在网上下载图片制作数据集时使用;

test02.py:将一个文件夹中所有图片按照指定顺序格式命名;

test03.py:用于多人协同标注时发生标注标号不同或错误的情况;

test04.py:随机打乱文件夹中图像的顺序,保证不同种类目标图像在数据集中的均匀分布;

voc_yolo.py:将voc格式的.xml数据集转换陈yolo格式的.txt数据集,防止在使用lebelimg时忘记更改格式为yolo格式

test01.py

test02.py

test03.py

test04.py

voc_yolo.py

模型选择与配置

对于目标检测模型来说,我们选择的模型一般就是yolov8n或者yolov8s两个模型:

  • n模型是yolov8的轻量化模型,参数量比较少,在训练时所用的时间少,推理视频流时运行流畅,但准确率相对比较低;

  • s模型相较于n模型来说模型深度相同,宽度要大,参数量是n模型的四倍左右,相同数据集和epochs下,精度一般比n模型要高,但是训练时间比较长,推理视频流时相对受限一点。

    对于目标检测模型来说yolov8还有m、l、x模型,这些模型深度更高,参数量更大,相对来说不适合用于机器人的嵌入式设备,在一些配置较低的PC设备上也难以进行视频流推理。


    对于Yolov8来说,这几种模型的配置文件都被集成在一个yolov8.yaml的文件中,文件位置在ultralytics/ultralytics/cfg/v8/目录下:

image\.png

- 如果你要训练一个n模型,则需要将s、m、l、x所在行注释掉;

- nc为类别数,最大为80,也就是说yolov8模型最多能检测80个种类的目标,训练自己的模型时,有几个种类对应将nc的值做更改。

模型的训练

训练模型

  1. 经过上述两步,我们将获得这样的一个数据集datasets文件夹,我们将这个文件夹放到你配置好Yolov8环境的python工程中

image\.png

  1. 在你的工程中,你可以采用终端指令的方式用你的数据集训练模型,也可以用python代码的方式来训练**【python代码】**

    from ultralytics import YOLO
    
    # 构建一个全新的 YOLO 模型
    model = YOLO(".\datasets\yolov8.yaml")  # 使用配置文件定义的模型结构
    # 训练模型
    results = model.train(data=".\datasets\data.yaml", epochs=100, imgsz=640)
    # 这里设置训练 100 轮,图像的输入尺寸为640*640,如果有需要你可以加其他参数

    【终端指令】

    yolo detect train data=".\datasets\data.yaml" model=".\datasets\yolov8.yaml" epochs=100 imgsz=640

image\.png

  1. 在 YOLOv8 的训练过程中,训练结果会存储在 runs/detect/train 目录下,其中包含多个文件和子文件夹。这些文件记录了训练的过程和结果,便于后续的评估和分析。

image\.png

其中weights文件夹中有一个**best\.pt**和一个**last\.pt**,分别代表训练过程中**最好的一轮权重**和**最后一轮的权重**(也就是模型文件),我们用best\.pt来进行目标检测。

继续训练&&恢复训练

继续训练

一般在训练模型的时候通常会设置一个参数**epoch用来设置模型训练的最大轮数**,有时候训练过程中可能没有训练到指定轮数,模型就停止并完成训练,一般原因是模型训练的一个参数**patience,该参数默认值为100,其作用是在验证指标没有改善的情况下,提前停止训练。当性能趋于平稳时停止训练,有助于防止过拟合;**有时我们在训练模型的时候也可能会训练完所有的epoch轮数,然后模型及相关评价参数被保存;

但是无论哪种情况都可能出现模型训练结果不符合你的预期要求的可能性,因此我们可能会想要:

  • 接着上次的训练结果,接着训练;

  • 在不改变类别的情况下,修改丰富数据集,并接着上次结果,接着训练;

总的来说就是将之前训练的终点,作为下次训练的起点。那么Yolo是支持这种训练方式的,具体实现方式如下:

【python代码】

from ultralytics import YOLO

# 加载模型(下面两行是一样的功能,任选一行)
model = YOLO("./runs/detect/trainX/weight/best.pt")  # 加载之前训练过的模型
model = YOLO("yolov8.yaml").load("./runs/detect/trainX/weight/best.pt")  # 加载yolov8.yaml,将之前训练过的模型的参数导入yolov8.yaml

# 训练模型
results = model.train(data="data.yaml", epochs=100, imgsz=640)

【终端指令】

yolo detect train model=runs/detect/trainX/weight/best.pt data=data.yaml epoch=100 imgsz=640

这样训练的好处:

加载上次训练出的模型接着进行训练,那么不用从头开始训练,将大大节省训练时间,并且训练精度及各种参数的起点也是在上次训练好的模型的基础上提升。

恢复训练

在使用深度学习模型时,从先前保存的状态恢复训练是一项至关重要的功能。这在各种情况下都能派上用场,比如当训练过程意外中断时,或者当你希望用新数据或更多的历时继续训练模型时。

恢复训练时,YOLO 会加载上次保存模型的权重,并恢复优化器状态、学习率调度器和历时编号。这样就可以从上次中断的地方无缝地继续训练过程。

YOLO 可以通过设置 resume 参数 True 在调用 train 方法的路径,并指定 .pt 文件,其中包含经过部分训练的模型权重。

【python代码】

from ultralytics import YOLO

# 加载模型
model = YOLO("path/to/last.pt")  # 训练终端的模型

# 恢复训练
results = model.train(resume=True)

【终端指令】

yolo train resume model=path/to/last.pt

默认情况下,检查点会在每个epoch结束时保存,或者使用 save_period 参数,因此必须至少完成 1 个epoch才能恢复训练运行。

评估与优化

在这部分官方文档中有简要的评估模型性能的文档:

https://docs.ultralytics.com/zh/guides/yolo-performance-metrics/

这里我写了一篇文档对每一个评价指标做一个相对详细的解释,便于理解:

Detect模型性能评价-基于Yolo

模型推理

在你的工程中,你可以采用终端指令的方式用模型推理图片、视频流等,也可以用python代码的方式来推理:

【python代码】推理单张图片

from ultralytics import YOLO

# 加载你训练好的模型
model = YOLO(".runs/detect/trianX/weight/best.pt")

# 推理 'xxx.jpg' 这张图片,将结果保存到当前目录下,图像输入尺寸640*640,置信度设置为0.5
model.predict("xxx.jpg", save=True, imgsz=640, conf=0.5) # 此外,你还可以设置很多参数

【终端指令】推理单张图片

yolo detect predict model=run/detect/trainX/weight/best.pt data=xxx.jpg imgsz=640 conf=0.5

【python代码】推理视频流

from ultralytics import YOLO

# Load a pretrained best.pt model
model = YOLO("run/detect/trainX/weight/best.pt")

# Run inference on the source
results = model(source=0, stream=True)  # generator of Results objects

【终端指令】推理视频流

# 可以推理视频文件,如mp4、avi、gif等多种格式
# 可以直接调用摄像头,使用摄像头编号,0号一般是设备默认相机,如果外接摄像头,则序号依次递加
yolo detect predict model=runs/detect/trainX/weights/best.pt show=True source=0
yolo detect predict model=runs/detect/trainX/weights/best.pt show=True source=xxx.mp4