当前位置: 首页 > news >正文

Yolo系列 —— 使用自制数据集训练yolo模型

在这里插入图片描述

文章目录

  • 一、环境准备
  • 二、训练与验证
    • 1. 创建 conda 环境
    • 2. 训练与测试
    • 3. 训练效果
  • 三、测试训练模型
  • 四、模型转换及查看
    • 1. 模型转换
    • 2. 模型查看

Ultralytics 基于多年计算机视觉和人工智能领域的基础研究,创建了尖端、最先进的(SOTA) YOLO 模型。模型不断更新,以提高性能和灵活性,使其快速、准确且易于使用。模型在目标检测、跟踪、实例分割、图像分类和姿态估计任务中表现出色。本文记录基于自己的数据集 使用yolov11 训练自己的yolo模型的学习过程,如有错误还请指正。

Yolo系列 —— Ubuntu 安装和使用标注工具 labelImg
Yolo系列 —— 使用自制数据集训练yolo模型

一、环境准备

本次使用自制的数据集 通过yolo实现 robocup 足球场的定位点识别(课程链接),文件目录准备如下:

.
├── predict_data
│   ├── vedio
│   │   └── person perspective.mp4
├── predict.py
├── README.md
├── results
├── runs
├── train.py
├── yolo11n.pt
├── yolo11.yaml
├── yolo_dataset
│   ├── train
│   │   ├── images
│   │   ├── labels
│   │   └── labels.cache
│   └── val
│       ├── images
│       ├── labels
│       └── labels.cache
└── yolov11_goalpost_ball.yaml

文件目录说明:

  • predict_data :验证视频,用于验证yolo视频物体识别效果;
  • predict.py :测试脚本,用于验证yolo视频物体识别效果;
  • results :测试结果保存目录;
  • runs :训练过程的过程权重文件、
  • train.py :训练脚本;
  • yolo11n.pt :yolo模型文件,有n(nano)、s(small)、m(medium)、x(extra-large)多个版本,模型官网下载;
  • yolo11.yaml :创建 conda虚拟环境 yaml文件;
  • yolo_dataset :训练集、测试集;
  • yolov11_goalpost_ball.yaml :yolo配置

二、训练与验证

1. 创建 conda 环境

创建conda环境相关操作,参考此链接

# 方式一:已有 yolo11.yaml
conda env create -f yolo11.yaml # 方式二: 确保安装了必要的依赖
pip install ultralytics
pip install torch torchvision  # 根据你的CUDA版本选择合适版本

2. 训练与测试

在这里插入图片描述

当图片使用labelImg 标注完后如上图作为数据集,触发 train.py 训练脚本 进行自定义数据集训练, train.py 脚本 内容如下:

from ultralytics import YOLO
import yaml
import os# 创建数据集配置文件时使用绝对路径
dataset_config = {'path': os.path.abspath('./yolo_dataset'),                  # 相对路径 转 绝对路径'train': 'train/images',                                    # 相对于 path 的 训练集的图像目录路径'val': 'val/images',                                        # 相对于 path 的 验证集的图像目录路径'names': {0: 'Ball', 1: 'Post', 2: "L", 3: "T", 4: "X"}     # 数据集的类别名称字典
}config_path = './yolov11_goalpost_ball.yaml'
with open(config_path, 'w') as f:yaml.dump(dataset_config, f)# 初始化模型(选择不同规模的模型)
model = YOLO('yolo11n.pt')  # 官方预训练模型
# 可选模型:yolov11n/s/m/l/x.pt (从轻量到大型)# 训练参数配置
train_params = {'data': config_path,            # 指定之前创建的数据集配置文件路径'epochs': 1050,                 # 整个训练数据集将被遍历的次数'batch': 16,                    # 批大小(Batch Size),即每次梯度更新使用的图像数量'imgsz': 320 * 2,               # 输入图像的尺寸(宽度和高度,单位像素)。图像在训练前会被缩放到此尺寸'device': '0',                  # GPU设备ID,CPU使用'cpu', 多卡可用 '0,1,2''workers': 8,                   # 用于数据加载的子进程数'optimizer': 'auto',            # 可选 SGD/Adam/AdamW等'project': './runs/train',      # 训练结果保存目录'name': 'football_detection',   # 本次实验的名称'exist_ok': True,               # 允许覆盖已有训练结果 (False 时,会自动创建新文件夹)'augment': True,                # 启用数据增强 (通过随机缩放、裁剪、翻转、调整色调等操作来增加数据的多样性,是防止过拟合、提升模型泛化能力的关键手段)'lr0': 0.005,                   # 初始学习率  'lrf': 0.2,                     # 最终学习率 = lr0 * lrf'save_period': 10,              # 每10个epoch保存一次模型'amp': True,                    # 启用自动混合精度训练 'patience': 100                 # 如果连续 100 个 epoch 验证指标(如 mAP)没有提升,则提前终止训练
} # 开始训练
results = model.train(**train_params)# 验证最佳模型
best_model = YOLO(os.path.join(train_params['project'], train_params['name'], 'weights/best.pt'))   # 加载训练过程中在验证集上表现最好的模型权重
metrics = best_model.val(data = config_path, # 使用同样的数据集配置batch = 32,         # 验证时的批大小。通常可以比训练时设得大一些,因为验证不需要计算梯度,显存占用更小conf = 0.001,       # 验证置信度阈值, 仅考虑置信度高于此值的预测框。(0.001阈值很低,目的是评估模型输出的所有可能的目标,避免因阈值过高而漏掉一些真实预测,从而得到最全面的评估结果)iou = 0.6,          # NMS(非极大值抑制) IoU阈值。 用于合并重叠的预测框IoU高于此值的两个框会被认为是预测的同一个物体,只保留置信度最高的那个。exist_ok = True     # 允许覆盖已有训练结果 (False 时,会自动创建新文件夹)
)

