在linux系统上使用yolov8模型

前言

大家好,本周的知识分享内容是使用yolov8来训练自己的数据集,最后将训练好的模型投入使用。

深度学习模型

深度学习模型是机器学习的一个子集,其核心是构建由多个“层”组成的人工神经网络,通过层次化特征学习,从大规模数据中自动提取从低级到高级的抽象表示。

分类:

  • 计算机视觉:yolo,自研模型

  • 自然语言处理:deepseek,GPT,gemini,transformer,自研模型

  • 多模态处理:GPT,自研模型

计算机视觉

计算机视觉是人工智能的一个核心研究领域,旨在赋予计算机“看”和理解图像或视频内容的能力,其目标是从视觉数据中自动提取、分析、理解有用信息,并做出决策或表达。

yolo介绍

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型。YOLO 于 2015 年推出,因其高速和高精度而广受欢迎。

  • 目标检测是一项涉及识别图像或视频流中目标的位置和类别的任务。

    • 目标检测器的输出是一组边界框,这些边界框包围了图像中的目标,以及每个框的类别标签和置信度分数。当您需要在场景中识别感兴趣的目标,但不需要确切知道目标在哪里或其确切形状时,目标检测是一个不错的选择。
  • 实例分割比对象检测更进一步,包括识别图像中的各个对象并将它们与图像的其余部分分割开来。

    • 实例分割模型的输出是一组掩码或轮廓,它们勾勒出图像中每个对象,以及每个对象的类别标签和置信度分数。 当您不仅需要知道对象在图像中的位置,还需要知道它们的精确形状时,实例分割非常有用。
  • 图像分类是三个任务中最简单的,它涉及将整个图像分类到一组预定义的类别中。

    • 图像分类器的输出是单个类别标签和一个置信度分数。当您只需要知道图像属于哪个类别,而不需要知道该类别的对象位于何处或其确切形状时,图像分类非常有用。

前置知识

虚拟环境:是将项目需要用到的依赖放到一个统一的环境内,防止不同项目之间,需要的依赖不同而发生冲突,很有助于项目管理,yolo的官方文档中提到了很多虚拟环境工具,如conda,pythonVenv等,此处我使用的是conda,他的操作更简单,并且自动安装了CUDA。

yaml文件:在yolov8训练过程中需要配置的文件。

置信度:是目标检测模型中,表示预测结果可信程度的一个概率值,范围在 [0, 1] 之间。数值越高,表示模型对自己预测的结果越确信。

数据集:是机器学习和人工智能领域中,用于训练、验证和测试模型的结构化数据集合。它是深度学习模型的“教材”——模型通过学习数据集中的样本与标签之间的映射关系,来获得解决特定任务的能力。

训练集:
训练集是用于训练模型的数据集合,模型通过学习训练集中的图像和对应的标注信息,来调整自身的参数(权重和偏置),从而掌握识别目标的能力。

验证集:
验证集是用于评估模型训练效果和调优参数的数据集合,模型在训练过程中定期在验证集上进行测试,但不参与参数更新。

测试集:
测试集是用于最终评估模型泛化能力的数据集合,只在模型训练完成后使用一次,用于报告模型的真实性能。

标签:
class_id 类别编号(从0开始)
x_center 框中心点x坐标(归一化)
y_center 框中心点y坐标(归一化)
width 框宽度(归一化)
height 框高度(归一化)

过拟合:是指模型在训练集上表现非常好(损失很低、准确率很高),但在验证集或测试集上表现很差的现象。简单来说:模型死记硬背了训练数据,但没有学到通用规律,导致对新数据泛化能力差。

张量即多维数组。在计算机视觉相关的模型中,一张图片可以被转换为张量,作为参数被模型使用。

张量的存储可以在cpu上,gpu上,对于gpu上的张量可以使用CUDA进行加速。

在yolo模型中,张量作为参数,yolo模型作为函数,接受参数对其进行训练。

损失:是一个标量张量,表示模型预测结果与真实标签之间的差距。损失越小,模型预测越准。

损失函数:用来检测损失的程度。

梯度:是一个张量,表示了每个参数应该往哪个方向调整,才能让损失变小。

前向传播:输入数据逐层计算得到预测结果和损失值的过程。

反向传播:从损失函数出发,利用链式法则反向计算每一层参数梯度的过程。

梯度下降:参数沿着梯度的反方向进行迭代更新以最小化损失函数的优化算法。

优化器:基于梯度下降原理,决定参数更新策略的算法实现。

必要的工具

  • vscode:支持加入很多插件,自由度更高,更灵活。

  • pip:是Python的官方包管理工具。

  • pytorch:深度学习框架,是yolov8的核心依赖。

  • conda:一个开源的包管理系统和环境管理系统。能创建隔离的虚拟环境,避免不同项目之间的依赖冲突。

  • CUDA:调用N卡的GPU对模型进行训练。

