文章目录
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 | 指定导出模型的批量推理大小或在预测模式下导出模型将同时处理的最大图像数量 |
完结!!!
标签:img,训练,onnx,模型,分类,YOLOv8,文件夹,model,识别 From: https://blog.csdn.net/hello000w/article/details/141298033