当前位置: 首页 > news >正文

【Python快速入门和实践013】Python常用脚本-目标检测之按照类别数量划分数据集

一、功能介绍

        这段代码实现了从给定的图像和标签文件夹中分割数据集为训练集、验证集和测试集的功能。以下是代码功能的总结:

  1. 创建目标文件夹结构

    • 在指定的根目录(dataset_root)下创建imageslabels两个文件夹。
    • 在这两个文件夹下分别创建trainvaltest三个子文件夹,用于存放不同阶段的数据。
  2. 统计类别数量

    • 遍历标签文件夹中的所有文本文件,统计每个类别在所有标签文件中出现的总次数。
  3. 计算分割比例

    • 根据给定的比例(默认为训练集80%,验证集10%,测试集10%),计算每个类别在训练集、验证集和测试集中应该有的数量。
  4. 随机分配数据

    • 遍历图像文件夹中的所有图片。
    • 对于每个图片,检查其对应的标签文件是否存在。
    • 读取标签文件,提取其中的类别信息。
    • 根据随机数决定图片属于训练集、验证集还是测试集。
    • 将图片和对应的标签文件复制到相应的文件夹中,同时更新类别数量记录。
  5. 最终结果

    • 数据集按照指定的比例被划分为训练集、验证集和测试集。
    • 每个类别在各个数据集中的分布尽量保持均衡。

二、代码

import os
import random
import shutildef split_dataset(image_folder, label_folder, train_ratio=0.8, val_ratio=0.1, test_ratio=0.1):"""将图像和标签文件按指定比例分割成训练集、验证集和测试集。参数:image_folder (str): 图像文件夹路径。label_folder (str): 标签文件夹路径。train_ratio (float): 训练集所占比例,默认为0.8。val_ratio (float): 验证集所占比例,默认为0.1。test_ratio (float): 测试集所占比例,默认为0.1。"""# 创建目标文件夹dataset_root = r'E:\pythonProject\pythonProject\after_neu'os.makedirs(dataset_root, exist_ok=True)# 创建images和labels文件夹images_folder = os.path.join(dataset_root, 'images')labels_folder = os.path.join(dataset_root, 'labels')os.makedirs(images_folder, exist_ok=True)os.makedirs(labels_folder, exist_ok=True)# 创建train、val和test子文件夹for split in ['train', 'val', 'test']:os.makedirs(os.path.join(images_folder, split), exist_ok=True)os.makedirs(os.path.join(labels_folder, split), exist_ok=True)# 统计每个类别的图片数量category_counts = {}for filename in os.listdir(label_folder):label_path = os.path.join(label_folder, filename)with open(label_path, 'r') as label_file:lines = label_file.readlines()categories = [line.split()[0] for line in lines]for category in categories:category_counts[category] = category_counts.get(category, 0) + 1# 计算每个类别在训练集、验证集和测试集中的数量train_category_counts = {}val_category_counts = {}test_category_counts = {}for category, count in category_counts.items():train_count = int(count * train_ratio)val_count = int(count * val_ratio)test_count = count - train_count - val_counttrain_category_counts[category] = train_countval_category_counts[category] = val_counttest_category_counts[category] = test_count# 遍历图片文件夹for filename in os.listdir(image_folder):image_path = os.path.join(image_folder, filename)label_path = os.path.join(label_folder, os.path.splitext(filename)[0] + '.txt')# 确保标注文件存在if not os.path.exists(label_path):continue# 读取标注文件获取类别信息with open(label_path, 'r') as label_file:lines = label_file.readlines()categories = [line.split()[0] for line in lines]# 确定将图片放入的集合rand = random.random()if rand < train_ratio:destination_folder = 'train'category_counts = train_category_countselif rand < train_ratio + val_ratio:destination_folder = 'val'category_counts = val_category_countselse:destination_folder = 'test'category_counts = test_category_counts# 移动图片和标注文件到目标文件夹for category in categories:category_folder_images = os.path.join(images_folder, destination_folder)category_folder_labels = os.path.join(labels_folder, destination_folder)os.makedirs(category_folder_images, exist_ok=True)os.makedirs(category_folder_labels, exist_ok=True)if category_counts[category] > 0:shutil.copy(image_path, os.path.join(category_folder_images, filename))shutil.copy(label_path, os.path.join(category_folder_labels, os.path.splitext(filename)[0] + '.txt'))category_counts[category] -= 1# 图片文件夹路径
image_folder = r'E:\pythonProject\pythonProject\NEU-DET\images'# 标注文件夹路径
label_folder = r'E:\pythonProject\pythonProject\NEU-DET\txt'# 调用函数进行数据集分割
split_dataset(image_folder, label_folder)

        这个数据集划分代码相比与其他的不是随机划分,考虑到每个类别的图片样张可能不均衡,所以按照类别去划分数据集。需要先把xml转成yolo的txt格式,然后指定图片、txt标签、保存文件夹路径即可。在NEU-DET数据集上运行结果如下:

