(2024.10.28)使用YOLOv8训练自己的目标检测模型

news2025/1/16 1:11:08

收集数据集:

1.使用开源已标记数据集

2.自己网上搜索下载。

 3.可以将图片几何变换,类似翻转、裁剪、旋转和平移,就变成多张图片了

标注数据集 :

常用的标注工具有很多,比如LabelImg(易崩溃)LabelMe(bug)VIA等,但是这些工具都需要安装使用,我这里给大家介绍一款在线标注数据集的工具Make Sense打开即用,非常的便捷,在标注之前,我们来看一下一般情况下遵循的标注规则
  1. 目标框必须框住整个目标物体,不能有遗漏和重叠。
  2. 目标框应该与目标物体尽可能接近,但不能与目标物体重合。
  3. 目标框的宽度和高度应该为正数,不能为零或负数。
  4. 如果一张图片中有多个目标物体,每个目标物体应该用一个独立的目标框进行标注,不允许多个目标共用一个框。
  5. 如果目标物体的形状不规则,可以使用多个框进行标注,但必须框住整个目标物体。
  6. 目标框的坐标必须在数据集中统一。

 中文版网页:

Make Sense - 在线图像标注 - BimAnticon-default.png?t=O83Ahttp://makesense.bimant.com/英文版网页:

Make Senseicon-default.png?t=O83Ahttps://www.makesense.ai/

标注前请确定:

  1. 请将标注的图片的格式全部归为一样,不然后续代码运行不能将png和jpe的格式分开
  2.  请查看项目文件数目和文件命名最后那个数目一样,中间不要纯在相同名称,不同格式,格式也只能有一种

 

注意这里要在右边选上你的标签,不然是空压缩包

全部标记完成后:

我们点击Action -> Export Annotation 导出 yolo 格式的标签文件压缩包解压后是这样的:

 

0表示第一个标签

 

shuju1是图片

shuju2是解压后的标注文件

但是 YOLOv8 所需要的数据集路径的格式是下面这样子的(YOLOv8支持不止这一种格式),我们接下来要通过脚本来来划分一下数据集: 

├── yolov8_dataset
	└── train
		└── images (folder including all training images)
		└── labels (folder including all training labels)
	└── test
		└── images (folder including all testing images)
		└── labels (folder including all testing labels)
	└── valid
		└── images (folder including all testing images)
		└── labels (folder including all testing labels)

这里使用脚本分类:

# by CSDN 迪菲赫尔曼
import os
import random
import shutil

def copy_files(src_dir, dst_dir, filenames, extension):
    os.makedirs(dst_dir, exist_ok=True)
    missing_files = 0
    for filename in filenames:
        src_path = os.path.join(src_dir, filename + extension)
        dst_path = os.path.join(dst_dir, filename + extension)
        
        # Check if the file exists before copying
        if os.path.exists(src_path):
            shutil.copy(src_path, dst_path)
        else:
            print(f"Warning: File not found for {filename}")
            missing_files += 1

    return missing_files

def split_and_copy_dataset(image_dir, label_dir, output_dir, train_ratio=0.7, valid_ratio=0.15, test_ratio=0.15):
    # 获取所有图像文件的文件名(不包括文件扩展名)
    image_filenames = [os.path.splitext(f)[0] for f in os.listdir(image_dir)]

    # 随机打乱文件名列表
    random.shuffle(image_filenames)

    # 计算训练集、验证集和测试集的数量
    total_count = len(image_filenames)
    train_count = int(total_count * train_ratio)
    valid_count = int(total_count * valid_ratio)
    test_count = total_count - train_count - valid_count

    # 定义输出文件夹路径
    train_image_dir = os.path.join(output_dir, 'train', 'images')
    train_label_dir = os.path.join(output_dir, 'train', 'labels')
    valid_image_dir = os.path.join(output_dir, 'valid', 'images')
    valid_label_dir = os.path.join(output_dir, 'valid', 'labels')
    test_image_dir = os.path.join(output_dir, 'test', 'images')
    test_label_dir = os.path.join(output_dir, 'test', 'labels')

    # 复制图像和标签文件到对应的文件夹
    train_missing_files = copy_files(image_dir, train_image_dir, image_filenames[:train_count], '.jpg')
    train_missing_files += copy_files(label_dir, train_label_dir, image_filenames[:train_count], '.txt')

    valid_missing_files = copy_files(image_dir, valid_image_dir, image_filenames[train_count:train_count + valid_count], '.jpg')
    valid_missing_files += copy_files(label_dir, valid_label_dir, image_filenames[train_count:train_count + valid_count], '.txt')

    test_missing_files = copy_files(image_dir, test_image_dir, image_filenames[train_count + valid_count:], '.jpg')
    test_missing_files += copy_files(label_dir, test_label_dir, image_filenames[train_count + valid_count:], '.txt')

    # Print the count of each dataset
    print(f"Train dataset count: {train_count}, Missing files: {train_missing_files}")
    print(f"Validation dataset count: {valid_count}, Missing files: {valid_missing_files}")
    print(f"Test dataset count: {test_count}, Missing files: {test_missing_files}")

