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)将不受限制。


5.2指令导出
指令如下:
yolo export
model=G:\yolov8\ultralytics-main\ultralytics-main\runs\detect\train17\weights\best.pt
format=onnx
opset=11
dynamic=True
相关文章:

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

光伏远动通讯屏的组成
光伏远动通讯屏的组成 远动通讯屏主要用于电力系统数据采集与转发,远动通讯屏能够采集站内的各种数据,如模拟量、开关量和数字量等,并通过远动通讯规约将必要的数据上传至集控站或调度系统。这包括但不限于主变和输电线路的功率、电流、电压等…...

营销H5测试综述
H5页面是营销域最常见的一种运营形式,业务通过H5来提供服务,可以满足用户对于便捷、高效和低成本的需求。H5页面是业务直面用户的端点,其质量保证工作显得尤为重要。各业务的功能实现具有通用性,相应也有共性的测试方法࿰…...

【C++随记4】C++二进制位操作运算符
在C中,二进制位操作运算符允许你直接对整数类型的变量的位进行操作。这些运算符包括: 按位与(Bitwise AND): & 按位或(Bitwise OR): | 按位异或(Bitwise XOR): ^ 按位取反&…...

风电厂数字孪生3D数据可视化交互展示构筑智慧化电厂管理体系
随着智慧电厂成为未来电力企业发展的必然趋势,深圳华锐视点紧跟时代步伐,引领技术革新,推出了能源3D可视化智慧管理系统。该系统以企业现有的数字化、信息化建设为基础,融合云平台、大数据、物联网、移动互联、机器人、VR虚拟现实…...

大模型市场爆发式增长,但生成式AI成功的关键是什么?
进入2024年,大模型市场正在爆发式增长。根据相关媒体的总结,2024年1-4 月被统计到的大模型相关中标金额已经达到2023年全部中标项目披露金额的77%左右;其中,从项目数量来看,应用类占63%、算力类占21%、大模型类占13%、…...

leetcode LCR088.使用最小花费爬楼梯
思路:DP 这道题相对来说比较基础,但是有时候容易出错的一点就是在dp递推的时候,由于我们的思路是从最后一步向着初始状态推的,所以在编写程序的时候也容易就直接推着走了。其实实际上我们倒着想只是为了推理,真正要递…...

【DevOps】怎么提升Elasticsearch 的搜索性能
一、怎么提升Elasticsearch 搜索性能 提升 Elasticsearch (ES) 的搜索性能可以从多个角度进行优化,包括硬件选择、配置调整、查询优化等。以下是一些具体的方法和建议: 1. 硬件优化 使用 SSDs: 使用固态硬盘(SSD)而…...

启动任何类型操作系统:不需要检索 ISO 文件 | 开源日报 No.243
netbootxyz/netboot.xyz Stars: 7.7k License: Apache-2.0 netboot.xyz 是一个方便的平台,可以不需要检索 ISO 文件就能启动任何类型操作系统或实用工具磁盘。它使用 iPXE 提供用户友好的 BIOS 菜单,让您轻松选择所需的操作系统以及特定版本或可引导标志…...

Linux——综合实验
要求 按照上面的架构部署一个简单的web节点所有的服务器使用DNS服务器作为自己的DNS服务器 就是/etc/reslov.conf 中nameserver的值必须是途中dns服务器的地址所有的数据库都是用mysql应用 nfs共享导出在客户端(web服务器上)使用autofs在自动挂载,或者写入/etc/fsta…...

oracle数据库用户名修改
在Oracle数据库中,修改用户名通常涉及一系列步骤。以下是修改Oracle数据库用户名的详细步骤: 修改前准备工作: 使用ssh工具以root身份连接服务器。 切换到oracle用户:su - oracle(回车) 使用sqlplus连接数…...

2024年开抖音小店需要多少钱?你真的知道吗?最新入驻条件及费用
大家好,我是电商花花。 现在仍然有很多想开抖店,想做抖音小店,但是很多人都不知道投资一家抖音小店需要多少钱,今天花花就给大家讲一下做一家抖音小店需要投入多少资金,以及具体投入到哪些方面。 我们就说一下个体店…...

Vue创建todolist
电子书 第三章: https://www.dedao.cn/ebook/reader?idV5R16yPmaYOMqGRAv82jkX4KDe175w7xRQ0rbx6pNgznl9VZPLJQyEBodb89mqoO 没有使用VUE CLI创建项目。 创建步骤: 1, 用Vite 创建项目 2, npm run dev 运行程序 参照之前的文…...

了解Ansible Playbook
在现代IT运维中,自动化部署成为了提高效率、降低错误率的重要手段之一。而Ansible作为一种强大的自动化工具,其Playbook机制为自动化部署提供了灵活、可扩展的解决方案。本文将深入介绍Ansible Playbook的概念、结构、语法和常见用法,帮助读者…...

nginx 负载均衡、反向代理实验
nginx 负载均衡、反向代理实验 实验目的 理解概念:明确反向代理和负载均衡的基本概念及其在网络架构中的作用。 掌握技能:学习如何配置Nginx以实现反向代理和负载均衡功能。 实践应用:通过实际操作,体验Nginx如何提升Web服务的可…...

