YOLOv8 训练自己的数据集(20240423)

环境搭建请参考:Win10 搭建 YOLOv8 运行环境(20240423)-CSDN博客

环境测试请参考:本地运行测试 YOLOv8(20240423)-CSDN博客

一、使用 YOLOv8 的 coco128 数据集熟悉一下如何训练和预测

        1.1、在项目根目录下创建文件夹 datasets。

。        1.2、在 datasets 目录下添加 yaml 配置文件 coco128.yaml,并复制以下内容。

#  数据集的根目录路径。
#  由于 YOLOv8 对目录做了默认的一些设置(第一次运行时的位置,而不是当前项目路径来查找),
#  虽然可以修改配置文件或者在代码中指定,但是我觉得在这边使用绝对路径更为方便一些。
path: E:/PyCharmProjects/yolov8_learn/datasets/coco128
# 训练图像位于 images/train2017,这是相对于 path 的相对路径
train: images/train2017
# 验证图像也位于 images/train2017,与训练图像使用相同的路径。
# 需要注意的是,通常训练集和验证集应该包含不同的图像,以确保模型验证的有效性。但在这里,它们使用了相同的图像,这在实际应用中可能不是最佳实践。
val: images/train2017
# 测试图像的路径,这是一个可选字段。
test:# 类别
names:0: person1: bicycle2: car3: motorcycle4: airplane5: bus6: train7: truck8: boat9: traffic light10: fire hydrant11: stop sign12: parking meter13: bench14: bird15: cat16: dog17: horse18: sheep19: cow20: elephant21: bear22: zebra23: giraffe24: backpack25: umbrella26: handbag27: tie28: suitcase29: frisbee30: skis31: snowboard32: sports ball33: kite34: baseball bat35: baseball glove36: skateboard37: surfboard38: tennis racket39: bottle40: wine glass41: cup42: fork43: knife44: spoon45: bowl46: banana47: apple48: sandwich49: orange50: broccoli51: carrot52: hot dog53: pizza54: donut55: cake56: chair57: couch58: potted plant59: bed60: dining table61: toilet62: tv63: laptop64: mouse65: remote66: keyboard67: cell phone68: microwave69: oven70: toaster71: sink72: refrigerator73: book74: clock75: vase76: scissors77: teddy bear78: hair drier79: toothbrush

        1.3、下载 coco128(下载地址)训练集数据,解压后将 coco128 文件夹放在 datasets 目录下。数据集包含两个子文件夹 images(用于训练的图片) 和 labels(每张图片对应的标签),此处images 和 labels 文件夹下只有一个名为 train2017 的文件夹,实际上应该分别再创建 train(训练)、val(验证)、test(测试)等文件夹,例如  train2017、val2017、test2017。当然这不是必须的,训练、验证、测试都使用相同的图片也是没有问题的。

        1.4、编写代码,启动训练。

from ultralytics import YOLOif __name__ == '__main__':# 训练数据集# YOLOv8 提供了 n、s、m、l、x 五种预训练模型,模型精度递增,相应的训练速度越慢# 加载一个预训练模型model = YOLO('./weights/yolov8m.pt')# 启动模型的训练#   1)、data = './datasets/coco128.yaml': 这个参数指定了用于训练的数据集配置文件#   2)、epochs=3: 这个参数指定了训练的轮数(或周期)#   3)、results = ...: 这行代码将训练过程的结果(如损失值、准确率、模型权重更新等)赋值给results变量。这些结果可以用于后续的分析和模型评估results = model.train(data='./datasets/coco128.yaml', epochs=3)

        1.5、训练后的结果将保存到 runs 目录下。

        1.6、编写代码,启动预测。不过这次我们不用 YOLOv8 的模型,使用之前训练后得到的最好的一次结果模型。

from ultralytics import YOLOif __name__ == '__main__':# 预测数据集# 加载一个预训练模型model = YOLO('./runs/detect/train2/weights/best.pt')# 预测图片 ./assets/zidane.jpg,并保存预测结果results = model.predict("./assets/zidane.jpg", save=True)

        1.7、预测后的结果将保存到 runs 目录下。

