1.数据集处理

​ v8的数据处理方式和v5是一样的,不需要打标签,只需要将数据整理好后放在各个文件夹中,文件夹的名称就是它的标签名,这个可以通过onnx可以看到。

训练后转成onnx如下

这个onnx是我之前训练好的模型并转成了onnx

在这里插入图片描述

数据整理如下

每个文件夹里面存放的都是320x320的图片,这里我做了9个分类,每个类别存放在不同的文件夹中

在这里插入图片描述

2.模型训练

​ 整理好数据集后,就可以开启训练了,跟V5一样,只是V8可以不用下载工程文件,安装ultralytics这个包后调用,并调整参数即可,参数说明放在第4点的参数说明那里

注意:记得下载预训练的模型,不然运行代码的时候它再自动下载的话会比较慢

from ultralytics import YOLO

if __name__ == '__main__':
    model_path = r"E:\yolodata\yolov8s-cls.pt"
    model=YOLO(model_path)
    model.train(
        # 数据文件路径,例如 coco128.yaml,分类任务直接写数据集文件夹路径即可
        data=r"E:\yolodata\numbers",
        imgsz=320, # 图像大小
        device=0, # 运行设备
        batch=32, # 每批次的图像数量 (-1 表示自动批次)
        epochs=10) # 训练的周期数

​ 当执行成功以上代码后,会在该代码文件的同一文件夹下生成一个runs文件夹,最里面的weight文件夹会存放我们训练好的pt模型。训练完后会提示我们所保存的位置,到时候记得看打印台即可.

在这里插入图片描述

​ 我们打开训练代码的文件夹,会发现多了一个runs文件,预训练的模型是我自己提前下载好的,numbers是我们的数据集,v_8train.py是我训练代码的文件

在这里插入图片描述

​ 打开runs文件夹里面的train文件,里面存放我们训练的结果已经存放模型的weight文件夹

在这里插入图片描述

​ 我们可以随便打开一个验证的图片看看,虽然只训练了10轮,可以看到效果还行,没有很差。

在这里插入图片描述

3.模型推理

​ 有了pt模型后,我们就可以转成onnx方便后续部署

from ultralytics import YOLO

if __name__ == '__main__':
    model_path = r"E:\yolodata\runs\classify\train\weights\best.pt"
    model=YOLO(model_path)
    model.export(format="onnx",imgsz=320)

​ 从onnx我们知道它的输入是tensor: float32[1,3,320,320],输出是tensor: float32[1,9],剩下我们只需要导入onnx模型,然后将图片进行处理成它输入要的shape,并进行归一化处理即可

在这里插入图片描述

​ 通过上面的onnx图片,我们知道names部分包含标签的名字以及它的索引(下标),在代码中我的图片是一张3的图片,它对应的标签名是**“3_three”,所以可以通过上面的onnx知道它的索引是2**,所以只要代码中输出是2则表示推理成功。

import cv2
import os
import onnxruntime as ort
import numpy as np



onnx_path=r"E:\yolodata\runs\classify\train\weights\best.onnx"
provider = ort.get_available_providers()[1 if ort.get_device()=="GPU" else 0]

ort_session=ort.InferenceSession(onnx_path, providers=[provider])

img_path=r"E:\yolodata\numbers\val\3_three\26.png"
img_src=cv2.imread(img_path)
img_dst=img_src[np.newaxis, :,:,:]/255.
img_dst=np.transpose(img_dst, (0,3,1,2)).astype(np.float32)
# print(img_dst.shape,img_dst.dtype) # (1, 3, 320, 320) float32


output=ort_session.run(output_names=['output0'], input_feed={'images':img_dst})

best_index=np.argmax(output[0],axis=1)

print(best_index) # 输出[2] 推理成功

4.一些问题

(1)V8它是怎么知道我们训练了多少类

那是因为它的数据加载中用了torchvision.datasets.ImageFolder,

会自动根据子目录名作为类别标签,并将每个子目录下的图像作为该类别的样本。
# 同时,它还会返回一个映射关系,表示类别标签到实际类别的字典,可以通过class_to_idx属性访问

在代码中的这个位置

在这里插入图片描述

5.参数说明

model.train()参数说明

参考链接:https://blog.csdn.net/qq_42452134/article/details/135168930