Linux信号捕捉
要处理信号, 我们进程就得知道自己是否收到了信号, 收到了哪些信号, 所以进程需要再合适的时候去查一查自己的pending位图 block 位图 和 hander表, 什么时候进行检测呢? 当我们的进程从内核态返回到用户态的时候&…...

【Leetcode】 top100 round2 需要加强版
知识补充 python赋值的执行顺序: 在41中,对于测试案例[-1,4,3,1] 当i1时,以下两条语句的执行结果不一致: “nums[nums[i]-1], nums[i] nums[i], nums[nums[i]-1]” “nums[i], nums[nums[i]-1] nums[nums[i]-1], nums[i]” 解析…...

ElasticSearch知识点汇总
1、ES中的倒排索引是什么。 倒排索引,是通过分词策略,形成了词和文章的映射关系表,这种词典映射表即为倒排索引 2、ES是如何实现master选举的。 选举过程主要包括以下几个步骤: 心跳检测: 每个节点…...

phpize +Visual Studio + MSYS2 + bison 草稿记录并未正常完成
phpize Visual Studio MSYS2 bison 先安装 Visual Studio https://visualstudio.microsoft.com/zh-hans/vs/ 在安装过程中,选择安装工作负载。确保选择了 C 工作负载以及适用于 C 开发的相关组件,例如 MSVC v142 - VS 2022 C x64/x86 build tools。 …...

网络安全与IP地址的关联
网络安全与IP地址之间存在着密不可分的关系。IP地址作为网络通信的基础,对于网络安全的保障具有至关重要的作用。以下将详细探讨网络安全与IP地址之间的关联,以及IP地址在网络安全中的应用。 一、IP地址与网络安全的关系 IP地址是网络通信的基础&#x…...

罗德与施瓦茨 SMC100A信号发生器9kHz至3.2 GHz
罗德与施瓦茨 SMC100A信号发生器,9 kHz - 3.2 GHz 罗德与施瓦茨 SMC100A 以极具吸引力的价格提供出色的信号质量。它覆盖的频率范围为 9 kHz 至 1.1 GHz 或 3.2 GHz。输出功率为典型值。> 17 dBm。所有重要功能(AM/FM/φM/脉冲调制)均已集…...

新能源汽车充电站智慧充电电能服务综合解决方案
安科瑞薛瑶瑶18701709087/17343930412 ★解决方案 ✔目的地充电-EMS微电网平台 基于EMS解决方案从设备运维的角度解决本地充电的能量管理及运维问题,与充电管理平台打通数据,为企业微电网提供源、网、荷、储、充一体化解决方案。 ✔运营场站--电能服务…...

pytest(二):关于pytest自动化脚本编写中,初始化方式setup_class与fixture的对比
一、自动化脚本实例对比 下面是一条用例,使用pytest框架,放在一个类中,两种实现方式: 1.1 setup_class初始化方式 1. 优点: 代码结构清晰,setup_class 和 teardown_class 看起来像传统的类级别的 setup 和 teardown 方法。2. 缺点: 使用 autouse=True 的 fixture 作为…...

项目中遇到的问题
web项目中请求线程到service层的时候远程调用服务之前是串行化执行每个任务都要get阻塞等待任务完成,举例当用户在购物车页面点击去结算就会请求后台toTrade请求获取订单确认的详情数据并渲染到订单详情页,现在在toTrade请求中使用异步任务编排Completab…...

Deeplab的复现(pytorch实现)
DeepLab复现的pytorch实现 本文复现的主要是deeplabv3。使用的数据集和之前发的文章FCN一样,没有了解的可以移步到之前发的文章中去查看一下。 1.该模型的主要结构 对于代码部分,主要只写了模型部分的,其他部分内容基本和FCN的一致…...

input上添加disabled=“true“,点击事件失效处理办法
当我们给input标签上添加disabled"true"时,再添加点击事件,点击事件会不生效,处理办法如下: 给input标签添加样式style"pointer-events: none;" 代码如下: <input style"pointer-event…...

精酿啤酒的魅力:啤酒的与众不同风味
啤酒,作为世界上古老的酒精饮品之一,一直以来都以其与众不同的魅力吸引着无数人的味蕾。而精酿啤酒,作为啤酒中的佼佼者之一,更是以其丰富的口感和多样的风格,成为了啤酒爱好者的心头好。在这其中,Fendi cl…...

检测机构的双资质是什么?
CMA和CNAS是两种在检测、校准和认证领域具有权威性的资质。 CMA资质全称为“检验检测机构资质认定”(China Inspection Body and Laboratory Mandatory Approval)。它是根据《中华人民共和国计量法》等相关法规,由国家认证认可监督管理委员会…...

基于springboot的校园食堂订餐系统
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…...

基于SpringBoot的高校推荐系统
项目介绍 当前,随着高等教育的不断普及,越来越多的学生选择考研究生来提高自身的学术水平和竞争力。然而,考研生在选择报考院校和专业时面临着众多的选择和信息不对称的问题。为了解决这些问题,一些网站和APP已经推出了相关的院校…...