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

embedded/2024/9/25 4:34:25/

环境搭建请参考: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.ppmy.cn/embedded/12929.html

相关文章

CSS3新增特性(二)

四、2D 转换 • 属性名:transform (可用于制作2D转换,也可用于制作3D转转换;2D转换是平面上的转换,3D转换是在三维立体空间的转换) • 作用:对元素进行水平或垂直方向的移动、缩放、旋转、拉长…

Spring AOP 切面编程

1.切面编程 无需改变原有类的情况下对业务功能实现扩展或增强。 2.目前最流行的AOP框架有两个,分别为Spring AOP 和 AspectJ。 3.Spring AOP使用纯java实现,不需要专门的编译过程和类加载器,在运行期间通过代理方式向目标类织入增强的代码。 …

MySQL中的并发控制,读写锁,和锁的粒度

MySQL中的并发控制,读写锁,和锁的粒度 并发控制的概述 在数据库系统中,并发控制是一种用于确保当多个用户同时访问数据库时,系统能够提供数据的一致性和隔离性的机制。MySQL支持多种并发控制技术,其中包括锁机制、多…

2024年深圳杯东三省数学建模联赛A题论文首发第二种思路

深圳杯A题论文代码分享资料链接:链接:https://pan.baidu.com/s/1L2NVgoefSW-yuqZjEB3wcw 提取码:sxjm 问题一 数据转换: 首先,我们将监测站的经纬度坐标转换为基于米的笛卡尔坐标系。这是因为在地面上的大尺度距离…

观察者模式:实现对象间的松耦合

在软件设计中,对象之间的通信是一个常见的问题。观察者模式(Observer Pattern)是一种行为型设计模式,它允许对象在其状态发生变化时通知其他对象。这种模式创建了一种依赖关系,使得一个对象改变状态时,所有…

【黑马点评Redis——003优惠券秒杀4——消息队列Stream】

1. 目前还存在的问题 设置的阻塞队列可能会超出最大长度系统重启会导致阻塞队列中的信息消失,可能会出现问题 2. 消息队列 消息队列 (Message Queue)。 字面意思就是存放消息的队列。最简单的消息队列模型包括3个角色消息队列:存储和管理消息,也被称为…

基于快照行情的股票/基金 1分钟 K 线合成指南

1. 概述 由于不同交易所不同资产的交易规则是有差异的,导致不同交易所基于快照行情或逐笔成交合成不同资产1分钟 K 线的计算方法是不同的。 本教程旨在提高 DolphinDB 在具体业务场景下的落地效率,降低 DolphinDB 在实际业务使用中的开发难度。 本教程…

【vue2+antvx6】节点大小不一致,点击按钮流程图自动布局

需求: 1、点击优化布局的按钮,自动布局(从左到右),按钮变成撤销布局按钮 2、点击撤销布局的按钮,返回之前的布局 3、在点击优化布局的按钮后,如果移动了节点,则自动将撤销布局的按…