模型选择:

  • yolo11n.pt: nano,轻量级模型,速度快;
  • yolo11s.pt: small,小型模型,平衡速度和精度;
  • yolo11m.pt: medium,中型模型;
  • yolo11l.pt: large,大型模型;
  • yolo11x.pt: extra-large,超大型模型,精度最高;

yolov11_goalpost_ball.yaml 内容主要包含:标签类型说明、数据基础路径和基于数据基础路径的训练集和测试集路径,具体内容如下:

names:0: Ball1: Post2: L3: T4: X
path: $(env HOME)/project/code_learn/train_yolo11/yolo_dataset
train: train/images
val: val/images

当前模型支持5个类别

  • 0: Ball (球)
  • 1: Post (门柱)
  • 2: L (L形标记)
  • 3: T (T形标记)
  • 4: X (X形标记)

在conda虚拟环境执行如下命令进行训练

python3 train.py 

在这里插入图片描述

下面是训练过程一次 epoch日志打印:

Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
1/1050      2.41G      2.286       4.72      1.464        159        640: 100%|██████████| 7/7 [00:01<00:00,  6.95it/s]Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100%|██████████| 1/1 [00:00<00:00, >11.41it/s]all         25        206   0.000256     0.0516   0.000253   6.73e-05

其具体参数分析下

训练阶段参数

  • Epoch:当前训练轮次/总训练轮次
  • GPU_mem:当前GPU内存使用量
  • Loss Functions:损失函数,损失值越小越好,表示模型预测越准确;
    • box_loss:边界框回归损失,衡量预测框与真实框之间的差异
    • cls_loss:分类损失,衡量类别预测的准确性
    • dfl_loss:分布焦点损失,YOLOv8中引入的改进损失函数
  • Instances:实例数量,当前批次中检测到的目标实例数量,159 表示当前批次中有159个目标对象;
  • Size:图像尺寸,YOLO 通常使用固定的输入尺寸进行训练;

验证/评估阶段参数

  • Class:评估的类别,all 表示所有类别的综合评估结果;
  • Images:用于评估的图像数量,25 表示使用了25张图像进行评估;
  • Instances:实例数量,验证集中所有目标实例的总数,205 表示当前批次中有205个目标对象;
  • 评估指标
    • Box(P) :精确率/准确率 (Precision),预测为正样本中真正为正样本的比例( TP / (TP + FP) ),值越高表示误检越少,理想值为1;
    • Box(R):召回率 (Recall),真正为正样本中被正确预测为正样本的比例( TP / (TP + FN) ),值越高表示漏检越少,理想值为1;
    • mAP50 :平均精度 (mean Average Precision at IoU=0.5),在IoU阈值为0.5时的平均精度,综合衡量检测性能的主要指标,值越高越好;
    • mAP50-95 : 平均精度 (mean Average Precision at IoU=0.5:0.95),在IoU阈值从0.5到0.95(步长0.05)的平均精度,更严格的评估指标,考虑了不同IoU阈值下的性能;

3. 训练效果

训练结束后会在runs 路径下生成两个文件夹 traindetect ,下面是 train 文件夹下的训练过程数据:

在这里插入图片描述