二、安装 LabelImg 

        2.1、下载安装 LabelImg,LabelImg 是一款开源的图片标注工具,使用 Python 编写并基于 PyQt5 框架。它提供了一个直观的图形用户界面,方便用户对图片进行标注,并生成标注结果。LabelImg 支持多种常见的标注格式,如 PASCAL VOC、YOLO等,适用于各种计算机视觉任务。我们之前安装了 Anaconda,这里就直接使用 Anaconda 进行 LabelImg  的安装。

        2.2、在开始菜单中找到并打开 Anaconda 的命令行工具,Anaconda Powershell Prompt 或者 Anaconda Prompt 均可。

        2.3、输入命令使用 python 3.9.16 创建 LabelImg 虚拟机环境。

conda create -n labelimg python=3.9.16

        2.4、输入命令 conda activate labelimg 激活 LabelImg 虚拟机环境 

        2.5、输入命令 conda install labelimg 安装 LabelImg

conda install labelimg

        2.6、如果没有安装成功,提示 PackagesNotFoundError: The following packages are not available from current channels时,通常意味着Anaconda的默认仓库中并没有包含LabelImg这个包,或者该包尚未被加入到你的当前通道中。可以尝试添加一些常用的社区维护的通道,比如conda-forge,这个通道包含了大量额外的包。使用以下命令添加conda-forge通道。

conda config --add channels conda-forge

        2.7、输入命令 labelimg 启动软件。

labelimg

        2.7、将软件切换为标注 YOLO 数据,并设置自动保存(需要注意的是软件使用期间不要关闭 Anaconda 的命令行工具) 。

三、使用 LabelImg 标注数据 

        3.1、创建文件夹 mydata,在mydata 文件夹下分别创建 images 和 labels 两个文件夹。

        3.2、分别在 images 和 labels 下创建 train 文件夹用于存放用于训练的图片文件和图片文件对应的标签。

        3.3、将用于训练的图片放入 mydata/images/train 文件夹后,在 LabelImg 中点击 Open Dir 导入。

        3.4、点击 Change Save Dir,修改存储路径为 mydata/images/train。

         3.5、点击 Create RectBox,对图片进行标注。

        3.6、将标注好数据后的 mydata 文件夹移动至项目根目录下创建文件夹 datasets。 

         

四、编写代码进行训练预测 

        4.1、参考 coco128.yaml 编写 mydata.yaml,类别在 datasets/mydata/labels/classes.txt 中。

#  数据集的根目录路径。
#  由于 YOLOv8 对目录做了默认的一些设置(第一次运行时的位置,而不是当前项目路径来查找),
#  虽然可以修改配置文件或者在代码中指定,但是我觉得在这边使用绝对路径更为方便一些。
path: E:/PyCharmProjects/yolov8_learn/datasets/mydata
# 训练图像位于 images/train,这是相对于 path 的相对路径
train: images/train
# 验证图像也位于 images/train,与训练图像使用相同的路径。
# 需要注意的是,通常训练集和验证集应该包含不同的图像,以确保模型验证的有效性。但在这里,它们使用了相同的图像,这在实际应用中可能不是最佳实践。
val: images/train
# 测试图像的路径,这是一个可选字段。
test:# 类别
names:0: face1: leg

         4.2、参考 yolov8.yaml 文件修改出自己的模型配置文件 myyolo.yaml。

