YOLOv8 | 训练自定义数据集

news2024/12/24 16:14:34

目录

    • 1 处理数据集
      • 1.1 数据集格式介绍
      • 1.2 划分数据集
      • 1.3 在 YOLOv8 中配置数据集
    • 2 训练 YOLOv8 模型
      • 2.1 模型训练代码
      • 2.2 开启 TensorBoard


若尚未部署 YOLOv8,则可参考这篇博客:

  • YOLOv8 | Windows 系统下从零开始搭建 YOLOv8 项目环境


1 处理数据集

1.1 数据集格式介绍

由于不同数据集的目录结构可能不同,因此在这里对本文所使用的示例数据集进行说明。

在这里插入图片描述
如上图所示,示例数据集的目录结构为:

  • 存放图片的目录:China_Drone/train/images
  • 存放标签的目录:China_Drone/train/annotations/xmls

图片文件为 .png 文件,而标签文件为采用 pascalVOC 格式的 .xml 文件:

在这里插入图片描述

注意:由于在划分数据集的代码中需要填写各种路径,因此在这里了解数据集的目录结构是很有必要的。



1.2 划分数据集

在 China_Drone/train 目录中新建 split_dataset.py 文件,用于编写划分数据集的代码:

在这里插入图片描述
写入如下代码,用于将原始数据集划分为训练集、验证集、测试集:

import os
import random
import shutil

# 定义目录
# 采用的是相对目录
root_dir = '.'  # 原始数据集目录
image_dir = 'images'  # 原始数据集目录下的图片目录
label_dir = 'annotations/xmls'  # 原始数据集目录下的标签目录

# 划分比例
# 训练集 : 验证集 : 测试集 = 8 : 1 : 1
train_ratio = 0.8
valid_ratio = 0.1
test_ratio = 0.1

# 设置随机种子
random.seed(42)

# 创建各种目录(用于存放拆分后的数据集)
split_dir = './road'  # 拆分后数据集目录
os.makedirs(os.path.join(split_dir, 'train/images'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'train/labels'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'valid/images'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'valid/labels'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'test/images'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'test/labels'), exist_ok=True)

# 获取图片和标签列表
image_files = os.listdir(os.path.join(root_dir, image_dir))
label_files = os.listdir(os.path.join(root_dir, label_dir))
# 随机打乱图片和标签列表
combined_files = list(zip(image_files, label_files))  # 将图片和标签转化为列表
random.shuffle(combined_files)  # 打乱
image_files_shuffled, label_files_shuffled = zip(*combined_files)  # 重新获取
# 根据比例计算划分的边界索引
train_bound = int(train_ratio * len(image_files_shuffled))  # 图片总数 * 训练集比例
valid_bound = int((train_ratio + valid_ratio) * len(image_files_shuffled))

# 将图片和标签复制到对应的目录当中
for i, (image_file, label_file) in enumerate(zip(image_files_shuffled, label_files_shuffled)):
    if i < train_bound:
        shutil.copy(os.path.join(root_dir, image_dir, image_file),
                    os.path.join(split_dir, 'train/images', image_file))
        shutil.copy(os.path.join(root_dir, label_dir, label_file),
                    os.path.join(split_dir, 'train/labels', label_file))
    elif i < valid_bound:
        shutil.copy(os.path.join(root_dir, image_dir, image_file),
                    os.path.join(split_dir, 'valid/images', image_file))
        shutil.copy(os.path.join(root_dir, label_dir, label_file),
                    os.path.join(split_dir, 'valid/labels', label_file))
    else:
        shutil.copy(os.path.join(root_dir, image_dir, image_file),
                    os.path.join(split_dir, 'test/images', image_file))
        shutil.copy(os.path.join(root_dir, label_dir, label_file),
                    os.path.join(split_dir, 'test/labels', label_file))

运行结果如下图所示:

在这里插入图片描述
至此,数据集划分完成。



1.3 在 YOLOv8 中配置数据集

在 PyCharm 中打开 YOLOv8 项目。如果你还没有部署好,那么可以参考这篇博客:

  • YOLOv8 | Windows 系统下从零开始搭建 YOLOv8 项目环境

在 /ultralytics 目录下新建 datasets 文件夹,再将划分好的数据集 road 复制粘贴过来:

在这里插入图片描述
除此之外,我们还需要新建一个 .yaml 文件来告诉 YOLOv8 数据集的信息:

在这里插入图片描述
需要在 .yaml 文件中配置如下信息,请注意:

  • 将具体内容替换为自己数据集的绝对路径、类别个数、类别名称;
  • 类别的编号必须从 0 开始,而不能从 1 开始,否则训练时会报错。