F1_curve 在这里插入图片描述P_curve在这里插入图片描述
R_curve在这里插入图片描述PR_curve在这里插入图片描述

三、测试训练模型

测试脚本 predict.py 内容如下:注意修改 source='./predict_data/vedio 为自己的视频路径。

from ultralytics import YOLOmodel = YOLO("./runs/train/football_detection/weights/best.pt")# 预测并保存结果
results = model.predict(source='./predict_data/vedio',conf=0.25,           # 设置对象置信度阈值,高于阈值的检测框才会保留和输出,默认通常为0.25:cite[2]:cite[4]save=True,           # 保存带标注的预测图片save_txt=True,       # 保存检测框的 txt 文件(YOLO 格式)save_conf=True,      # 保存置信度到 txt 文件save_crop=False,     # 保存裁剪的检测目标(可选)project='./results', # 指定保存路径(默认是 runs/detect)exist_ok=True        # 允许覆盖已有结果
)

上述脚本执行完后,会在 results 路径下生成 predict 保存测试视频的识别结果,效果如下所示:

请添加图片描述

四、模型转换及查看

1. 模型转换

现在有了 训练自己数据集的模型 best.pt 格式模型,接下来将其进行转换成其他格式模型文件,如 onnx

# 默认安装依赖库
pip install onnx onnxslim onnxruntime# 要求版本安装依赖库
pip install "onnx>=1.12.0,<1.18.0" onnxslim onnxruntime

参考 官网 创建 pt2onnx.py 文件,内容如下:

from ultralytics import YOLO# Load a model
model = YOLO("yolo11n.pt")  # load an official model
# model = YOLO("path/to/best.pt")  # load a custom trained model
model = YOLO("./runs/train/football_detection/weights/best.pt")  # load a custom trained model# Export the model
model.export(format="onnx")

导出参数说明

参数类型默认值描述
formatstr'torchscript'导出模型的目标格式,例如 'onnx', 'torchscript', 'engine' (TensorRT)等。每种格式都支持与不同的 部署环境.
imgszinttuple640模型输入所需的图像大小。可以是正方形图像的整数(例如, 640 对于 640x640)或元组 (height, width) 用于指定特定维度。
kerasboolFalse启用导出为 Keras 格式,用于 TensorFlow SavedModel,提供与 TensorFlow serving 和 API 的兼容性。
optimizeboolFalse导出到 TorchScript 时,应用针对移动设备的优化,可能会减小模型大小并提高 推理 性能。与 NCNN 格式或 CUDA 设备不兼容。
halfboolFalse启用 FP16(半精度)量化,从而减小模型大小并可能加快受支持硬件上的推理速度。与 ONNX 的 INT8 量化或仅 CPU 导出不兼容。 int8 bool False 激活 INT8 量化,进一步压缩模型并加速推理,同时最大限度地减少精度损失,主要用于边缘设备。与 TensorRT 结合使用时,执行训练后量化 (PTQ)。
dynamicboolFalse允许 ONNX、TensorRT 和 OpenVINO 导出使用动态输入大小,从而提高处理不同图像尺寸的灵活性。自动设置为 True 当将TensorRT与INT8一起使用时。
simplifyboolTrue使用以下方式简化 ONNX 导出的模型图 onnxslim,从而可能提高性能以及与推理引擎的兼容性。
opsetintNone指定 ONNX opset 版本,以与不同的 ONNX 解析器和运行时兼容。如果未设置,则使用最新支持的版本。
workspacefloatNoneNone设置最大工作区大小,单位为GiB,用于 TensorRT 优化,平衡内存使用和性能。使用 None 用于 TensorRT 自动分配,最高可达设备最大值。
nmsboolFalse如果支持,则将非极大值抑制 (NMS) 添加到导出的模型(请参阅导出格式),从而提高检测后处理效率。不适用于 end2end 模型。
batchint1指定导出模型批量推理大小,或导出模型将并发处理的最大图像数量,单位为。 predict 模式。对于 Edge TPU 导出,此项会自动设置为 1。
devicestrNone指定导出设备:GPU (device=0),CPU(device=cpu),适用于 Apple 芯片的 MPS(device=mps)或适用于 NVIDIA Jetson 的 DLA(device=dla:0device=dla:1)。TensorRT 导出自动使用 GPU。
datastr'coco8.yaml'路径指向 数据集 配置文件(默认: coco8.yaml),这对于 INT8 量化校准至关重要。如果启用 INT8 但未指定,则将分配默认数据集。
fractionfloat1.0指定用于 INT8 量化校准的数据集比例。允许在完整数据集的子集上进行校准,这对于实验或资源有限时非常有用。如果未在使用 INT8 启用时指定,则将使用完整数据集。




