YOLOv5 or YOLOv8 快速划分训练集 验证集 测试集

2023-11-13

该脚本实现了将原始数据集自动划分为yolo训练数据集排列形式

import os
import random
import shutil
"""
该脚本实现了将原始数据集自动划分为yolo训练数据集排列形式 (目录排序如下)

old_root:
    dataset
        images
        yolo_labels
        
new_root:
    dataset
        test
            images
            labels
        train
            images
            labels  
        val
            images
            labels          
"""


# 文件的递归删除(清空path文件夹下的所有文件,但不会删除空文件夹)
def del_dir(path):
    for i in os.listdir(path):
        path_file = os.path.join(path, i)

        # 如果是一个文件就删除,不然继续递归文件夹。
        if os.path.isfile(path_file):
            os.remove(path_file)

        elif os.path.isdir(path_file):
            file = os.listdir(path_file)
            if len(file) == 0:
                os.rmdir(path_file)
            else:
                del_dir(path_file)
                os.rmdir(path_file)


def remake_dir(path):
    if os.path.exists(path):
        os.mkdir(os.path.join(path, "images"))
        os.mkdir(os.path.join(path, "labels"))
    else:
        os.mkdir(path)
        os.mkdir(os.path.join(path, "images"))
        os.mkdir(os.path.join(path, "labels"))


def copy_files(old_root, new_root):

    # 保证随机可复现
    # 这保证了每次调用copy_files函数时的随机值是相同的
    random.seed(0)

    file_lists = os.listdir(old_root)

    all_files = []
    train_files = []
    val_files = []
    test_files = []

    for file in file_lists:
        all_files.append(file)

    L = len(all_files)
    train_num = int(0.8 * L)
    val_num = int(0.1 * L)
    test_num = L - train_num - val_num

    # 随机选取训练数据
    for i in range(train_num):
        temp = random.choice(all_files)
        train_files.append(temp)
        all_files.remove(temp)
    # 随机选取验证数据
    for i in range(val_num):
        temp = random.choice(all_files)
        val_files.append(temp)
        all_files.remove(temp)
    # 随机选取测试数据
    for i in range(test_num):
        temp = random.choice(all_files)
        test_files.append(temp)
        all_files.remove(temp)

    # 拷贝对应的训练集数据
    for file_name in train_files:

        if ".png" in file_name or ".jpg" in file_name:
            t_name = str("train\\images")
        else:
            t_name = str("train\\labels")

        old_file_path = os.path.join(old_root + str("\\") + file_name)
        new_file_path = os.path.join(new_root + str("\\") + t_name + str("\\") + file_name)

        shutil.copy(old_file_path, new_file_path)

    # 拷贝对应的验证集数据
    for file_name in val_files:

        if ".png" in file_name or ".jpg" in file_name:
            t_name = str("val\\images")
        else:
            t_name = str("val\\labels")

        old_file_path = os.path.join(old_root + str("\\") + file_name)
        new_file_path = os.path.join(new_root + str("\\") + t_name + str("\\") + file_name)

        shutil.copy(old_file_path, new_file_path)

    # 拷贝对应的测试集数据
    for file_name in test_files:

        if ".png" in file_name or ".jpg" in file_name:
            t_name = str("test\\images")
        else:
            t_name = str("test\\labels")

        old_file_path = os.path.join(old_root + str("\\") + file_name)
        new_file_path = os.path.join(new_root + str("\\") + t_name + str("\\") + file_name)

        shutil.copy(old_file_path, new_file_path)

    return


def main():

    old_root = r"D:\datasets\UCAS_AOD\CAR"

    new_root = r"D:\datasets\UCAS_AOD\train_yolo"

    path_list = ["train", "val", "test"]

    # 该部分循环实现了若文件夹存在则删除文件夹下的所有文件,并创建"images"和"labels"
    # 若文件夹不存在,则创建该文件,并创建子文件夹"images"和"labels"
    # 注释该部分则程序不会对文件是否存在进行判断,直接进行copy操作
    for path in path_list:
        path = os.path.join(new_root, path)
        if os.path.exists(path):
            del_dir(path)
            remake_dir(path)

        else:
            remake_dir(path)

    # 该部分实现对原始数据集的划分
    order_list = ["images", "yolo_labels"]
    for root in order_list:

        order_root = os.path.join(old_root, root)

        copy_files(order_root, new_root)