相关文章:

【Python快速入门和实践013】Python常用脚本-目标检测之按照类别数量划分数据集

一、功能介绍 这段代码实现了从给定的图像和标签文件夹中分割数据集为训练集、验证集和测试集的功能。以下是代码功能的总结&#xff1a; 创建目标文件夹结构&#xff1a; 在指定的根目录&#xff08;dataset_root&#xff09;下创建images和labels两个文件夹。在这两个文件夹下…...

C++ Primer 总结索引 | 第十八章:用于大型程序的工具

1、大规模应用程序的特殊要求包括&#xff1a; 在独立开发的子系统之间 协同处理错误的能力使用各种库&#xff08;可能包含独立开发的库&#xff09;进行 协同开发的能力对比较复杂的应用 概念建模的能力 对应 异常处理、命名空间和多重继承 1、异常处理 1、异常处理机制 …...

Python实现GAN(生成对抗网络)图像修复算法

目录 1. GAN简介与图像修复2. PyTorch和CUDA简介3. 数据加载与预处理3.1 安装依赖3.2 数据加载3.3 数据遮挡4. 构建GAN图像修复模型4.1 生成器4.2 判别器5. 训练GAN模型5.1 损失函数与优化器5.2 训练循环6. 测7. 实现GUI进行图像修复8. 总结与扩展扩展方向:1. GAN简介与图像修…...

java语言中的websocket

你好&#xff01;我是TensGPT&#xff0c;一个由TensGPT团队开发的AI助手。我可以帮助你了解和使用Java语言中的WebSocket。如果你有任何问题或需要示例代码&#xff0c;请告诉我。 ### 什么是WebSocket&#xff1f; WebSocket是一种在单个TCP连接上进行全双工通信的协议。它被…...

ASP.NET在线交流论坛管理系统

ASP.NET在线交流论坛管理系统 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql server数据库 用户功能有个人信息管理 帖了信息管理 意见反馈信息管理 点赞管理 收藏管理 后台管理员可以进行用户管理 …...

【Kubernetes】身份认证与鉴权

一&#xff0c;认证 所有 Kubernetes 集群有两类用户&#xff1a;由Kubernetes管理的ServiceAccounts(服务账户)和(Users Accounts)普通账户。 两种账户的区别&#xff1a; 普通帐户是针对(人)用户的&#xff0c;服务账户针对Pod进程普通帐户是全局性。在集群所有namespaces…...

数据集与数据库:有什么区别?

数据集和数据库是我们在处理数据时经常听到的两个常用词。虽然它们听起来很相似&#xff0c;但它们具有不同的特征并用于不同的用途。本文深入探讨数据集和数据库之间的主要区别&#xff0c;探索了它们的结构、数据类型和各种其他功能&#xff0c;以帮助您做出明智的决定&#…...

BurpSuite

如果只能用一个Web渗透工具&#xff0c;我选BurpSuite。 Web应用程序&#xff08;Web Application&#xff09; 不同于传统的静态网站所有程序的特点是接收、处理用户输入并返回结果服务器端是个程序&#xff0c;需要程序代码实现业务功能&#xff08;java、php、asp.nse&…...

NetApp数据恢复—NetApp存储误删除文件如何恢复数据?

NetApp数据恢复环境&故障&#xff1a; 某公司一台NetApp存储&#xff0c;该存储中有24块磁盘。 工作人员误删除了NetApp存储中一个文件夹&#xff0c;文件夹中有非常重要的数据。 数据恢复工程师在现场对该存储进行了初检。虽然这个文件夹被删除很长时间&#xff0c;但是根…...

基于springboot的医药管理系统