# 使用例子
image_dir = 'datasets/coco128/images/train2017'//可以使用根本路径
label_dir = 'datasets/coco128/labels/train2017'
output_dir = './my_dataset'//自己建一个文件夹,输出结构文件夹

split_and_copy_dataset(image_dir, label_dir, output_dir)

这个脚本是处理jpg格式的图片文件。如果需要处理其他格式自己修改代码中出现JPG的地方,处理完后的格式为下图所示,

 训练模型 

在yolo v8的项目文件下建一个新建一个数据集yaml文件

# moncake
train: D:\Pycharm_Projects\ultralytics\ultralytics\datasets\mooncake\train //路径
val: D:\Pycharm_Projects\ultralytics\ultralytics\datasets\mooncake\valid 
test: D:\Pycharm_Projects\ultralytics\ultralytics\datasets\mooncake\test
nc:1   //这里是下面标签总数
# Classes
names:
  0: MoonCake

配置完成后: 在yolov8下打开cmd

 激活你配置好的prtorch环境:

 使用下面三个命令中一个进行负责到cmd窗口

这里注意将data的参数用根路径索引出来,

yolo train data=D:\Desktop\yolov8\ultralytics-main\datasets\yangdujun.yaml model=yolov8n.pt epochs=100 lr0=0.01 训练

# 从YAML构建一个新模型,从头开始训练
yolo detect train data=ultralytics/datasets/MoonCake.yaml model=yolov8n.yaml epochs=100 imgsz=640

# 从预训练的*.pt模型开始训练
yolo detect train data=ultralytics/datasets/MoonCake.yaml model=yolov8n.pt epochs=100 imgsz=640

# 从YAML中构建一个新模型,将预训练的权重转移到它并开始训练
yolo detect train data=ultralytics/datasets/MoonCake.yaml model=yolov8n.yaml pretrained=yolov8n.pt epochs=100 imgsz=640

等待完成--------------------------------------------------------------------------------------------------

 

------------------------------------------------------------------------------------------------------------------

测试模型:在  D:\Desktop\yolov8\ultralytics-main\runs\detect路径下会有模型生成,

 

 

训练结果文件说明

weights文件夹
best.pt:损失值最小的模型文件
last.pt:训练到最后的模型文件
args.yaml

        模型训练的配置参数

confusion_matrix.png - 混淆矩阵

        这张图展示了分类模型的性能。每一行代表模型预测的类别,每一列代表实际的类别。对角线上的数值表示模型正确预测的数量。对角线上较深的颜色表示该类别预测正确的数量较多。

confusion_matrix_normalized.png - 标准化混淆矩阵:

        与普通混淆矩阵类似,但这里的值显示的是每个类别的预测正确比例。这有助于比较不同类别的预测准确性,尤其是在类别样本数量不平衡的情况下。

F1_curve.png - F1-置信度曲线

        此曲线显示了F1得分随着置信度阈值的变化。F1得分是精确度和召回率的调和平均值,曲线的峰值表示给定置信度阈值下精确度和召回率的最佳平衡点。

labels.jpg - 标签分布图和边界框分布图

        柱状图显示了不同类别的实例分布数量。散点图则展示了目标检测任务中边界框的空间分布情况,反映了常见的尺寸和长宽比。

labels_correlogram.jpg - 标签相关图

        相关图提供了不同类别标签之间的关系,以及它们在图像中位置的相关性。这有助于理解模型在识别不同类别时可能出现的关联或混淆。

