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

2024-05-08 11:04

本文主要是介绍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

这篇关于YOLOv8的训练、验证、预测及导出[目标检测实践篇]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/970132

相关文章

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

使用C#导出Excel数据并保存多种格式的完整示例

《使用C#导出Excel数据并保存多种格式的完整示例》在现代企业信息化管理中,Excel已经成为最常用的数据存储和分析工具,从员工信息表、销售数据报表到财务分析表,几乎所有部门都离不开Excel,本文... 目录引言1. 安装 Spire.XLS2. 创建工作簿和填充数据3. 保存为不同格式4. 效果展示5

MySQL存储过程实践(in、out、inout)

《MySQL存储过程实践(in、out、inout)》文章介绍了数据库中的存储过程,包括其定义、优缺点、性能调校与撰写,以及创建和调用方法,还详细说明了存储过程的参数类型,包括IN、OUT和INOUT... 目录简述存储过程存储过程的优缺点优点缺点存储过程的创建和调用mysql 存储过程中的关键语法案例存储

Java 的ArrayList集合底层实现与最佳实践

《Java的ArrayList集合底层实现与最佳实践》本文主要介绍了Java的ArrayList集合类的核心概念、底层实现、关键成员变量、初始化机制、容量演变、扩容机制、性能分析、核心方法源码解析、... 目录1. 核心概念与底层实现1.1 ArrayList 的本质1.1.1 底层数据结构JDK 1.7

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

springboot依靠security实现digest认证的实践

《springboot依靠security实现digest认证的实践》HTTP摘要认证通过加密参数(如nonce、response)验证身份,避免明文传输,但存在密码存储风险,相比基本认证更安全,却因... 目录概述参数Demopom.XML依赖Digest1Application.JavaMyPasswo