首页 > 其他分享 >YOLOv8单目标检测

YOLOv8单目标检测

时间:2024-08-18 14:57:53浏览次数:13  
标签:__ img 训练 检测 模型 目标 onnx model YOLOv8

文章目录

用于个人记录,好记性不如烂笔头

其实整体训练的流程和V5差不多,只是V8不需要下载工程文件了,而是可以通过安装ultralytics,然后进行调用

pip install ultralytics

1.数据集

​ 数据集的制作方式和V5完全一致,唯一的区别是我们需要自己创建一个yaml的配置文件,该文件是为了让V8读取到数据。而这个yaml的格式是跟V5的类似的。

v5的操作链接如下,里面包含了数据集制作方式,和xml转txt的详细说明,可以参考一下:
YOLOv5单目标识别

本次我要识别的是一个数字“8”,图片和层级目录如下:
在这里插入图片描述
在这里插入图片描述

下面的图片是V5版本的数据的配置

在这里插入图片描述

而V8的yaml的配置如下

在这里插入图片描述

train: [F:\yolodata\8\train.txt]
val: [F:\yolodata\8\val.txt]


# number of classes
nc: 1

# class names
names: ['eight']

2.模型训练

准备好数据集以及配置文件后,就可以开启模型训练了。因为不需要下载工程文件了,所以我们创建一个v8_train.py文件,然后将要配置的参数写上即可

注意:需要自己去官方去下载预训练的模型,这里我用的yolo8s.pt

from ultralytics import YOLO


if __name__ == '__main__':
    model=YOLO(r"F:\yolodata\8\yolov8s.pt")
    model.train(
        data=r"F:\yolodata\8\eight.yaml",
        imgsz=320,
        device=0,
        epochs=10,
        name="eight8",
        batch=64,
        fliplr=0,#图像左右翻转(概率)
    )

当执行上面的代码后,当运行结束后,提示运行结果保存的位置在:Results saved to runs\detect\eight83。我这里运行的结果是保存在v8_train.py的同一个文件夹中的.

运行结果图片
在这里插入图片描述

这里我是把数据集,配置文件,训练的py,预训练的模型都放在一个文件夹,所以看起来有点乱,其实可以分成两个文件夹,数据集放到另一个文件夹。训练好的模型就在runs文件夹中
在这里插入图片描述

3.转onnx并推理

(1)输出结果解释
from ultralytics import YOLO


if __name__ == '__main__':
    model_path=r"F:\yolodata\8\runs\detect\eight83\weights\best.pt"
    model=YOLO(model_path)
    model.export(format='onnx',imgsz=320)# 自己模型的配置,我的图片大小是320的,官方的是640
    

​ 可以看到转成onnx后,onnx文件存放的位置也是在weights文件夹中,我们将onnx模型打开,他的输出是tensor: float32[1,5,2100],这里需要解释一下为什么他的输出会是这样的。我们对比一下官方的预训练模型

我们自己的模型如下
在这里插入图片描述

官方的模型如下

官服的输出是float32[1,84,8400]

from ultralytics import YOLO

if __name__ == '__main__':
    model_path=r"F:\yolodata\8\yolov8s.pt"
    model=YOLO(model_path)
    model.export(format='onnx',imgsz=640)#官方的数据集是640

在这里插入图片描述

解释如下:

​ 我们知道YOLO是有三个不同尺度的检测头(anchor),分别是80x80,40x40,20x20,这个三个size是怎么计算出来的呢,是因为yolo使用三个尺寸的下采样比例分别是8,16,32,官方使用640大小的图片,所以640分别除以8,16,32得到的就是80 40 20。

​ 由于特征图中的每个网格产生一个预测结果,(80x80+40x40+20x20)所以是8400个预测结果。官方使用的640x640的图片,而我们的图片大小是320x320,hw都分别都缩小了2倍,自然计算出来的结果就会少了2x2=4倍。8400/4=2100

与v5的不同,v5是每个网格会产生3个预测结果,计算出来是25200。

输出解释

tensor: float32[1,5,2100],代表什么呢?

1表示batch_size

5分别表示xywh和类别的得分,这里只有一个类,所以只有一个得分(官方的有80类所以是84)

2100表示检测框的数量

​ 如果我们把[1,5,2100]展开则是这样的:

​ ([[[x,x1,x2,x3…x2100],

​ [y,y1,y2,y3…y2100],

​ [w,w1,w2,w3…w2100],

​ [h,h1,h2,h3…h2100],

​ [s,s1,s2,s3…s2100]

​ ]]])

​ 所以我们只需要根据最后一行,将分数最大的那一列xywh拿出来即可

