YOLO系列笔记(十三)——数据集文件夹拆分

数据集文件夹拆分

  • 前言
  • 代码
  • 说明
    • 导入模块
    • 设置文件夹路径
    • 创建目标文件夹
    • 读取和准备图片列表
    • 打乱图片顺序
    • 计算分配比例
    • 定义和使用移动文件函数
    • 最后打印分配结果
  • 总结

前言

在学习和训练涉及YOLO等神经网络的过程中,我们通常需要对收集到的大型数据集进行合理的拆分,标准的做法是将其分为训练集(train)、测试集(test)和验证集(validation)。手动对大规模的图片集进行分类不仅耗时而且容易出错,因此我编写了一个Python脚本,旨在自动化这一繁琐的过程。该脚本能够将指定文件夹中的图片按照8:1:1的比例自动分配到train、test和validation三个文件夹中,使用的是Python的os和shutil库来处理文件操作。

PS. 如果觉得该笔记对您有用的话,可以点个小小的赞吗,或者点赞收藏关注一键三连ヾ(◍’౪`◍) ~ 谢谢!!

代码

import os
import shutil
import random

# 设置源文件夹和目标文件夹路径
source_folder = './source'
train_folder = './train'
test_folder = './test'
validation_folder = './validation'

# 如果目标文件夹不存在,则创建它们
os.makedirs(train_folder, exist_ok=True)
os.makedirs(test_folder, exist_ok=True)
os.makedirs(validation_folder, exist_ok=True)

# 读取所有图片文件
images = [f for f in os.listdir(source_folder) if f.endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp'))]

# 打乱文件顺序以随机分配
random.shuffle(images)

# 计算分配比例
total_count = len(images)
train_count = int(total_count * 0.8)
test_count = int(total_count * 0.1)
validation_count = total_count - train_count - test_count  # 保证总数正确

# 分配文件到train, test, validation文件夹
def move_files(files, destination):
    for f in files:
        shutil.move(os.path.join(source_folder, f), os.path.join(destination, f))

move_files(images[:train_count], train_folder)
move_files(images[train_count:train_count + test_count], test_folder)
move_files(images[train_count + test_count:], validation_folder)

print(f"Files distributed: {train_count} to train, {test_count} to test, {validation_count} to validation.")

说明

这个Python脚本的主要目的是将一个包含大量图片的源文件夹(source_folder)中的图片按照8:1:1的比例随机分配到三个不同的文件夹(train_folder, test_folder, validation_folder)中,用于机器学习或深度学习模型的训练、测试和验证。下面是对脚本中每个部分的详细解释:

导入模块

import os
import shutil
import random
  • os: 用于处理文件和目录,如读取文件列表、创建目录等。
  • shutil: 用于执行文件操作,如复制和移动文件。
  • random: 用于生成随机数,这里用于打乱文件列表,确保分配的随机性。

设置文件夹路径

source_folder = './source'
train_folder = './train'
test_folder = './test'
validation_folder = './validation'

这些变量定义了源文件夹和目标文件夹的路径。这些路径可以根据实际情况进行调整

创建目标文件夹

os.makedirs(train_folder, exist_ok=True)
os.makedirs(test_folder, exist_ok=True)
os.makedirs(validation_folder, exist_ok=True)

这些语句确保目标文件夹存在。如果目标文件夹不存在,os.makedirs 将创建它们。参数exist_ok=True表示如果文件夹已存在,不会抛出错误。

读取和准备图片列表

images = [f for f in os.listdir(source_folder) if f.endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp'))]

这行代码读取source_folder中所有的图片文件,并将它们存储在列表images中。列表推导用于过滤出只包含图片的文件,基于文件扩展名进行筛选。os.listdir(source_folder) 这个函数是用来列出指定目录下的所有文件和目录名的。

打乱图片顺序

random.shuffle(images)

使用random.shuffle函数随机打乱images列表中元素的顺序,这是为了确保后续分配到训练、测试和验证集的随机性。

计算分配比例

total_count = len(images)
train_count = int(total_count * 0.8)
test_count = int(total_count * 0.1)
validation_count = total_count - train_count - test_count

根据总图片数,计算出应分配到训练集、测试集和验证集的图片数量。按照8:1:1的比例,训练集占80%,测试和验证集各占10%。

定义和使用移动文件函数

def move_files(files, destination):
    for f in files:
        shutil.move(os.path.join(source_folder, f), os.path.join(destination, f))

move_files(images[:train_count], train_folder)
move_files(images[train_count:train_count + test_count], test_folder)
move_files(images[train_count + test_count:], validation_folder)
  • move_files 函数接受文件列表和目标文件夹作为参数,然后逐个将文件从源文件夹移动到指定的目标文件夹。
  • 这里使用切片操作分割images列表,根据之前计算的数量,将文件分配到相应的文件夹。

最后打印分配结果

print(f"Files distributed: {train_count} to train, {test_count} to test, {validation_count} to validation.")

在所有操作完成后,打印出每个集合中文件的数量,以确认文件已正确分配。

总结

此脚本极大地简化了将大规模图片数据集分配到训练集、测试集和验证集的过程,不仅提高了效率,还避免了手动分配时可能出现的错误。这对于快速准备机器学习和深度学习模型的训练数据是非常有用的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

武汉理工大学python123实验——流程控制结构

1.百分制成绩转换五分制#1707 n int(input())if n>90:print(A) elif n>80:print(B) elif n>70:print(C) elif n>60:print(D) else:print(E) 2.角古猜想#73963 n eval(input()) if n<0:print(ERROR) elif . in str(n):print(ERROR) else:print(n,end" …

Qt扫盲-Qt D-Bus概述

Qt D-Bus概述 一、概述二、总线三、相关概念1. 消息2. 服务名称3. 对象的路径4. 接口5. 备忘单 四、调试五、使用Qt D-Bus 适配器1. 在 D-Bus 适配器中声明槽函数1. 异步槽2. 只输入槽3. 输入输出槽4. 自动回复5. 延迟回复 一、概述 D-Bus是一种进程间通信(IPC)和远程过程调用…

Java面试题:多线程2

如何停止正在运行的线程 1,使用退出标志,使线程正常退出(run方法中循环对退出标志进行判断) 2,使用stop()方法强行终止(不推荐) 3,调用interrupt()方法中断线程 打断阻塞线程(sleep,wait,join),线程会抛出InterruptedException异常 打断正常的线程,可以根据打断状态来标记…

继承知识及扩展(C++)

1. 继承是什么&#xff1f; 继承是面向对象编程的三大特征之一&#xff0c;也是代码复用的手段之一。之前我们在很多的地方尝试函数的复用&#xff0c;而继承是为了类的复用提供了很好的方式。 &#xff08;1&#xff09;继承的代码怎么写 在一个类后面使用 &#xff1a;继承方…

知识图谱融入RAG模型:LinkedIn重塑智能客服新范式【附LeCun哈佛演讲PPT】

原文&#xff1a;Retrieval-Augmented Generation with Knowledge Graphs for Customer Service Question Answering 一、研究背景与问题 在客服领域,快速准确地匹配用户问题与历史工单,是提供优质回答的关键。传统的检索增强生成(Retrieval-Augmented Generation, RAG)方法虽…

IDEA-控制台日志过滤插件 - Grep Console

IDEA-控制台日志过滤插件 - Grep Console 当idea控制台日志较多时&#xff0c;为了方便查找关键字&#xff0c;使用Grep Console插件&#xff0c;指定控制台中关键字高亮显示 1.安装 2.使用 2.1 高亮显示 控制台中指定颜色高亮显示指定字符 效果: 重启项目后还是会高亮显示 取…

【软考高项】三十三、质量管理

一、管理基础 质量定义 国际标准&#xff1a;反映实体满足主体明确和隐含需求的能力的特性总和。 国家标准&#xff1a;一组固有特性满足要求的程度。固有特性是指在某事或某物中本来就有的&#xff0c;尤其是那种永久的可区分的特征。 ➢ 对产品来说&#xff0c;例如…

缓存菜品操作

一&#xff1a;问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大。 二&#xff1a;实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; 每个分…

k8s保持pod健康

存活探针 Kubemetes 可以通过存活探针 (liveness probe) 检查容器是否还在运行。可以为 pod 中的每个容器单独指定存活探针。如果探测失败&#xff0c;Kubemetes 将定期执行探针并重新启动容器。 Kubemetes 有以下三种探测容器的机制&#xff1a; HTTP GET 探针对容器的 IP 地…

Day61:单调栈 739. 每日温度 496.下一个更大元素 I

739. 每日温度 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 示例 1: 输…

发表博客之:gemm/threadblock/threadblock_swizzle.h 文件夹讲解,cutlass深入讲解

文章目录 [发表博客之&#xff1a;gemm/threadblock/threadblock_swizzle.h 文件夹讲解&#xff0c;cutlass深入讲解](https://cyj666.blog.csdn.net/article/details/138514145)先来看一下最简单的struct GemmIdentityThreadblockSwizzle结构体 发表博客之&#xff1a;gemm/th…

vue2 webpack-dev-server Unknown promise rejection reason

在vue.config.js中添加如下配置&#xff0c;重启项目即可 module.exports defineConfig({devServer: {client: {overlay: false,},} })参考

探索中位数快速排序算法:高效寻找数据集的中间值

在计算机科学领域&#xff0c;寻找数据集的中位数是一个常见而重要的问题。而快速排序算法作为一种高效的排序算法&#xff0c;可以被巧妙地利用来解决中位数查找的问题。本文将深入探讨中位数快速排序算法的原理、实现方法以及应用场景&#xff0c;带你领略这一寻找中间值的高…

vue 金额组件,输入提示单位:‘千’、‘万’、‘十万’...并用‘,’三个格式化

近期项目中遇到一个需求&#xff0c;金额输入框&#xff0c;输入过程中自动提示‘千’、‘万’、‘十万’、‘百万’......等单位提示&#xff0c;鼠标失去焦点后&#xff0c;并用‘,’三位隔开计数。 例如&#xff1a; 输入&#xff1a;12345.99 失去焦点&#xff1a;12,34…

Vue--》从零开始打造交互体验一流的电商平台(一)

今天开始使用 vue3 ts 搭建一个电商项目平台&#xff0c;因为文章会将项目的每处代码的书写都会讲解到&#xff0c;所以本项目会分成好几篇文章进行讲解&#xff0c;我会在最后一篇文章中会将项目代码开源到我的github上&#xff0c;大家可以自行去进行下载运行&#xff0c;希…

【Node.js工程师养成计划】之express中间件与接口规范

一、Express中间件的概念与基本应用 const express require(express)// 加一个注释&#xff0c;用以说明&#xff0c;本项目代码可以任意定制更改 const app express()const PORT process.env.PORT || 3000// // 挂载路由 // app.use(/api, router)// // 挂载统一处理服务端…

【倪亲斫经典水墨云纹仲尼式】倪诗韵亲斫古琴

【倪亲斫经典水墨云纹仲尼式】倪诗韵亲斫古琴 松透润&#xff0c;适合大曲文曲潇湘欸乃平沙&#xff0c;余韵悠长&#xff0c;手感极其舒适&#xff0c;久弹不疲。

[Linux][网络][TCP][三][超时重传][快速重传][SACK][D-SACK][滑动窗口]详细讲解

目录 1.超时重传1.什么是超时重传&#xff1f;2.超时时间是如何确定的&#xff1f; 2.快速重传3.SACK4.D-SACK1.ACK丢失2.网络延迟 5.滑动窗口0.问题抛出1.发送方的滑动窗口2.如何表示发送方的四个部分&#xff1f;3.接收方的滑动窗口4.滑动窗口的完善理解 1.超时重传 1.什么是…

C++手写协程项目(协程实现线程结构体、线程调度器定义,线程挂起函数、线程切换函数、线程恢复函数、线程结束函数、线程结束判断函数,模块测试)

协程结构体定义 之前我们使用linux下协程函数实现了线程切换&#xff0c;使用的是ucontext_t结构体&#xff0c;和基于这个结构体的四个函数。现在我们要用这些工具来实现我们自己的一个线程结构体&#xff0c;并实现线程调度和线程切换、挂起。 首先我们来实现以下线程结构体…

Splay 树简介

【Splay 树简介】 ● Treap 树解决平衡的办法是给每个结点加上一个随机的优先级&#xff0c;实现概率上的平衡。Splay 树直接用旋转调整树的形态&#xff0c;通过旋转改善树的平衡性。计算量小&#xff0c;效果好。 ● Splay 树的旋转主要分为“单旋”和“双旋”。 所谓“单旋”…
最新文章