YOLOv8的训练、验证、预测及导出[目标检测实践篇]

         这一部分内容主要介绍如何使用YOLOv8训练自己的数据集,并进行验证、预测及导出,采用代码和指令的两种方式,参考自官方文档:Detect - Ultralytics YOLOv8 Docs。实践篇不需要关注原理,只需要把流程跑通就行,所有的疑惑会在原理篇进行解释。

1.数据准备

1.1划分训练集和验证集

        数据准备就是把标注好的数据,按照一定的比例划分成训练集和验证集,并且将训练集和验证集按照YOLO的格式来存放,方便训练的时候读取数据,如下图所示,train训练集中包含有images和labels两个文件夹,val验证集中包含有images和labels两个文件夹。

        下面是随机划分训练集和验证集的脚本代码,只需要填充好image_dir、label_dir(标注好的图片和标签路径),train_image_dir、train_label_dir、val_image_dir、val_label_dir(生成训练集、验证集的图片和标签路径),还可以自己调整train_val_split的值来调整训练集和验证集的划分比例。 

"""
随机划分训练集和验证集
"""
import os
import random
from shutil import copyfile# 输入路径
image_dir = r'G:\yolov8\data\images'       # 替换成你的图像文件夹路径
label_dir = r'G:\yolov8\data\label'       # 替换成你的标签文件夹路径# 输出路径
train_image_dir = r'G:\yolov8\ultralytics-main\ultralytics-main\my_data\detection\train\images'
train_label_dir = r'G:\yolov8\ultralytics-main\ultralytics-main\my_data\detection\train\labels'
val_image_dir = r'G:\yolov8\ultralytics-main\ultralytics-main\my_data\detection\val\images'
val_label_dir = r'G:\yolov8\ultralytics-main\ultralytics-main\my_data\detection\val\labels'# 创建输出文件夹
os.makedirs(train_image_dir, exist_ok=True)
os.makedirs(train_label_dir, exist_ok=True)
os.makedirs(val_image_dir, exist_ok=True)
os.makedirs(val_label_dir, exist_ok=True)# 划分数据集的比例
train_val_split = 0.8# 获取图像文件列表
image_files = os.listdir(image_dir)
random.shuffle(image_files)# 计算划分的索引
split_index = int(len(image_files) * train_val_split)# 划分训练集和验证集
train_image_files = image_files[:split_index]
val_image_files = image_files[split_index:]# 复制图像文件并相应地复制标签文件
def copy_images_and_labels(image_files, source_image_dir, source_label_dir, dest_image_dir, dest_label_dir):
for image_file in image_files:
# 复制图像文件
source_image_path = os.path.join(source_image_dir, image_file)
dest_image_path = os.path.join(dest_image_dir, image_file)
copyfile(source_image_path, dest_image_path)# 复制对应的标签文件
label_file = os.path.splitext(image_file)[0] + '.txt'
source_label_path = os.path.join(source_label_dir, label_file)
dest_label_path = os.path.join(dest_label_dir, label_file)
copyfile(source_label_path, dest_label_path)# 复制训练集图像和标签
copy_images_and_labels(train_image_files, image_dir, label_dir, train_image_dir, train_label_dir)# 复制验证集图像和标签
copy_images_and_labels(val_image_files, image_dir, label_dir, val_image_dir, val_label_dir)

1.2 配置data.yaml文件        

        然后再配置下数据的yaml文件就行,这个文件应该填充在ultralytics-main\ultralytics\cfg\datasets路径下,新建一个yaml文件,命名为my_detect.yaml,填充以下信息,意思就是在加载这个yaml文件的时候,能根据里面的内容找到数据的。Path即由上面代码生成的YOLO格式的路径,name为类别的下标及名称。

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: G:\yolov8\ultralytics-main\ultralytics-main\my_data\detection # dataset root dir
train: train # train images (relative to 'path') 128 images
val: val# val images (relative to 'path') 128 images
test: # test images (optional)# Classes
names:0: person1: surfboard

2.YOLOv8训练