(2)推理

​ 从onnx中我们知道它的输入要求shape为(1, 3, 320, 320) float32类型,并且yolo在对图片处理中还进行了归一化处理,所以我们推理的时候也要对输入的图片做相应的处理

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



img_path=r"F:\yolodata\8\Frames\155.png"
onn_path=r"F:\yolodata\8\runs\detect\eight83\weights\best.onnx"
provider=ort.get_available_providers()[1 if ort.get_device() == 'GPU' else 0]

ort_session=ort.InferenceSession(
                                onn_path,
                                providers=[provider])
# 图片处理
img=cv2.imread(img_path)
img_dst=img[np.newaxis,:,:,:].astype(np.float32)
img_dst=img_dst.transpose(0,3,1,2)/255.0
# print(img.shape,img.dtype) # (1, 3, 320, 320)  float32

# 推理
resluts=ort_session.run(output_names=["output0"],
                        input_feed={"images":img_dst})

# print(resluts[0].shape) # (1, 5, 2100)
best_index=resluts[0][:,-1,:].argmax() # 1750


position=resluts[0][:,:,best_index]
cx,cy,ww,hh,ss=position[0][0],position[0][1],position[0][2],position[0][3],position[0][4]
new_img=cv2.imread(img_path)
cv2.putText(new_img,str(round(ss,3)),(int(cx-ww/2),int(cy-hh/2)-5),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,255),2)
cv2.rectangle(new_img,(int(cx-ww/2),int(cy-hh/2)),(int(cx+ww/2),int(cy+hh/2)),(0,0,255),2)