参数 (Key) 默认值 (Value) 描述 (Description)
model 如果预训练就指向预训练模型 模型文件路径,例如 yolov8n.pt, yolov8n.yaml
data 执行数据集地址 数据文件路径,例如 coco128.yaml
epochs 100 训练的周期数
time None 训练的小时数,如果提供了此参数将覆盖周期数
patience 50 早停训练等待的最大无改善周期数
batch 16 每批次的图像数量(-1 表示自动批次)
imgsz 640 输入图像的尺寸
save TRUE 是否保存训练检查点和预测结果
save_period -1 每 x 个周期保存一次检查点(如果小于 1 则禁用)
cache FALSE 是否使用数据加载的缓存,可选 True/ram, disk 或 False
device None 运行设备,例如 cuda device=0 或 device=0,1,2,3 或 device=cpu
workers 8 数据加载的工作线程数(如果使用DDP则每个RANK)
project None 项目名称
name None 实验名称
exist_ok FALSE 是否覆盖已存在的实验
pretrained TRUE 是否使用预训练模型(布尔值)或从其中加载权重的模型(字符串)
optimizer ‘auto’ 使用的优化器,选项包括 [SGD, Adam, Adamax, AdamW, NAdam, RAdam, RMSProp, auto]
verbose FALSE 是否打印详细输出
seed 0 随机种子,用于可重复性
deterministic TRUE 是否启用确定性模式
single_cls FALSE 将多类别数据作为单一类别训练
rect FALSE 矩形训练,每批次根据最小填充整理
cos_lr FALSE 使用余弦学习率调度器
close_mosaic 10 在最后几个周期禁用马赛克增强(0 为禁用)
resume FALSE 从最后一个检查点恢复训练
amp TRUE 自动混合精度(AMP)训练
fraction 1 训练集中用于训练的数据集比例(默认为 1.0,即全部图像)
profile FALSE 在训练期间用于日志记录器的 ONNX 和 TensorRT 速度分析
freeze None 在训练期间冻结前 n 层,或冻结层索引列表
lr0 0.01 初始学习率(例如 SGD=1E-2, Adam=1E-3)
lrf 0.01 最终学习率(初始学习率 * 最终学习率)
momentum 0.937 SGD 动量/Adam beta1
weight_decay 0.0005 优化器权重衰减 5e-4
warmup_epochs 3 热身周期数(小数也可)
warmup_momentum 0.8 热身期间的初始动量
warmup_bias_lr 0.1 热身期间的初始偏置学习率
box 7.5 边界框损失增益
cls 0.5 类别损失增益(根据像素缩放)
dfl 1.5 DFL 损失增益
pose 12 姿态损失增益(仅姿态)
kobj 2 关键点对象损失增益(仅姿态)
label_smoothing 0 标签平滑(小数表示比例)
nbs 64 标称批次大小
overlap_mask TRUE 训练期间遮罩是否重叠(仅限分割训练)
mask_ratio 4 遮罩下采样比率(仅限分割训练)
dropout 0 是否使用 dropout 正则化(仅限分类训练)
val TRUE 训练期间是否进行验证/测试
plots FALSE 训练/验证期间是否保存图表和图像

model.export()参数说明

参考链接:https://blog.csdn.net/qq_42761751/article/details/140825169

Argument Type Default Description
format str ‘torchscript’ 导出模型的目标格式,例如 ‘onnx’、‘torchscript’、‘tensorflow’ 或其他格式,用于定义与各种部署环境的兼容性
imgsz int or tuple 640 模型输入的期望图像大小。可以是整数,或者用于特定尺寸的元组(高度,宽度)
keras bool FALSE 启用导出为Keras格式的TensorFlow SavedModel,提供与TensorFlow服务和API的兼容性
optimize bool FALSE 在导出到TorchScript时应用移动设备优化,可能会减少模型大小并提高性能
half bool FALSE 启用FP16(半精度)量化,减少模型大小,并可能在支持的硬件上加速推理
int8 bool FALSE 启用INT8量化,进一步压缩模型并加速推理,精度损失最小,主要适用于边缘设备
dynamic bool FALSE 允许 ONNX 和 TensorRT 导出支持动态输入尺寸,提高处理不同图像尺寸的灵活性
simplify bool FALSE 通过 onnxslim 简化 ONNX 导出的模型图,可能提高性能和兼容性
opset int None 指定 ONNX opset 版本,以确保与不同的 ONNX 解析器和运行时兼容。如果未设置,将使用最新支持的版本
workspace float 4 设置 TensorRT 优化的最大工作空间大小(以 GiB 为单位),以平衡内存使用和性能
nms bool FALSE 为 CoreML 导出添加非极大值抑制(NMS),这是准确和高效检测后处理的关键
batch int 1 指定导出模型的批量推理大小或在预测模式下导出模型将同时处理的最大图像数量

完结!!!

在这里插入图片描述

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