2.1代码训练

        终于要开始训练了,加载数据有数据的yaml文件,加载模型当然也会有模型的yaml,其路径在ultralytics-main\ultralytics\cfg\models\v8\yolov8.yaml,而yolov8.yaml文件只需要修改类别数即nc的值就行,如下所示:

        接下来就可以开始训练了,YOLOv8推出了两种训练的方法,一种是使用脚本,一种是使用命令的方法:使用脚本进行训练的话比较容易Debug,下面是脚本的训练代码,需要注意四个点:第一是预训练权重要放在项目路径下,即\ultralytics-main下面,不然在训练的时候会自动下载预训练权重的,有点麻烦;第二就是在设置模型规模(n,s,m,l,x)的时候,直接通过Model_yaml参数来设置:model_yaml=r"G:\yolov8\ultralytics-main\ultralytics\cfg\models\v8\yolov8n.yaml",虽然该路径下没有yolov8n.yaml文件,但是V8可以识别出来选择的模型类型;第三就是要在if __name__==’’__main__’’:下执行;第四就是调小workers,不然可能会报错。

from ultralytics import YOLOif __name__=="__main__":# Load a modelmodel_yaml=r"G:\yolov8\ultralytics-main\ultralytics-main\ultralytics\cfg\models\v8\yolov8n.yaml"data_yaml=r"G:\yolov8\ultralytics-main\ultralytics-main\ultralytics\cfg\datasets\my_detect.yaml"pre_model=r"G:\yolov8\ultralytics-main\ultralytics-main\yolov8n.pt"model = YOLO(model_yaml,task='detect').load(pre_model)  # build from YAML and transfer weights# Train the modelresults = model.train(data=data_yaml, epochs=15, imgsz=640,batch=4,workers=2)

        下面已经开始训练了。

        此外,还有其他参数可以在\ultralytics-main\ultralytics\cfg\default.yaml进行设置,里面有很多参数可以进行调整,可以参考官方文档进行调整,Configuration - Ultralytics YOLOv8 Docs. 

2.2指令训练 

        直接在控制面板输入指令就行,填写的超参数和代码训练的一样就行。

yolo detect train 
data=G:\yolov8\ultralytics-main\ultralytics-main\ultralytics\cfg\datasets\my_detect.yaml  
model=G:\yolov8\ultralytics-main\ultralytics-main\ultralytics\cfg\models\v8\yolov8n.yaml  pretrained=G:\yolov8\ultralytics-main\ultralytics-main\yolov8n.pt 
epochs=15 
imgsz=640 
batch=4 
workers=2

2.3训练评价指标

        在runs/train下可以看到训练过程的评估指标变化,如result.png中展示了YOLOv8在训练和验证的过程中三个损失的变化,以及precision、recall、mAP50这些值的变化,由这些数据可以看到模型是逐渐收敛的。

         训练好的模型也会放在对应的weight文件夹下,会保存有最新的权重以及最好的权重。

3.YOLOv8验证

3.1代码验证

        验证其实是加载验证集,然后使用best.pt进行推理得到的各项指标数据,如下所示。

from ultralytics import YOLOif __name__=="__main__":# Load a modelpth_path=r"G:\yolov8\ultralytics-main\ultralytics-main\runs\detect\train17\weights\best.pt"model = YOLO('yolov8n.pt')  # load an official modelmodel = YOLO(pth_path)  # load a custom model# Validate the modelmetrics = model.val()  # no arguments needed, dataset and settings rememberedmetrics.box.map    # map50-95metrics.box.map50  # map50metrics.box.map75  # map75metrics.box.maps   # a list contains map50-95 of each category

        下图是输出的结果,可以看到这里加载的是train训练集(其实是因为我在配置data.yaml中填错了,这里我就不重新跑结果了),大家知道是加载验证集(在配置data.yaml中val: val中的路径文件)就行了。

3.2指令验证 

        这一块没啥好说的,直接贴指令了。

yolo detect val 
model=G:\yolov8\ultralytics-main\ultralytics-main\runs\detect\train17\weights\best.pt
data=G:\yolov8\ultralytics-main\ultralytics-main\ultralytics\cfg\datasets\my_detect.yaml

4.YOLOv8预测

4.1代码预测

        对图片进行预测并保存结果,可以先准备一张图片,或者把图片放进一个文件夹中,然后使用以下代码进行预测,可以看到预测结果保存的地址,注意这里预测的时候并不是640*640尺度进行预测,后面在预测原理章节会详细介绍:

from ultralytics import YOLOif __name__=="__main__":pth_path=r"G:\yolov8\ultralytics-main\ultralytics-main\runs\detect\train17\weights\best.pt"test_path=r"G:\yolov8\ultralytics-main\ultralytics-main\detect_test"# Load a modelmodel = YOLO('yolov8n.pt')  # load an official modelmodel = YOLO(pth_path)  # load a custom model# Predict with the modelresults = model(test_path,save=True,conf=0.5)  # predict on an image

        由预测结果可知,其实模型训练的效果还不是很好,模型还有很大的优化空间的。

 4.2指令预测

        指令如下:

yolo detect predict 
model=G:\yolov8\ultralytics-main\ultralytics-main\runs\detect\train17\weights\best.pt  source=G:\yolov8\ultralytics-main\ultralytics-main\detect_test 
save=True 
conf=0.5

5.YOLOv8导出

5.1代码导出

        注意导出onnx模型时候需要设置opset=11,不然导出模型可能会报错,或者会出现警告。此外,最好设置动态导出onnx,这样模型的输入就不会仅限制在640*640,而可以是任意batch_size还有任意尺寸的图片了,并且可以同时预测batch_size张图片。

from ultralytics import YOLOif __name__=="__main__":pth_path=r"G:\yolov8\ultralytics-main\ultralytics-main\runs\detect\train17\weights\best.pt"# Load a modelmodel = YOLO('yolov8n.pt')  # load an official modelmodel = YOLO(pth_path)  # load a custom trained model# Export the modelmodel.export(format='onnx',opset=11,dynamic=True)

         使用netron可视化onnx模型如下所示。可以和静态导出相比较,动态导出更加具有灵活性,输入的图片尺寸(height,width)或者输入图片的个数(batch)将不受限制。

动态导出onnx
静态导出onnx

 5.2指令导出

        指令如下:

yolo export 
model=G:\yolov8\ultralytics-main\ultralytics-main\runs\detect\train17\weights\best.pt  
format=onnx 
opset=11 
dynamic=True

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/7948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信号产生的五种方式

文章目录 正文前的知识准备kill 命令查看信号man手册查看信号信号的处理方法 认识信号产生的5种方式1. 工具2. 键盘3. 系统调用kill 向任意进程发送任意信号raise 给调用方发送任意信号abort 给调用方发送SIGABRT信号 4. 软件条件5. 异常 正文前的知识准备 kill 命令查看信号 …

构建 WebRTC 一对一信令服务器

构建 WebRTC 一对一信令服务器 构建 WebRTC 一对一信令服务器前言为什么选择 Nodejs?Nodejs 的基本原理浏览器使用 Nodejs安装 Nodejs 和 NPMsocket.io信令服务器搭建信令服务器客户端服务端启动服务器并测试 总结参考 构建 WebRTC 一对一信令服务器 前言 我们在学…

Jmeter页面汉化和字体显示过小调整

在频繁解压使用Jmeter的时候,经常会遇到需要将页面的英文调整为中文,页面文字和编辑区域内容文字显示较小的问题,记录一下方便以后查阅。 1.页面汉化 Jmeter在解压启动之后页面显示是英文,如果需要修改为中文,可以修改…

uniapp的app端软件更新弹框

