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.mzph.cn/news/835122.shtml

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

相关文章

计算图与自动微分

计算图与自动微分 一、自动梯度计算1.1 数值微分(Numerical Differentiation)1.2 符号微分(Symbolic Differentiation)1.3 自动微分(Automatic Differentiation,AD)1.3.1 计算图1.3.2 正向传播1…

Java Stream

1. Stream API概述 Java 8 Stream是Java 8中引入的一个新的API,用于处理集合和数组等数据结构的元素。它允许您在数据集上进行功能性操作,例如过滤、映射、排序等,而不需要编写循环或迭代器等底层代码。 Java 8 Stream与集合不同,…

动态表名 的使用方法

动态表名插件的底层是 拦截器 1&#xff0c;创建一个拦截器 Configuration public class MybatisConfiguration {Beanpublic DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor() {// 准备一个Map&#xff0c;用于存储TableNameHandlerMap<String, Table…

MySQL索引(聚簇索引、非聚簇索引)

了解MySQL索引详细&#xff0c;本文只做整理归纳&#xff1a;https://blog.csdn.net/wangfeijiu/article/details/113409719 概念 索引是对数据库表中一列或多列的值进行排序的一种结构&#xff0c;使用索引可快速访问数据库表中的特定信息。 索引分类 主键索引&#xff1a…

Conda安装rasterio报错

Conda安装rasterio报错 文章目录 Conda安装rasterio报错问题解决参考 问题 在conda环境中安装rasterio包之后&#xff0c;本来可以正常运行的&#xff0c;但是之后又重新安装了一个gdal&#xff0c;导致原来的引用rasterio的包的程序不可正常运行了 conda install rasterio c…

基于Springboot的民航网上订票系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的民航网上订票系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

[附源码]石器时代_恐龙宝贝内购版_三网H5手游_带GM工具

石器时代之恐龙宝贝内购版_三网H5经典怀旧Q萌全网通手游_Linux服务端源码_视频架设教程_GM多功能授权后台_CDK授权后台 本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff0…

Ftp笑脸漏洞(VSFTPD 2.3.4)复现(后门漏洞)

Ftp笑脸漏洞&#xff08;VSFTPD 2.3.4&#xff09;复现&#xff08;后门漏洞&#xff09; 一、原理二、复现准备三、漏洞复现四、Metasploit利用脚本复现 一、原理 vsftpd 是“ very secure FTP daemon ”的缩写&#xff0c;安全性是它的一个最大的特点。 vsftpd是一个 UNIX 类…

数学:人工智能领域的基石与灵魂

在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到了我们生活的方方面面&#xff0c;从智能家居、智能医疗到自动驾驶、智能客服&#xff0c;AI无处不在。然而&#xff0c;当我们赞叹于AI的神奇时&#xff0c;却往往忽视了其背后的推动力——数学…

Go PDF文件操作

目录 介绍 安装 gofpdf API 代码示例 结果展示 介绍 gofpdf 是一个在 Go 语言中用于生成 PDF 文档的库。 安装 gofpdf 首先&#xff0c;你需要安装 gofpdf 库。你可以使用 go get 命令来安装它&#xff1a; go get github.com/jung-kurt/gofpdf API 功能 函数名参数解释示…

车载测试系列:自动驾驶中间件SOME/IP

一、以太网引入汽车 2004年&#xff0c;宝马汽车的OBD诊断口采用的是高速CAN总线&#xff0c;速率为500kbit/s&#xff0c;除去CAN协议本身的开销&#xff0c;通过OBD口升级控制器的净升级速度降到200kbit/s。预计到2008年&#xff0c;软件更新的数据量会达到1GB&#xff0c;按…

串口初始化自己独立的见解--第九天

1.SM0,SM1 我们一般用 8位UART&#xff0c;波特率可变 &#xff08;方式1的工作方式&#xff09; SCON &#xff1a;SM2 一般不用&#xff0c;SM0 0 ,SM1 1 PCON : 有两位 我们不动它&#xff0c;不加速&#xff0c;初始值 TMOD&#xff1a;8位自动重装定时器&#xff0…

如何自动(定时/间隔/重复)执行 同步文件、备份打包加密压缩文件

参考下列两个教程结合使用即可&#xff1a; 快捷自由定时重启、注销、关机 如何从多个文件夹内转移全部文件&#xff08;忽略文件夹的结构&#xff09;&#xff08;进行复制&#xff09;&#xff08;再打包&#xff09; 就是先设定好 勾选对 来源路径’Zip打包&#xff0c;并…

QT作业5

1、聊天室 服务器端 //头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> #include <QTcpSocket> #include <QList> #include <QListWidget> #include <QMessageBox> #include <QDebug> #includ…

渗透之sql注入----二次注入

目录 二次注入的原理&#xff1a; 实战&#xff1a; 第一步&#xff1a;找注入点 找漏洞&#xff1a; 注入大概过程&#xff1a; 第二步&#xff1a;开始注入 二次注入的原理&#xff1a; 二次注入是由于对用户输入的数据过滤不严谨&#xff0c;导致存在异常的数据被出入…

通俗的理解网关的概念的用途(三):你的数据包是如何到达下一层的

其实&#xff0c;这一章我写不好&#xff0c;因为这其中会涉及到一些计算和一些广播等概念&#xff0c;本人不善于此项。在此略述&#xff0c;可以参考。 每台设备的不同连接在获得有效的IP地址后&#xff0c;会根据IP地址的规则和掩码的规则&#xff0c;在操作系统和交换机&a…

暴力数据结构之栈与队列(队列详解)

1.队列的定义 队列是一种特殊的线性表&#xff0c;它遵循先进先出&#xff08;FIFO&#xff09;的原则。在队列中&#xff0c;只允许在表的一端进行插入操作&#xff08;队尾&#xff09;&#xff0c;而在另一端进行删除操作&#xff08;队头&#xff09;。这种数据结构确保了最…

基于Springboot的微乐校园管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的微乐校园管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

Java设计模式 _结构型模式_外观模式

一、外观模式 1、外观模式 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型模式。主要特点为隐藏系统的复杂性&#xff0c;并向客户端提供了一个客户端可以访问系统的接口。这有助于降低系统的复杂性&#xff0c;提高可维护性。当客户端与多个子系统之间存在大量…