导出格式:

格式format 参数模型元数据参数
PyTorch-yolo11n.pt-
TorchScripttorchscriptyolo11n.torchscriptimgsz, half, dynamic, optimize, nms, batch, device
ONNXonnxyolo11n.onnximgsz, half, dynamic, simplify, opset, nms, batch, device
OpenVINOopenvinoyolo11n_openvino_model/imgsz, half, dynamic, int8, nms, batch, data, fraction, device
TensorRTengineyolo11n.engineimgsz, half, dynamic, simplify, workspace, int8, nms, batch, data, fraction, device
CoreMLcoremlyolo11n.mlpackageimgsz, half, int8, nms, batch, device
TF SavedModelsaved_modelyolo11n_saved_model/imgsz, keras, int8, nms, batch, device
TF GraphDefpbyolo11n.pbimgsz, batch, device
TF Litetfliteyolo11n.tfliteimgsz, half, int8, nms, batch, data, fraction, device
TF Edge TPUedgetpuyolo11n_edgetpu.tfliteimgsz, device
TF.jstfjsyolo11n_web_model/imgsz, half, int8, nms, batch, device
PaddlePaddlepaddleyolo11n_paddle_model/imgsz, batch, device
MNNmnnyolo11n.mnnimgsz, batch, int8, half, device
NCNNncnnyolo11n_ncnn_model/imgsz, half, batch, device
IMX500imxyolo11n_imx_model/imgsz, int8, data, fraction, device
RKNNrknnyolo11n_rknn_model/imgsz, batch, name, device

执行如下命令即可在待转换的 .pt模型文件同目录下获得 .onnx 文件。

python3 pt2onnx.py

2. 模型查看

安装 Netron 软件:Netron-xx.AppImage 、icon ,具体图形化打开软件配置方法 参看 LabelImg 的安装及配置 。

sudo mkdir /usr/local/Netron
sudo cp netron_icon.png /usr/share/icons/
sudo cp Netron-8.5.2.AppImage /usr/local/Netron/sudo chmod +x /usr/local/Netron/Netron-8.5.2.AppImage
sudo vim /usr/share/applications/Netron.desktop

Netron.desktop 文件 内容如下:

[Desktop Entry]
Name=Netron
Comment=Netron
Exec=/usr/local/Netron/Netron-8.5.2.AppImage
Icon=/usr/share/icons/netron_icon.png
Type=Application
StartupNotify=true
Categories=Application;

然后就可以打开 Netron软件,愉快的玩耍了~
在这里插入图片描述

http://www.dtcms.com/a/354228.html

相关文章:

  • 2021/07 JLPT听力原文 问题一 1番
  • MQTT broker 安装与基础配置实战指南(一)
  • Java:IO流——增强篇
  • anaconda本身有一个python环境(base),想用别的环境就是用anaconda命令行往anaconda里创建虚拟环境
  • 英伟达 spectrum xgs 以太网 的含义和解释
  • 互联网大厂AI面试:从大模型原理到场景应用的深度解析
  • WPF 程序用户权限模块利用MarkupExtension实现控制控件显示
  • 嵌入式分层架构下的AT指令模块设计与实现
  • 使用Nginx搭建图片传输服务:配置与优化指南
  • Content-Type是application/x-www-form-urlencoded表示从前端到后端提交的是表单的形式
  • 微服务的编程测评系统17-判题功能-代码沙箱
  • 除自身以外数组的乘积是什么意思
  • 算法刷题常见错误
  • Linux 打包及压缩基础知识总结
  • 车间生产管理遇到的问题及改善方案有哪些?
  • 在 Windows 上部署 Go 语言开发环境
  • Go语言与Docker 开发的核心应用领域
  • 源码分析unexpected EOF on client connection with an open transaction
  • 分治法——二分答案
  • 深入探索Vue:前端开发的强大框架
  • Android10 音频系统之AudioPlaybackConfiguration
  • JVM之CMS、G1|ZGC详解以及选型对比
  • SynClub-百度在海外推出的AI社交产品
  • A-Level物理课程全解析:知识点、学习计划与培训机构推荐
  • 网络编程-连接、发送、接收数据学习
  • React Hooks 完全指南:从基础到高级的实战技巧
  • C++ 由 std::thread 初始化想到的
  • TencentOS Server 4.4 下创建mysql容器无法正常运行的问题
  • wireshark解析FLV插件分享
  • 嵌入式Linux(Exynos 4412)笔记