# road
train: D:\MyDocuments\Project\ultralytics-8.1.0\ultralytics\datasets\road\train
test: D:\MyDocuments\Project\ultralytics-8.1.0\ultralytics\datasets\road\test
val: D:\MyDocuments\Project\ultralytics-8.1.0\ultralytics\datasets\road\valid

# number of classes
nc: 8

# names of classes
names:
  0: D00
  1: D01
  2: D10
  3: D11
  4: D20
  5: D40
  6: D43
  7: D44


2 训练 YOLOv8 模型

2.1 模型训练代码

在与 /ultralytics 同级的目录中创建 train.py 用于训练模型:

from ultralytics import YOLO

if __name__ == '__main__':
    # # 模型训练
    # # 方法1:直接使用预训练模型创建模型
    # model = YOLO('yolov8n.pt')
    # model.train(**{'cfg': 'ultralytics/cfg/exp1.yaml',
    #                'data': 'dataset/data.yaml'})

    # 方法2:使用yaml配置文件创建模型,并导入预训练权重
    model = YOLO('ultralytics/cfg/models/v8/yolov8.yaml')
    model.train(cfg="ultralytics/cfg/default.yaml",
                data="ultralytics/datasets/road.yaml",
                epochs=200, batch=2, workers=2)

    # # 模型验证
    # model = YOLO('runs/detect/yolov8n_exp/weights/best.pt')
    # model.val(**{'data': 'dataset/data.yaml'})
    #
    # # 模型推理
    # model = YOLO('runs/detect/yolov8n_exp/weights/best.pt')
    # model.predict(source='dataset/images/test', **{'save': True})

在需要训练模型时,直接运行上述代码即可。



2.2 开启 TensorBoard

在开始模型训练时,可以看到 PyCharm 的运行中输出:

TensorBoard:
Start with 'tensorboard --logdir runs\detect\train3', view at http://localhost:6006/

但点击打开相应的网页却显示:

在这里插入图片描述
这是因为我们没有启动 TensorBoard!

为解决这一问题,我们需要先暂停当前的训练,接着在 PyCharm 的终端中输入:

tensorboard --logdir=D:\MyDocuments\Project\ultralytics-8.1.0\runs\detect\train3

然后重新开始训练,即可在相应的网页中查看训练过程。

注意:命令中写的是我的电脑中 runs\detect\train3 的路径,请你替换成自己的路径。



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

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

相关文章

Java设计模式 —— 【结构型模式】外观模式详解

文章目录 概述结构案例实现优缺点 概述 外观模式又名门面模式&#xff0c;是一种通过为多个复杂的子系统提供一个一致的接口&#xff0c;而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口&#xff0c;外部应用程序不用关心内部子系统的具体的细节&#xff0c;这…

可编辑99PPT | 智能工厂整体规划方案及实施细部方案

荐言分享&#xff1a;智能工厂是利用物联网、大数据、人工智能等先进技术&#xff0c;实现生产过程自动化、智能化和柔性化的现代工厂。本整体规划方案旨在通过整合信息技术、自动化技术、人工智能技术和物联网技术&#xff0c;构建一个高效、灵活、绿色、可持续的生产环境&…

Allegro17.4创建异形焊盘速通

Allegro17.4创建异形焊盘速通 打开Padstack Editor 17.4&#xff0c;新建焊盘&#xff0c;以标贴焊盘为例: 该标贴焊盘是在底面&#xff0c;选择END LAYRE &#xff0c;选择 Shape symbol Geometry&#xff0c;Shape symbol选择框右边有选择键&#xff0c;跳到Library Shape S…

多行为级联24|多行为推荐的超图增强级联图卷积网络

挂到arxiv上的&#xff0c;多行为级联超图加对比学习,超图是针对单个行为的&#xff0c;而不是针对多个行为的。参考的类似工作是CRGCN加MBSSL。这两篇我都做了论文阅读&#xff0c;&#xff08;CRGCN正在路上&#xff0c;MBSSL是我的第一篇论文阅读帖子&#xff09;推荐系统论…

利用.NET Upgrade Assitant对项目进行升级

本教程演示如何把WPF程序从 <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>升级到<TargetFramework>net8.0-windows</TargetFramework>. 下载并安装.NET Upgrade Assistant - Visual Studio Marketplace Supported .NET upgrades: .NET Frame…

Vue2四、 scoped样式冲突,data是一个函数,组件通信-父传子-子传父-非父子

组件通信 1. 父组件通过 props 将数据传递给子组件 2. 子组件利用 $emit 通知父组件修改更新 父--->子 子--->父

第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ

Q1、统计符合条件长度为3的子数组数目 1、题目描述 给你一个整数数组 nums &#xff0c;请你返回长度为 3 的子数组&#xff0c;满足第一个数和第三个数的和恰好为第二个数的一半。 子数组 指的是一个数组中连续 非空 的元素序列。 2、解题思路 我们需要在给定的数组 nums…