if __name__ == '__main__':
    main()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

YOLOv5 or YOLOv8 快速划分训练集 验证集 测试集 的相关文章

  • 第十二讲-讲为什么我的MySQL会“抖”一下

    为什么我的MySQL会 抖 一下 当内存数据页跟磁盘数据页内容不一致的时候 我们称这个内存页为 脏页 内存数据写入到磁盘后 内存和磁盘上的数据页的内容就一致了 称为 干净页 抖动的时候应该是在刷脏页 第一种场景是 粉板满了 记不下了 这时候
  • 用opencv2的C api 给图片画矩形框

    使用opencv 3 4 6 Ubuntu系统 步骤 安装opencv 过程可以参考 https docs opencv org master d7 d9f tutorial linux install html 编程 opencv 3 4
  • 0基础也能看懂,软件测试怎么去介绍一个项目的测试流程?

    软件测试流程及规范 一 目标 制定完整且具体的测试路线和流程 为快速 高效和高质量的软件测试提供基础流程框架 最终目标是实现软件测试规范化 标准化 二 测试流程说明 三 需求分析 需求分析由SA制定 要求细化每一个功能的细节 每一个按钮的位

随机推荐

  • 华为OD机试真题-最大报酬【2023.Q1】

    题目内容 小明每周上班都会拿到自己的工作清单 工作清单内包含n项工作 每项工作都有对应的耗时时间 单位h 和报酬 工作的总报酬为所有已完成工作的报酬之和 那么请你帮小明安排一下工作 保证小明在指定的工作时间内工作收入最大化 输入描述 输入的
  • 基于c++的包装者模式初探。

    ifndef INPUTSTREAM H define INPUTSTREAM H class Inputstream public virtual void read 0 virtual Inputstream endif ifndef
  • TensorRT学习笔记--序列化(Serialize)和反序列化(Deserialize)

    目录 前言 1 序列化和反序列化的概念 2 代码实现 2 1 序列化并保存模型 2 2 反序列化加载模型 2 3 完整代码 前言 所有代码均基于 Tensor RT 8 2 5 版本 使用的是 Python 环境 1 序列化和反序列化的概念
  • 电路交换,报文交换与分组交换

    1 电路交换 由于电路交换在通信之前要在通信双方之间建立一条被双方独占的物理通路 由通信双方之间的交换设备和链路逐段连接而成 因而有以下优缺点 优点 由于通信线路为通信双方用户专用 数据直达 所以传输数据的时延非常小 通信双方之间的物理通路
  • Java开发环境不再需要配置classpath!

    前言 之前发布了关于java开发环境配置的文章 经过与网友的交流 我了解到在jdk1 5以后 java开发环境配置的时候 确实不需要对classpath进行配置 但市面上的书籍 以及一些博客 还是老一套 继续推荐配置classpath 并且
  • Jmeter 调用python3脚本

    前言 Jmeter 调用 Jython的Jar包 虽然可以执行python代码 但是只支持python2 7及2 7以下版本的 目前使用的都是py3 0以上的版本 所以放弃这种方法 解决方法 通过jmeter的BeanShell取样器 通过
  • websocket 简介

    一 WebSocket是html5新增加的一种通信协议 目前流行的浏览器都支持这个协议 例如Chrome Safrie Firefox Opera IE等等 对该协议支持最早的应该是chrome 从chrome12就已经开始支持 随着协议草
  • Centos7 修改主机名

    简介 在CentOS中 有三种定义的主机名 静态的 static 瞬态的 transient 和灵活的 pretty 静态主机名也称为内核主机名 是系统在启动时从 etc hostname自动初始化的主机名 瞬态主机名是在系统运行时临时分配
  • Windows+Ubuntu双系统下卸载Ubuntu

    记录一下自己卸载Ubuntu的步骤 防止以后再卸载重新找教程 1 删除Ubuntu的分区 步骤1 打开 我的电脑 选择 管理 点击 磁盘管理 步骤2 确定Ubuntu系统所在的磁盘分区 我的是磁盘1的磁盘分区6 7 8 9 然后一一删除 选
  • python每日一题_Python每日一题 001

    Talk is Cheap show me the code Linus Torvalds 将你的 QQ 头像 或者微博头像 右上角加上红色的数字 类似于微信未读信息数量那种提示效果 类似于图中效果 环境准备 安装PIL模块 Windows
  • MySQL之KEY分区和LINEAR KEY分区

    KEY分区 KEY分区与HASH分区相似 当然有不同点 1 在HASH分区中 可以使用整数列或者基于列值的表达式 即PARTITION BY HASH expr 而在KEY分区中 直接基于列 PARTITION BY KEY column
  • css清除默认样式

    清除默认样式 初始化样式 清除内外边距 margin 0 padding 0 自减盒子模型 box sizing border box ul ol 清除默认圆点 list style none a 取消下划线 text decoration
  • 华南x79 主板说明书下载_主板说明书找不到 机箱连线照样秒安装

    点击上方 电脑爱好者关注我们 小伙伴们在安装 升级电脑的时候 在主板上安装各种配件应该问题不大 但是连线呢 特别是机箱上那些细碎的小接口们 即使照着说明书都要琢磨半天 如果是老主板 一下子找不到说明书怎么办 这里小编就跟大家说一些简单的办法
  • windows上 nginx 配置好了access.log路径后,但是访问日志并没有记录

    windows 上配置 nginx access log 日志 1 问题 2 解决方案 2 1 为当前文件夹配置权限 3 结果 1 问题 之前 本机上配置了 nginx access log 日志 但是 并没有 记录 当时因为太忙了 就没有
  • 【Mybatis源码分析】动态标签的底层原理,DynamicSqlSource源码分析

    DynamicSqlSource 源码分析 一 DynamicSqlSource 源码分析 DynamicContext源码分析 SqlNode源码分析 动态SQL标签 Mybatis 动态SQL标签 举例 调试 SqlNode源码分析 M
  • Ubuntu/Linux下安装DosBox配置汇编环境

    Ubuntu Linux下安装DosBox配置汇编环境 微信关注公众号 夜寒信息 致力于为每一位用户免费提供更优质技术帮助与资源供给 感谢支持 一 首先我们去DosBox官网下载DosBox 0 73 或者直接启用终端命令行输入以下代码 s
  • leveldb深度剖析-查询流程

    至此 将插入流程以及压缩流程都已介绍完毕了 本篇主要介绍查询流程 一 查询流程 首先来看一下查询接口具体实现内容 查询 param options 查询选项 param key 查询key param value 输出参数 如果找到则赋值给
  • TypeScript 基础教程,适合新手

    TypeScript 基本用法 本章介绍 TypeScript 的一些最基本的语法和用法 最全教程 https tut qzxdp cn typescript 在线工具 https tools qzxdp cn 类型声明 TypeScrip
  • 本地部署IIS服务及MQTT服务

    本地部署IIS服务及MQTT服务 概述 配置IIS 安装windows功能 配置应用程序 打开IIS服务 安装aspnetcore runtime 安装dotnet hosting 检查 添加网站 配置应用程序 配置IIS通过外部IP访问
  • YOLOv5 or YOLOv8 快速划分训练集 验证集 测试集

    该脚本实现了将原始数据集自动划分为yolo训练数据集排列形式 import os import random import shutil 该脚本实现了将原始数据集自动划分为yolo训练数据集排列形式 目录排序如下 old root data