TOC springboot194基于springboot的医药管理系统 绪论 1.1 选题背景 当人们发现随着生产规模的不断扩大&#xff0c;人为计算方面才是一个巨大的短板&#xff0c;所以发明了各种计算设备&#xff0c;从结绳记事&#xff0c;到算筹&#xff0c;以及算盘&#xff0c;到如今的…...

Android中的EventBus的用法

1. EventBus简介 EventBus是一个优化了的事件发布/订阅模式实现的库&#xff0c;常用于Android程序组件间的通信。它可以简化不同组件之间的通信工作&#xff0c;避免复杂和耦合的依赖关系。EventBus通过事件驱动来降低代码耦合度&#xff0c;提高开发效率和代码清晰性。 2. …...

梧桐数据库(WuTongDB):数据库在数据处理中是如何利用缓存机制的

数据库在数据处理中利用缓存机制主要是为了提高数据访问速度和系统性能。缓存机制通过将频繁访问的数据存储在内存中&#xff0c;减少了对磁盘I/O操作的需求&#xff0c;从而提高了数据查询的效率。以下是数据库利用缓存机制的一些主要方式&#xff1a; 1. 查询缓存&#xff0…...

C语言-数据类型

在x64编译器平台下&#xff0c;C语言数据类型的取值范围主要取决于数据类型的大小&#xff08;即字节数&#xff09;以及它们是有符号的还是无符号的。以下是根据常见实现总结的x64平台下C语言数据类型的取值范围&#xff1a; 整数类型 浮点类型 指针类型 在x64编译器平台下…...

左值引用、右值引用、移动构造

1、为啥使用引用&#xff1f; // An highlighted block void function(string str) {... ... }看上面这段代码&#xff0c;如果不采用引用的方法&#xff0c;那么在函数被调用的时候&#xff0c;编译器会有一个参数赋值的过程&#xff0c;这就导致了内存和效率的浪费。 // An…...

tekton通过ceph挂载node_modules的时候报错failed to execute command: copying dir: symlink

分析&#xff1a; 如果ceph的mountPath和workingDir路径一致的话&#xff0c;就会报错。 解决&#xff1a;node_modules挂载到/workspace下&#xff0c;workingDir的代码mv到/workspace下进行构建。...

Xil_DCacheFlushRange的用法

概述&#xff1a; 当使用Zynq的PS (Processing System) 与PL (Programmable Logic) 进行通信时&#xff0c;特别是涉及到高速数据传输时&#xff0c;可能会遇到缓存一致性问题。这是因为处理器系统通常具有缓存机制来加快对常用数据的访问速度&#xff0c;但在某些情况下&…...

k8s使用subpathexpr和hostpath分pod名字持久化日志

在k8s中&#xff0c;服务日志除了标准输出&#xff0c;还有写入日志文件&#xff0c;若要对这些日志文件进行持久化存储&#xff0c;无论是通过网络文件存储还是hostpath&#xff0c;都会面临一个问题&#xff0c;多个pod会往同一个存储目录的同一个文件进行写入&#xff0c;导…...

FChen的408学习日记--三次握手和四次握手

一、三次握手 在建立连接的过程中&#xff0c;首先SYN1&#xff0c;随机发送sqex。服务器接受后要反过来对客户端发送连接请求&#xff0c;SYN1&#xff0c;随机发送sqey&#xff0c;ackx1。然后客户端还要发送连接确认报文&#xff0c;原因如下 例题&#xff1a; 二、四次…...

Unity技巧:轻松实现鼠标悬停文本时的动态变色效果

文章目录 前言一、Text二、TMP_Text二、颜色转换总结 前言 在游戏或应用中&#xff0c;给用户的界面添加一些小的互动效果能让它们更加吸引人。比如&#xff0c;当策划要求你这样做的时候 &#xff0c;当用户将鼠标悬停在文字上时&#xff0c;文字颜色改变&#xff0c;这样的效…...

谷歌账号活动异常,或者申诉回来以后需要手机验证的原因,以及验证手机号的错误操作和正确操作

有一些朋友在使用谷歌账号的时候&#xff0c;会遇到无法直接登录的情况&#xff0c;输入用户名、密码以后&#xff0c;提示说账号活动异常&#xff0c;需要验证手机号。 通常有以下两种情形和界面&#xff0c;出现这种情形的原因分别如下。 一、谷歌账号登录需要输入手机号码…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...