P_curve.png - 精确度-置信度曲线

        这张曲线图展示了模型预测的精确度随着置信度阈值的变化。精确度是模型预测正确正例与预测为正例总数的比值。

PR_curve.png - 精确度-召回曲线

        这张曲线图展示了模型的精确度与召回率之间的关系。理想情况下,模型应在精确度和召回率之间保持良好的平衡。

R_curve.png - 召回-置信度曲线

        此曲线图显示了模型的召回率随置信度阈值的变化。召回率是模型正确预测的正例与实际正例总数的比值。

results.png 和 results.csv - 训练结果图表和数据

        这些图表和数据文件展示了模型在训练过程中的性能变化,包括损失函数的变化和评估指标(如精确度、召回率和mAP)的变化。

验证模型:

这里我使用命令测试:

yolo predict model=runs/detect/train5/weights/best.pt source=datasets/yangdujun/test/images/1(8).jpg       测试

model=runs/detect/train5/weights/best.pt是训练完成损失度最小的模型

source=datasets/yangdujun/test/images/1(8).jpg      是你要测试的图片跟路径

然后可以在D:\Desktop\yolov8\ultralytics-main\runs\detect\predict 路径下找到你的识别完成的图片

导出模型 :

CLI 指令导出方式:

yolo task=detect mode=export model=runs/detect/train/weights/best.pt

python 指令导出方式: 

from ultralytics import YOLO

# Load a model
model = YOLO('yolov8n.pt')  # load an official model
model = YOLO('path/to/best.pt')  # load a custom trained

# Export the model
model.export(format='onnx')

 

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

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

相关文章

nacos的原理,为什么可以作为注册中心,和zookeeper的区别

Nacos 是阿里巴巴开源的一款用于动态服务发现、配置管理和服务治理的中间件,广泛应用于微服务架构中。它可以作为注册中心的原因在于其强大的服务注册与发现功能,原理上与 Zookeeper 有相似之处,但在设计目标和功能上有所区别。 Nacos 的原理…

猫头虎分享: 108个最新国内AI工具集,AI写作AI绘画工具大全

猫头虎分享: 108个最新国内AI工具集,AI写作AI绘画工具大全 🎨🤖 👋 大家好呀,这里是 猫头虎,专注于分享技术干货、AI工具和实用资源。今天给大家带来一份超级干货清单——108个国内最流行的AI工…

PPT制作新选择:本地部署PPTist结合内网穿透实现实时协作和远程使用

文章目录 前言1. 本地安装PPTist2. PPTist 使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 配置固定公网地址 💡 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击跳转到网站】 前…

【Python】数据分析必备:Pandas库的全面教程与实战

数据分析必备:Pandas库的全面教程与实战 在数据分析领域,Python已成为一门主流语言,而Pandas库则是Python中最重要的数据分析工具之一。无论是数据清洗、数据处理,还是数据可视化,Pandas都能为数据科学家和分析师提供…

解决nexus无法启动问题

🎉 问题 首先,nexus对jdk版本有要求,这点相信大家都知道,如果版本不对的话,会报以下错误: No suitable Java Virtual Machine could be found on your system. The version of the JVM must be at least 1…

ZEISS ATOS Q蓝光三维扫描仪高效把控零件质量检测【上海沪敖3D】

位于Bengaluru的施耐德电气工厂拥有一流的计量设备,可以检测所有供应商的零件。当时,他们在使用一款激光扫描设备进行质量检测,但是,该设备不便于携带,且检测时需要喷涂大量的显影液。此外,它需要被安装在夹…

React中的hook

React中的hook究竟是什么? 有哪些hook? hook的两大规则 为什么hook要在顶层调用? hook的调用需要在每一次render后都按照一样的顺序进行调用,否则会出现类似“野指针”的情况,但是要做到这一步,就需要hook在…

微服务网格Istio介绍

微服务网格Istio 介绍服务注册和发现服务度量灰度发布 Istio核心特性断路器互动1:举个生活中的例子解释断路器互动2:服务降级(提高用户体验效果) 超时重试多路由规则 Istio架构istio组件详解PilotEnvoyCitadelGalleyIngressgatewa…

Spring Cloud --- Sentinel 热点规则