# 显示两张图片
combined_img=np.hstack((img,new_img))
cv2.imshow("combined_img",combined_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码执行后图片显示效果如下
在这里插入图片描述

4.YOLOv8参数说明

model.train()参数说明**

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

参数 (Key)默认值 (Value)描述 (Description)
model如果预训练就指向预训练模型模型文件路径,例如 yolov8n.pt, yolov8n.yaml
data执行数据集地址数据文件路径,例如 coco128.yaml
epochs100训练的周期数
timeNone训练的小时数,如果提供了此参数将覆盖周期数
patience50早停训练等待的最大无改善周期数
batch16每批次的图像数量(-1 表示自动批次)
imgsz640输入图像的尺寸
saveTRUE是否保存训练检查点和预测结果
save_period-1每 x 个周期保存一次检查点(如果小于 1 则禁用)
cacheFALSE是否使用数据加载的缓存,可选 True/ram, disk 或 False
deviceNone运行设备,例如 cuda device=0 或 device=0,1,2,3 或 device=cpu
workers8数据加载的工作线程数(如果使用DDP则每个RANK)
projectNone项目名称
nameNone实验名称
exist_okFALSE是否覆盖已存在的实验
pretrainedTRUE是否使用预训练模型(布尔值)或从其中加载权重的模型(字符串)
optimizer‘auto’使用的优化器,选项包括 [SGD, Adam, Adamax, AdamW, NAdam, RAdam, RMSProp, auto]
verboseFALSE是否打印详细输出
seed0随机种子,用于可重复性
deterministicTRUE是否启用确定性模式
single_clsFALSE将多类别数据作为单一类别训练
rectFALSE矩形训练,每批次根据最小填充整理
cos_lrFALSE使用余弦学习率调度器
close_mosaic10在最后几个周期禁用马赛克增强(0 为禁用)
resumeFALSE从最后一个检查点恢复训练
ampTRUE自动混合精度(AMP)训练
fraction1训练集中用于训练的数据集比例(默认为 1.0,即全部图像)
profileFALSE在训练期间用于日志记录器的 ONNX 和 TensorRT 速度分析
freezeNone在训练期间冻结前 n 层,或冻结层索引列表
lr00.01初始学习率(例如 SGD=1E-2, Adam=1E-3)
lrf0.01最终学习率(初始学习率 * 最终学习率)
momentum0.937SGD 动量/Adam beta1
weight_decay0.0005优化器权重衰减 5e-4
warmup_epochs3热身周期数(小数也可)
warmup_momentum0.8热身期间的初始动量
warmup_bias_lr0.1热身期间的初始偏置学习率
box7.5边界框损失增益
cls0.5类别损失增益(根据像素缩放)
dfl1.5DFL 损失增益
pose12姿态损失增益(仅姿态)
kobj2关键点对象损失增益(仅姿态)
label_smoothing0标签平滑(小数表示比例)
nbs64标称批次大小
overlap_maskTRUE训练期间遮罩是否重叠(仅限分割训练)
mask_ratio4遮罩下采样比率(仅限分割训练)
dropout0是否使用 dropout 正则化(仅限分类训练)
valTRUE训练期间是否进行验证/测试
plotsFALSE训练/验证期间是否保存图表和图像

model.export()参数说明

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

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

完结!!!

在这里插入图片描述

标签:__,img,训练,检测,模型,目标,onnx,model,YOLOv8
From: https://blog.csdn.net/hello000w/article/details/141297584

相关文章

  • 【Android驱动12】Modem编译和sim卡配置检测过程
    一,Modem编译1.1查看ReleseNote发现需要查看"Build_Configure_Modem_MOLY"这张表,解压MT67xx_(xxx)_MOLY.LR9.W1444.MD.LWTG.MP.Vx.tar.gz到某文件,并在make目录下查看支持的配置信息1.2执行的命令,开始编译modem,则是./make.sh"SM67xx(Lxx_xxx).mak"new1.3执行perl......
  • 频率检测计
    前言        频率计是一种用于测量信号频率的仪器。它可以准确地确定电子信号的频率,广泛应用于电子设备的测试和维护中。频率计的工作原理通常包括对输入信号进行采样,并通过内部电路计算信号的周期,从而得到频率值。现代频率计通常具有高精度、高稳定性,并且能够测量从......
  • UOJ #889. 【UNR #8】二维抄袭检测
    题面传送门首先你需要会\(n=2\)时候的贪心,这个比较简单,直接能走就走就行了。然后\(n=3\)的时候就不能能走就走了,可能在中间就拐到第三行了。但是容易发现的是我们只会在最后一个能走到第三行的位置走到第三行。我们需要找到这个位置。一个比较重要的观察是,如果其后面匹配长......
  • MATLAB基于深度学习的车辆检测系统
      如今机器视觉领域深度学习算法已经大行其道,也让人工智能的实现不再那么遥不可及,但是在目标检测领域,让计算机超越人类还需让更多的人参与进来继续努力。如今众多的高校,甚至中小学已经将人工智能纳入了学习科目,这确实能让人感受到AI的魅力以及社会对其重视程度。印象中玩深......
  • 2024-08-17:用go语言,给定一个从0开始的整数数组nums和一个整数k, 每次操作可以删除数组
    2024-08-17:用go语言,给定一个从0开始的整数数组nums和一个整数k,每次操作可以删除数组中的最小元素。你的目标是通过这些操作,使得数组中的所有元素都大于或等于k。请计算出实现这个目标所需的最少操作次数。输入:nums=[2,11,10,1,3],k=10。输出:3。解释:第一次操作后,nums变......
  • yolo入门 yolov8下载安装--2024.8
    默认已安装Anaconda(一个类似于环境管理器的软件,前面出过anaconda安装教程)1.创建激活环境打开AnacondaPrompt,创建yolov8环境condacreate-nyolov8python=3.8激活环境activateyolov82.下载yolov8安装包 下载链接:https://github.com/ultralytics/ultralytics同时可......
  • 爆改YOLOv8 | yolov8添加GAM注意力机制
    1,本文介绍GAM(GlobalAttentionMechanism)旨在改进传统注意力机制的不足,特别是在通道和空间维度上的信息保留问题。它通过顺序的通道-空间注意力机制来解决这些问题。以下是GAM的关键设计和实现细节:通道注意力子模块:3D排列:使用3D排列来在三个维度上保留信息,这种方法有助于捕......
  • 爆改YOLOv8 || 利用Gold-YOLO提高YOLOv8对小目标检测精度
    1,本文介绍Gold-YOLO通过一种创新的 聚合-分发(Gather-and-Distribute,GD)机制 来提高信息融合效率。这一机制利用卷积和自注意力操作来处理来自网络不同层的信息。通过这种方式,Gold-YOLO能够更有效地融合多尺度特征,实现低延迟和高准确性之间的理想平衡.关于GOLD-YOLO的详细......
  • LLVM - 编译器后端-目标描述
    一:概述        LLVM具有非常灵活的架构。我们可以向其添加新的目标后端。后端的核心是目标描述。在本篇文章中,我们将学习如何在LLVM中添加一个CPU后端。        在本章中,我们将涵盖以下内容:        •为新的后端搭建环境,学习M88kCPU架构,并介绍从......
  • 基于yolov10的目标检测模型概述
    目录1.引言2.Yolov10的改进点3.Yolov10性能分析3.Yolov10程序4.Yolov10的应用5.总结1.引言    目标检测是计算机视觉领域的一个重要任务,其目的是识别图像中的物体并给出它们的位置。近年来,基于深度学习的方法已经在这一领域取得了显著的进步,其中尤以YOLO系列......