# 模型参数
nc: 2 # 类别数(nc),它指定了模型可以检测的不同对象的数量
scales: # 模型缩放常数(scales),用于调整模型的规模,实现不同复杂度的模型设计# 深度(depth)、宽度(width)和最大通道数(max_channels)# 这些缩放常数会应用到模型的骨架(backbone)和头部(head)结构中,从而得到不同复杂度和性能的模型。# 这里定义了五个缩放级别:'n'(小型)、's'(标准型)、'm'(中型)、'l'(大型)和 'x'(特大型)n: [0.33, 0.25, 1024] # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPss: [0.33, 0.50, 1024] # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPsm: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPsl: [1.00, 1.00, 512] # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPsx: [1.00, 1.25, 512] # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs
# YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPs 解释如下
# 225 layers: 这表示YOLOv8n模型由225个层组成。这些层包括卷积层、池化层、激活函数层、特征融合层等,它们共同构成了模型的网络结构。
# 3157200 parameters: 这表示模型中总共有3157200个参数。参数是模型在训练过程中需要学习的变量,它们决定了模型从输入图像中提取特征和进行预测的方式。
#  参数的数量通常与模型的复杂度和性能相关,但并非绝对。更多的参数可能会使模型更强大,但也更容易导致过拟合。
# 3157184 gradients: 梯度是在训练过程中用于更新模型参数的值。这里提到的梯度数量与参数数量非常接近,这是因为在反向传播过程中,
#  通常会对每个参数计算一个梯度。这些梯度指示了如何调整参数以最小化训练损失。
# 8.9 GFLOPs: GFLOPs(Giga Floating Point Operations)是浮点运算次数的度量单位,用于衡量模型的计算复杂度。
#  8.9 GFLOPs表示模型进行一次前向传播(从输入到输出)大约需要执行8.9×10^9次浮点运算。这个数值可以帮助评估模型在推理(即预测新数据)时的计算需求,
#  以及在不同硬件上的运行效率。# 模型的主干网络结构,它负责从输入图像中提取特征。
# 通常,骨架由一系列的卷积层、池化层和其他可能的模块组成,这些层通过下采样来逐渐提取不同尺度的特征。
# 这里使用了 Conv 和 C2f 模块,并指定了它们的参数。
# 每个条目都包含了一个列表,表示了模块的类型、参数以及该模块应用于的层。
# 例如,[-1, 1, Conv, [64, 3, 2]] 表示在上一层(由 -1 指示)之后添加一个卷积层,该卷积层有 64 个输出通道,卷积核大小为 3,步长为 2
backbone:# [from, repeats, module, args]# from 指示该层或模块是从哪个先前的层或模块获取的输入。这通常是一个索引值,其中 -1 表示前一个层,-2 表示前两个层,依此类推。这允许模型配置中的层引用前面的层作为输入。# repeats 表示该层或模块应该重复的次数。这允许你定义重复的层结构,这对于创建深度网络结构特别有用。# module 定义了要使用的层或模块的类型。这可以是一个预定义的层类型(如 Conv 表示卷积层),或者是一个自定义的模块(如 C2f,它可能是某种特定的卷积和特征融合模块的组合)。# args 是一个列表,包含了传递给 module 的参数。这些参数具体取决于所使用的层或模块类型。例如,对于卷积层,参数可能包括输出通道数、卷积核大小和步长等。- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4- [-1, 3, C2f, [128, True]]- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8- [-1, 6, C2f, [256, True]]- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16- [-1, 6, C2f, [512, True]]- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32- [-1, 3, C2f, [1024, True]]- [-1, 1, SPPF, [1024, 5]] # 9# 从主干网络提取的特征中检测对象。它可能包括上采样层、特征融合模块以及最终的检测层。多尺度检测是 YOLO 系列模型的一个特点,通过在多个尺度上检测对象,模型可以更好地处理不同大小的对象。
# 这里定义了多个上采样层、连接层(Concat)和检测层(Detect)。上采样层用于增加特征图的尺寸,连接层用于将不同尺度的特征图合并在一起,而检测层则负责在合并后的特征图上检测对象。
# Detect 层接受多个输入(在这里是 P3、P4 和 P5 三个尺度的特征图),并输出每个尺度的检测结果。每个检测结果都包含了边界框的坐标、置信度和类别得分。
head:- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 6], 1, Concat, [1]] # cat backbone P4- [-1, 3, C2f, [512]] # 12- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 3, C2f, [256]] # 15 (P3/8-small)- [-1, 1, Conv, [256, 3, 2]]- [[-1, 12], 1, Concat, [1]] # cat head P4- [-1, 3, C2f, [512]] # 18 (P4/16-medium)- [-1, 1, Conv, [512, 3, 2]]- [[-1, 9], 1, Concat, [1]] # cat head P5- [-1, 3, C2f, [1024]] # 21 (P5/32-large)- [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5)

        4.3、编写代码,启动训练。我们通过参考 yolov8.yaml 文件修改出自己的模型配置文件 myyolo.yaml,可以调整模型的配置以适应特定的任务和数据集。然而,对于大多数用户来说,直接使用预定义的配置文件(如 yolov8n.yaml、yolov8s.yaml 等)作为起点,并根据需要进行微调可能更为简单和有效。