1:使用html PLUS实现:地址HTML5 API Reference (html5plus.org),效果图 2:在app.vue的onLaunch生命周期中,代码如下: onLaunch: function() {let a 0let view new plus.nativeObj.View(maskView, {backg…

YOLOv5改进 | 主干篇 | 2024.5全新的移动端网络MobileNetV4改进YOLOv5(含MobileNetV4全部版本改进)

一、本文介绍 本文给大家带来的改进机制是MobileNetV4,其发布时间是2024.5月。MobileNetV4是一种高度优化的神经网络架构,专为移动设备设计。它最新的改动总结主要有两点,采用了通用反向瓶颈(UIB)和针对移动加速器优化…

AI烟雾监测识别摄像机:智能化安全防范的新利器

随着现代社会的不断发展,人们对于安全问题的关注日益增加,尤其是在日常生活和工作中,对火灾等意外事件的预防成为了一项重要任务。为了更好地应对火灾风险,近年来,AI烟雾监测识别摄像机应运而生,成为智能化…

【深度学习】实验1 波士顿房价预测

波士顿房价预测 代码 import numpy as np import matplotlib.pyplot as pltdef load_data():# 1.从文件导入数据datafile D:\Python\PythonProject\sklearn\housing.datadata np.fromfile(datafile, sep )# 每条数据包括14项,其中前面13项是影响因素&#xff0c…

微软正在自主构建一个名为 MAI-1 的大型语言模型(不依赖 OpenAI)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

所向披靡のmakefile

在VS里敲代码,只需要FnF5就可以直接运行勒,在Linux下敲代码却要即敲命令还要用编辑器还要用编译器,那在Linux下有没有能帮我们进行自动化组建的工具呢? 当然有,超级巨星:makefile!!…

Dropout作为贝叶斯近似: 表示深度学习中的模型不确定性

摘要 深度学习工具在应用机器学习领域受到了极大的关注。然而,这些用于回归和分类的工具并没有捕捉到模型的不确定性。相比之下,贝叶斯模型提供了一个基于数学的框架来推理模型的不确定性,但通常会带来令人望而却步的计算成本。本文提出了一…

面试中算法(删去n个数字后的最小值)

有一个整数,从该整数中去掉n个数字,要求剩下的数字形成的新整数尽可能小。 分析:使用栈的特性,在遍历原整数的数字时,让所有数字一个一个入栈,当某个数字需要被删除时,(即栈顶数字&g…

【记录】Python3| 将 PDF 转换成 HTML/XML(✅⭐PyMuPDF+tqdm)

本文将会被汇总至 【记录】Python3|2024年 PDF 转 XML 或 HTML 的第三方库的使用方式、测评过程以及对比结果(汇总),更多其他工具请访问该文章查看。 文章目录 PyMuPDF 使用体验与评估1 安装指南2 测试代码3 测试结果3.1 转 HTML …

Git与GitHub交互

注册 https://github.com/ 本地库与远程库交互方式 创建本地库并提交文件 创建远程库 在本地库创建远程库地址别名 查看现有远程库地址的别名 git remote -v 创建远程库地址别名 git remote add [别名] [远程地址] 远程路地址位置 示例 成员1推送 git push [别名] [分支…

文心一言 VS 讯飞星火 VS chatgpt (254)-- 算法导论18.2 7题

七、假设磁盘硬件允许我们任意选择磁盘页面的大小,但读取磁盘页面的时间是 abt 其中 a 和 b 为规定的常数,t 为确定磁盘页大小后的 B 树的最小度数。请描述如何选择 t 以(近似地)最小化 B 树的查找时间。对 a5ms 和 b10ms ,请给出 t 的一个最…

使用图网络和视频嵌入预测物理场

文章目录 一、说明二、为什么要预测?三、流体动力学模拟的可视化四、DeepMind神经网络建模五、图形编码六、图形处理器七、图形解码器八、具有不同弹簧常数的轨迹可视化九、预测的物理编码和推出轨迹 一、说明 这是一篇国外流体力学专家在可视化流体物理属性的设计…

阿里云CentOS 7.9 64位 Liunx 安装redis

具体的步骤如下: 添加 EPEL 仓库,因为 Redis 在标准的 CentOS 仓库中不可用: sudo yum install epel-release安装 Redis: sudo yum install redis启动 Redis 服务: sudo systemctl start redis如果你想让 Redis 在…

使用Vue3开发项目,搭建Vue cli3项目步骤

1.打开cmd ,输入 vue create neoai遇到这样的问题 则需要升级一下电脑上 Vue Cli版本哈 升级完成之后 再次输入命令,创建vue3项目 vue create neoai安装完成后,输入 npm run serve 就可以运行项目啦~ 页面运行效果

【LLM 论文】OpenAI 基于对比学习微调 LLM 得到嵌入模型

论文:Text and Code Embeddings by Contrastive Pre-Training ⭐⭐⭐⭐ OpenAI 一、论文速读 这篇论文基于大型生成式 LLM 通过对比学习来微调得到一个高质量的 text 和 code 的 embedding 模型。 训练数据的格式:是一堆 ( x i , y i ) (x_i, y_i) (x…

上传文件至linux服务器失败

目录 前言异常排查使用df -h命令查看磁盘使用情况使用du -h --max-depth1命令查找占用空间最大的文件夹 原因解决补充:删除文件后,磁盘空间无法得到释放 前言 使用XFTP工具上传文件至CentOS服务器失败 异常 排查 使用df -h命令查看磁盘使用情况 发现磁盘…

怎么ai解答问题?这三个方法都可以

怎么ai解答问题?在数字化飞速发展的今天,人工智能(AI)技术已经渗透到我们生活的方方面面,尤其是在解答问题方面,AI展现出了令人瞩目的能力。那么,哪些软件可以利用AI技术解答问题呢?…