PSDK的编译与ROS包封装

本文档讲述在NIVIDIA开发板上使用大疆提供的Payload SDK获取无人机实时GPS信息的方法&#xff0c;以及基于Payload SDK发布ROS GPS话题信息的方法。 文章目录 0 实现目标1 Payload SDK1.1 PSDK 源码的编译1.2 PSDK 的使用 2 遥测数据的读取2.1 示例代码结构2.2 读取机载GPS信息…

铝电解电容使用寿命

铝电解电容寿命问题 铝电解电容为什么会失效&#xff1f;铝电解电容失效与那些因素有关&#xff1f;电解电容寿命如何计算&#xff1f; 1铝电解电容为什么会失效&#xff1f; 电容都是由两个导电板并排放到一起就构成了。正极是铝&#xff08;阳极箔&#xff09;&#xff0c;…

用Python PySide6 复刻了两软件UI 做下练习

图样 1 代码 1&#xff1a; # -*- coding: utf-8 -*-import sys from PySide6.QtCore import (QCoreApplication, QMetaObject, QRect, QDate) from PySide6.QtGui import QIcon, QPixmap, QColor from PySide6.QtWidgets import (QApplication, QDialog, QLineEdit, QPushBut…

安装MongoDB,环境配置

官网下载地址&#xff1a;MongoDB Shell Download | MongoDB 选择版本 安装 下载完成双击打开 点击mongodb-windows-x86_64-8.0.0-signed 选择安装地址 检查安装地址 安装成功 二.配置MongoDB数据库环境 1.找到安装好MongoDB的bin路径 复制bin路径 打开此电脑 -> 打开高级…

Spring学习(一)——Sping-XML

一、Spring的概述 (一)什么是Spring? Spring是针对bean对象的生命周期进行管理的轻量级容器。提供了功能强大IOC、AOP及Web MVC等功能。Spring框架主要由七部分组成&#xff1a;分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 S…

重温设计模式--职责链模式

文章目录 职责链模式的详细介绍C 代码示例C示例代码2 职责链模式的详细介绍 定义与概念 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它旨在将请求的发送者和多个接收者解耦&#xff0c;让多个对象都有机会处理请求&a…

easegen将教材批量生成可控ppt课件方案设计

之前客户提出过一个需求&#xff0c;就是希望可以将一本教材&#xff0c;快速的转换为教学ppt&#xff0c;虽然通过人工程序脚本的方式&#xff0c;已经实现了该功能&#xff0c;但是因为没有做到通用&#xff0c;每次都需要修改脚本&#xff0c;无法让客户自行完成所有流程&am…

高考志愿填报:如何制定合理的志愿梯度?

高考志愿填报中常见的避雷行为&#xff0c;深入分析了专业选择、招生政策了解、学校选择、备选方案准备以及防诈骗等方面的关键问题&#xff0c;并提出了针对性的建议与策略。旨在为考生和家长提供实用的指导&#xff0c;助力考生科学合理地填报高考志愿&#xff0c;避免陷入各…

如何查看vivado项目所使用的版本

在我们提供的各类教程中vivado使用的版本都不同&#xff0c;而使用不同版本的vivado打开项目时可能会产生一些其它错误&#xff0c;所有最好使用对应的vivado版本打开&#xff0c;本例主要演示如何查看项目所示使用的vivado版本。 如下图所示&#xff0c;为vivado2023.1版本创建…

ue5 pcg(程序内容生成)真的简单方便,就5个节点

总结&#xff1a; 前情提示 鼠标单击右键平移节点 1.编辑-》插件-》procedural->勾选两个插件 2.右键-》pcg图表-》拖拽进入场景 3.先看点point 右键-》调试(快捷键d)->右侧设置粒子数 3.1调整粒子数 可以在右侧输入框&#xff0c;使用加减乘除 4.1 表面采样器 …

光谱相机在农业的应用

一、作物生长监测1、营养状况评估 原理&#xff1a;不同的营养元素在植物体内的含量变化会导致植物叶片或其他组织的光谱反射率特性发生改变。例如&#xff0c;氮元素是植物叶绿素的重要组成部分&#xff0c;植物缺氮时&#xff0c;叶绿素含量下降&#xff0c;其在可见光波段&a…

基于Springboot的数字科技风险报告管理系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…

14,攻防世界Web_php_unserialize

进入场景 看见代码&#xff0c;解析一下 这段PHP代码定义了一个名为Demo的类&#xff0c;并演示了如何通过URL参数进行反序列化和文件高亮显示的功能&#xff0c;同时也包含了一些安全措施以防止对象注入攻击。下面是对这段代码的逐行解释&#xff1a; 1.<php 开始PHP代码…