from ultralytics import YOLOif __name__ == '__main__':# 创建一个新的 YOLO 模型# model = YOLO('yolov8n.yaml')model = YOLO('myyolo.yaml')# 启动模型的训练#   1)、data = './datasets/coco128.yaml': 这个参数指定了用于训练的数据集配置文件#   2)、epochs=3: 这个参数指定了训练的轮数(或周期)#   3)、results = ...: 这行代码将训练过程的结果(如损失值、准确率、模型权重更新等)赋值给results变量。这些结果可以用于后续的分析和模型评估results = model.train(data='./datasets/mydata.yaml', epochs=3)

        4.4、训练后的结果将保存到 runs 目录下。

        4.5、编写代码,启动预测。不过这次我们不用 YOLOv8 的模型,使用之前训练后得到的最好的一次结果模型。

from ultralytics import YOLOif __name__ == '__main__':# 预测数据# 加载一个预训练模型model = YOLO('./runs/detect/train/weights/best.pt')# 预测图片 ./assets/zidane.jpg,并保存预测结果results = model.predict("./assets/mydata_test.png", save=True)

        4.6、预测后的结果将保存到 runs 目录下。

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

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

相关文章

ClickHouse用UDF解析XML字符串和XML文件

一.如果是读取xml文件的时候,文件入库需要使用文件读取UDF 创建了1个测试文件 wsdFileRead(): 直接读取文件内容 SELECT wsdFileRead(/home/temp/wsd_test.xml)Query id: 09b6e5fe-7169-43f7-b001-90e2eeabb8da┌─wsdFileRead(/home/temp/wsd_test.xm…

串口服务器和光纤交换机的区别

串口服务器与光纤交换机在功能和应用上存在显著区别。串口服务器主要实现串口设备与以太网设备之间的数据转换与传输,适用于远程监控、数据采集等场景;而光纤交换机则专注于高速光纤网络中的数据交换,为大型企业或数据中心提供稳定、高效的数…

基于SpringBoot的合家云社区物业管理平台 - 权限管理模块开发

合家云社区物业管理平台 4.权限管理模块开发 4.1 权限管理概述 4.1.1 权限管理的意义 后台管理系统中,通常需要控制不同的登录用户可以操作的内容。权限管理用于管理系统资源,分配用户菜单、资源权限,以及验证用户是否有访问资源权限。 …

开源模型应用落地-chatglm3-6b-集成langchain(十)

一、前言 langchain框架调用本地模型,使得用户可以直接提出问题或发送指令,而无需担心具体的步骤或流程。通过LangChain和chatglm3-6b模型的整合,可以更好地处理对话,提供更智能、更准确的响应,从而提高对话系统的性能…

构建企业信息安全防护体系:以电子文档安全为核心

随着信息社会的飞速发展与企业信息化建设的深入,企业的商业机密已从传统的纸质文件转向各类电子文档,如CAD图纸、Office文档等。这些数字化的信息载体在提升工作效率、便捷信息流转的同时,也成为了企业内部数据安全面临的主要挑战。如何有效地…

基于springboot实现中药实验管理系统设计项目【项目源码+论文说明】

基于springboot实现中药实验管理系统设计演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了中药实验管理系统的开发全过程。通过分析中药实验管理系统管理的不足,创建了一个计算机管理中药实验管…

LeetCode-2385. 感染二叉树需要的总时间【树 深度优先搜索 广度优先搜索 二叉树】

LeetCode-2385. 感染二叉树需要的总时间【树 深度优先搜索 广度优先搜索 二叉树】 题目描述:解题思路一:记录父节点 DFS解题思路二:解题思路三:深度优先搜索建图 广度优先搜索求感染时间【最容易理解】 题目描述: 给…

实现Spring底层机制(三)

文章目录 阶段4—实现BeanPostProcessor机制1.文件目录2.初始化方法实现1.编写初始化接口InitializingBean.java2.MonsterService.java实现初始化接口3.容器中的createBean方法增加初始化逻辑,判断对象类型是否是InitializingBean的子类型,如果是&#x…

FRP远程连接

前言 通过frp和跳板机完成局域网服务器访问。工具地址:https://github.com/fatedier/frp 配置frp过程 下载frp工具,下载地址如下: https://github.com/fatedier/frp/releases 这里我选择了v0.57.0 解压到本地路径 tar -zxvf xxxxxx.tar.gz配…

python爬虫学习第二十八天-------了解scrapy(二十八天)

🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…

接口测试和Mock学习路线(中)

1.什么是 swagger Swagger 是一个用于生成、描述和调用 RESTful 接口的 WEB 服务。 通俗的来讲,Swagger 就是将项目中所有想要暴露的接口展现在页面上,并且可以进行接口调用和测试的服务。 现在大部分的项目都使用了 swagger,因为这样后端…

fakak详解(2)

Kafka和Flume整合 Kafka与flume整合流程 Kafka整合flume流程图 flume主要是做日志数据(离线或实时)地采集。 图-21 数据处理 图-21显示的是flume采集完毕数据之后,进行的离线处理和实时处理两条业务线,现在再来学习flume和kafka的整合处理。 配置fl…

微信小程序开发工具的使用,各个配置文件详解,小程序开发快速入门

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

redis单线程模型

工作原理 在Redis中,当两个客户端同时发送相同的请求时,Redis采用单线程模型来处理所有的客户端请求,会依次处理这些请求,每个请求都会按照先后顺序被执行,不会同时处理多个请求。使得Redis能够避免多线程并发访问数据…

大语言模型应用指南:以ChatGPT为起点,从入门到精通的AI实践教程

目录 前言ChatGPT问世和发展展望未来大语言模型应用指南 特点大语言模型应用指南 主要内容 前言 在20世纪末和21世纪初,人类经历了两次信息革命的浪潮。 第一次是互联网时代的兴起,将世界各地连接在一起,改变了人们获取信息和交流的方式。 …

函数式接口及Stream流式计算

一、什么是函数式接口 只有一个方法的接口,例如 FunctionalInterface public interface Runnable { public abstract void run(); }二、Function函数式接口:有一个输入参数,有一个输出 三、断定型接口:有一个输入参数&#xf…

《ElementPlus 与 ElementUI 差异集合》el-select 显示下拉列表在 Cesium 场景中无法监听关闭

前言 仅在 Element UI 时有此问题,Element Plus 由于内部结构差异较大,不存在此问题。详见《el-select 差异点,如:高、宽、body插入等》; 问题 点击空白处,下拉列表可监听并关闭;但在 Cesium…

【js】解决自动生成颜色时相邻颜色视觉相似问题的技术方案

解决自动生成颜色时相邻颜色视觉相似问题的技术方案 在进行大规模颜色生成时,特别是在数据可视化、用户界面设计等应用领域,一个常见的挑战是确保相邻颜色在视觉上具有足够的区分度。本文介绍的方法通过结合黄金分割比与饱和度、亮度的周期性变化&#…

数据分析_时间维度对比及变化可视化分析(Pandas和Matplotlib)

数据分析_时间维度对比及变化可视化分析(Pandas和Matplotlib) 分析维度包括: 各年度合计销量 各年度合计销售额 各年度平均每公斤销售额 各月度销量对比 各月度销售额变化 构建测试数据 这里你可以了解到: 如何生成时间相关的数据。 如何从列表(可迭代对象…

Linux多进程(二)进程通信方式一 管道

管道的是进程间通信(IPC - InterProcess Communication)的一种方式,管道的本质其实就是内核中的一块内存(或者叫内核缓冲区),这块缓冲区中的数据存储在一个环形队列中,因为管道在内核里边,因此我们不能直接…