我自己的电脑配置

  • cpu:AMD Ryzen 7 5800H with Radeon Graphics 8核 16线程

  • 显卡:NVIDIA GeForce RTX 3060

  • 内存:16GB

  • OS:ubuntu 25.04

环境安装

虚拟环境配置

  1. 安装conda
1
2
3
4
5
6
7
8
9
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh

bash ~/miniconda.sh -b -p $HOME/miniconda3

~/miniconda3/bin/conda init fish

exec fish

conda --version
  1. 配置pip
1
2
3
sudo apt install pip

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
  1. 创建并激活虚拟环境

第一次创建环境会比较慢,这里在conda的配置文件中加入清华源,移除较慢的源,再进行创建。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 配置国内源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --set show_channel_urls yes

# 移除速度较慢的源
conda config --remove channels defaults

# 接受 Anaconda 官方仓库(repo.anaconda.com)的服务条款
conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main
conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r

# 创建虚拟环境
conda create -n yolo python=3.10 -y

# 激活虚拟环境
conda activate yolo
  1. 安装pytorch

由于在训练模型时需要用到CUDA,所以需要查询自己n卡的cuda的最高支持版本,使用下面命令查询cuda版本nvidia-smi

1
pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116
  1. 下载ultralytics(yolov8)

这里直接克隆官方的源码,并且使用pip,以可修改源码的形式安装。

使用可修改源码的形式安装,有助于我们定制个人化的yolov8模型,更有助于对yolov8源码的学习。

1
2
3
4
5
git clone git@github.com:ultralytics/ultralytics.git

cd ultralytics

pip install -e .

模型预测

在ultralytics目录下,直接运行以下命令。

1
yolo predict model=yolov8n.pt source='ultralytics/assets/bus.jpg'

数据处理

数据的选择

  1. 数据要有真实应用场景,最好不要摆拍。
  2. 选择的图片要尽可能复杂多样,有白天拍摄也有夜晚拍摄,覆盖多种情况。
  3. 样本尽可能多些。
  4. 要和目标检测的对象相关。

数据集获取与标注

数据集的获取有如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
import cv2

video = cv2.VideoCapture("./puerzi.mp4")
num = 0
save_step = 30

while True:
ret, frame = video.read()
if not ret:
break
num += 1
if num % save_step == 0:
cv2.imwrite("./demo_images/" + str(num) + ".jpg", frame)

对于数据集的标注,市面上有很多种工具和网站,https://www.makesense.ai是一个在线的标注工具,提高了标注效率。并且支持大批量文件导入,压缩包文件导出。

数据训练

文件结构方面

结构如图:

1
2
3
4
5
6
7
8
9
10
11
ultralytics/                # ultralytics 根目录
├── datasets/ # 数据集根目录
│ └── your_dataset/ # 你的数据集名称(如:coco_custom、helmet_detection)
│ ├── images/ # 图片文件夹
│ │ ├── train/ # 训练集图片
│ │ └── val/ # 验证集图片
│ └── labels/ # 标签文件夹(txt格式)
│ ├── train/ # 训练集标签
│ └── val/ # 验证集标签
├── ultralytics/ # 源码目录
└── ...

代码方面

在ultralytics的根目录下创建yaml文件和py文件,yaml文件用来确定待训练数据的位置,和训练对象。py文件用来执行YOLOV8的训练。

在py文件中,可以自行配置各种训练参数,如:

  • workers: 是用于并行加载数据的进程数量。当训练模型时,CPU需要不断读取图像、解码、进行数据增强等预处理操作,然后将处理好的数据传递给GPU进行训练。在win系统下,此处需要设置为0,linux系统下设置为1~8(默认为8)即可。

  • epochs: 训练轮数。

epoch 1-50: 快速下降阶段,模型快速学习基本特征
epoch 50-150: 缓慢下降阶段,模型优化细节
epoch 150-300: 收敛阶段,loss基本不再下降
epoch >300: 过拟合风险增加

  • batch: 是模型每次迭代训练时处理的图像数量。例如batch=16意味着每次同时处理16张图像,计算梯度,然后更新一次模型参数。

查看训练结果

在runs/detect目录下,存放着YOLOV8对图片的训练结果以及训练的可视化过程。

在weights目录下,存放着best.pt和last.pt文件,一个是训练出来最好的模型,另一个供下一次训练时继续使用。

1
yolo detect predict model=runs/detect/()/weights/best.pt  source=() show=True

总结

本次知识分享,主要内容包括认识了深度学习模型的种类,计算机视觉概要,初识yolo。学习了如何使用yolov8模型,从环境安装,模型部署,模型预测,数据集收集与标注,模型训练的一系列过程。