何为热点 热点即经常访问的数据,很多时候我们希望统计或者限制某个热点数据中访问频次最高的TopN数据,并对其访问进行限流或者其它操作 热点规则 方法 testHotKey 里面第一个参数 P1 只要 QPS 超过每秒 1 次,马上降级处理 请求路径中不管…

ArcGIS 10.8 安装教程(含安装包)

目录 一、ArcGIS10.8二、安装链接三、安装教程四、ArcGIS实战 (一)ArcGIS10.8 1. 概述 ArcGIS 10.8是由美国Esri公司开发的GIS平台,用于处理、分析、显示和管理地理数据,并实现数据共享。它具有新特性和功能,性能更…

信号完整性SI总结【小登培训】

信号完整性问题的根源通常在于阻抗不匹配、串扰、时序误差、电磁辐射和电源噪声。解决这些问题需要从PCB设计、布线、材料选择、匹配和屏蔽等多个方面综合考虑,并结合眼图分析等工具进行调试和优化。确保信号完整性对于高速电路设计尤为重要,影响系统的可…

异常处理与调试:如何编写稳健的代码(8/10)

目录 异常处理与调试:如何编写稳健的代码(8/10) 介绍 异常概述 常见的异常类型 使用 try...except 处理异常 基本结构 示例:读取文件内容 捕获多个异常 自定义异常 示例:自定义异常类 调试代码 使用 print…

智能融合:国际数字影像产业园的数字化转型之路践

国际数字影像产业园作为数字园区的典型代表,在现代城市与企业发展进程中扮演着至关重要的角色。它深度融合了信息技术、物联网、大数据等一系列先进技术,全力聚焦于提升城市及企业的智能化水准与管理效能。 产业园围绕数字影像这一特定主题,…

基于KV260的基础视频链路通路(MIPI+Demosaic+VDMA)

目录 1. 简介 1.1 要点 1.2 背景 1.2.1 Got stuck 1.2.2 Cant be Initialized 2. Overlay 2.1 参考 Overlay 2.1.1 KV260 Base 2.1.2 Pynq-CV-OV5640 2.2 自建 Overlay 2.2.1 IIC IP 2.2.2 MIPI CSI-2 Rx 2.2.3 AXI4-S Subset 2.2.4 Demosaic 2.2.5 Pixel Pack …

【MySQL 保姆级教学】内置函数(9)

内置函数 1. 日期函数1.1 日期函数的种类1.2 示例1.3 日期的转换 2. 字符串函数2.1 种类2.2 示例 3. 数学函数3.1 种类3.2 向上取整和向下取整3.3 示例 4. 其他函数4.1 查询当前用户/数据库4.2 ifnull(val1,val2)4.3 md5()函数4.4 password()函数 1. 日期函数 1.1 日期函数的种…

Python | Leetcode Python题解之第514题自由之路

题目: 题解: Test "godding" target "d"i 0left i lc 0 right i rc 0while Test[left] ! target:left - 1lc 1if left -1:left len(Test) - 1while Test[right] ! target:right 1rc 1if right len(Test):right 0prin…

我用自研引擎做游戏:《干得好,托尼》

最近心里突然有个想法,想做一个游戏试试看。但是我从未做过游戏,这可咋办?我理性的思考了片刻,清楚的意识到,我要习得做游戏的方法论。于是到网上找了几本开发游戏的电子书,看了几天,就开始进入…

滚珠花键精密结构如何驱动旋转运动?

滚珠花键作为一种机械传动装置,具有升降旋转机构的功能,被广泛应用于各种机器设备中。那么,大家知道滚珠花键是如何实现旋转运动的吗? 滚珠花键实现旋转运动的工作原理可以概括为滚动摩擦和轴向移动与径向传动这两点,当…

TMGM平台可靠么?交易是否安全?

在选择外汇交易平台时,安全性与可靠性是投资者最关注的要素之一。作为全球知名的外汇及差价合约交易平台,TMGM(tmgm-pt.com)的安全性与可靠性可以从多个方面进行评估,包括监管环境、资金安全、客户服务、交易技术与服务…

Javascript数据结构——哈希表

18_哈希表_深入链地址法_哔哩哔哩_bilibili Java [ 基础 ] HashMap详解 ✨_java hashmap-CSDN博客 哈希表(Hash Table),又称为散列表,是一种通过哈希函数组织数据以实现快速访问的数据结构。下面将从其概述、底层实现和前端应用…