在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
环境安装
虚拟环境配置
- 安装conda
1 | wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh |
- 配置pip
1 | sudo apt install pip |
- 创建并激活虚拟环境
第一次创建环境会比较慢,这里在conda的配置文件中加入清华源,移除较慢的源,再进行创建。
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 |
- 下载ultralytics(yolov8)
这里直接克隆官方的源码,并且使用pip,以可修改源码的形式安装。
使用可修改源码的形式安装,有助于我们定制个人化的yolov8模型,更有助于对yolov8源码的学习。
1 | git clone git@github.com:ultralytics/ultralytics.git |
模型预测
在ultralytics目录下,直接运行以下命令。
1 | yolo predict model=yolov8n.pt source='ultralytics/assets/bus.jpg' |
数据处理
数据的选择
- 数据要有真实应用场景,最好不要摆拍。
- 选择的图片要尽可能复杂多样,有白天拍摄也有夜晚拍摄,覆盖多种情况。
- 样本尽可能多些。
- 要和目标检测的对象相关。
数据集获取与标注
数据集的获取有如下代码:
1 | import cv2 |
对于数据集的标注,市面上有很多种工具和网站,https://www.makesense.ai是一个在线的标注工具,提高了标注效率。并且支持大批量文件导入,压缩包文件导出。
数据训练
文件结构方面
结构如图:
1 | ultralytics/ # 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模型,从环境安装,模型部署,模型预测,数据集收集与标注,模型训练的一系列过程。