深度学习中的自动化标签转换:对数据集所有标签做映射转换
在机器学习中,特别是在涉及图像识别或分类的项目中,标签数据的组织和准确性至关重要。本文探讨了一个旨在高效转换标签数据的 Python 脚本。该脚本在需要更新或更改类标签的场景中特别有用,这是正在进行的机器学习项目中的常见任务。我们将逐步介绍如何使用此脚本并了解其功能。
使用脚本的分步指南
初始设置:
脚本首先导入必要的模块:**os
用于文件操作、shutil
用于高级文件操作、zipfile
用于处理 zip 文件以及datetime
**用于时间戳。
定义路径:
您需要指定标签目录的路径。然后,该脚本会自动在同一目录中创建备份 zip 文件路径,并带有时间戳以确保唯一性。
创建备份:
在进行任何更改之前,该脚本会将现有标签文件备份到 zip 存档中。这就像在进行任何更改之前拍摄数据快照一样,确保您有后备选项。
标签转换:
核心功能涉及更新标签文件中的类索引。您定义当前和新的类名称,脚本将它们映射到它们各自的索引。此过程类似于分类系统更改时更新图书馆中的目录。
应用更改:
脚本迭代每个标签文件,应用映射来更新类索引。这就像检查文件柜并更新每个文件夹上的标签。
输出和验证:
提供更改的摘要,包括修改的文件数量以及修改前后最后一个文件内容的比较。此步骤对于验证更改是否符合预期至关重要。
import os
import shutil
import zipfile
from datetime import datetime# 定义标签目录的路径
# 用实际的标签目录路径替换
labels_directory = r"D:\Desktop\20231222\train\labels_backup_20231229152659"# 定义备份 zip 文件路径为原目录的同级目录,带有日期
timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
backup_zip_path = os.path.join(os.path.dirname(labels_directory), f"labels_backup_{timestamp}.zip"
)# 创建一个备份 zip 文件
with zipfile.ZipFile(backup_zip_path, "w") as backup_zip:for foldername, subfolders, filenames in os.walk(labels_directory):for filename in filenames:file_path = os.path.join(foldername, filename)backup_zip.write(file_path, os.path.relpath(file_path, labels_directory))# 定义当前(旧)类别名称和新类别名称
current_names = ["blue", "green", "red", "yellow"]
new_names = ["red", "yellow", "green", "blue"]# 创建一个从旧类别索引到新类别索引的映射,基于名称
name_to_index = {name: index for index, name in enumerate(current_names)}
index_mapping = {name_to_index[name]: new_names.index(name) for name in current_names}# 更新标签文件中的类别索引的函数
def update_class_index(file_path, mapping):with open(file_path, "r") as file:lines = file.readlines()old_content = "".join(lines)new_lines = []for line in lines:parts = line.strip().split()if parts:class_index = int(parts[0])# 使用提供的映射映射类别索引parts[0] = str(mapping.get(class_index, class_index))new_lines.append(" ".join(parts))new_content = "\n".join(new_lines)with open(file_path, "w") as file:file.write(new_content)return old_content, new_content# 记录修改的文件名称和数量
modified_file_names = []
modified_file_count = 0# 找到最后一个修改的文件和内容
last_file_name = None
last_file_old_content = None
last_file_new_content = None# 记录被忽略的文件后缀
ignored_file_extensions = set()# 记录原本的文件数量
original_file_count = 0# 将映射应用于标签目录中的所有 .txt 文件
for filename in sorted(os.listdir(labels_directory)):file_path = os.path.join(labels_directory, filename)# 过滤非文本文件if not filename.endswith(".txt"):ignored_file_extensions.add(os.path.splitext(filename)[1])continueoriginal_file_count += 1old_content, new_content = update_class_index(file_path, index_mapping)modified_file_names.append(filename)modified_file_count += 1last_file_name = filenamelast_file_old_content = old_contentlast_file_new_content = new_content# 输出原本的文件数量
print(f"Original number of files: {original_file_count}")# 输出修改的文件名称和总数
print(f"Modified file names: {modified_file_names}")
print(f"Total number of files modified: {modified_file_count}")# 打印最后一个文件的修改前后内容
if last_file_name:print(f"\nLast modified file: {last_file_name}")print("Before modification:")print(last_file_old_content)print("\nAfter modification:")print(last_file_new_content)# 输出新旧类别名称和索引映射
print("\n映射结果:")
for old_index, new_name in index_mapping.items():old_name = current_names[old_index]print(f"Class '{old_name}' (old, index {old_index}) -> Class '{new_name}' (new, index {new_name})")
进一步探索:
为了加深您的理解,请考虑以下事项:
- 如何修改此脚本以处理不同的文件格式或更复杂的标签结构?
- 不正确的标签转换会产生什么影响,如何检测和纠正它们?
- 如何将该脚本集成到机器学习项目中更大的数据预处理管道中?
数据集预处理脚本专栏
1. 使用 Python进行数据集分割:简洁完美的数据集划分脚本
2. 深度学习中的自动化标签转换:对数据集所有标签做映射转换
3. 识别并处理数据集中不配对图像和标签文件
相关文章:

深度学习中的自动化标签转换:对数据集所有标签做映射转换
在机器学习中,特别是在涉及图像识别或分类的项目中,标签数据的组织和准确性至关重要。本文探讨了一个旨在高效转换标签数据的 Python 脚本。该脚本在需要更新或更改类标签的场景中特别有用,这是正在进行的机器学习项目中的常见任务。我们将逐…...

c语言-函数指针
目录 前言一、函数指针1.1 函数指针定义1.2 函数指针调用函数1.3 函数指针代码分析 总结 前言 本篇文章介绍c语言中的函数指针以及函数指针的应用。 一、函数指针 函数指针:指向函数的指针。 函数在编译时分配地址。 &函数名 和 函数名代表的意义相同…...

conda
一、安装 推荐清华源 https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/?CN&OD选择版本 Miniconda3-py39_4.12.0-MacOSX-arm64.pkg测试命令 conda help二、更换仓库 配置加速 https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/没有 .condarc 文件则执行…...
【Vue】灵魂拷问
1、说说Vue的优缺点 优点:渐进式,组件化,轻量级,虚拟dom,响应式,单页面路由,数据与视图分开缺点:单页面不利于seo,不支持IE8以下,首屏加载时间长 2、为什么…...
Scrapy 1.3.0 使用简介
scrapy 1.3.0 python 2.7 创建一个项目: Before you startscraping, you will have to set up a new Scrapy project. Enter a directory whereyou’d like to store your code and run: scrapy startproject tutorial 然后就会得到一系列文件: 第一个爬…...

单机+内部备份_全备案例
此场景为单机数据库节点内部备份,方便部署和操作,但备份REPO与数据库实例处于同一个物理主机,冗余度较低。 前期准备 配置ksql免密登录(必须) 在Kingbase数据库运行维护中,经常用到ksql工具登录数据库,本地免密登录…...

【kettle】pdi/data-integration 打开ktr文件报错“Unable to load step info from XML“
一、报错内容: Unable to load step info from XML step nodeorg.pentaho.di.core.exception.KettleXMLException: Unable to load step info from XMLat org.pentaho.commons.launcher.Launcher.main (Launcher.java:92)at java.lang.reflect.Method.invoke (Met…...
cocos creator人开发小游戏免费素材资源
1、首先熟悉官方的手册和api文档,文档还是比较详细,游戏的方方面面都涉及到了 官方手册: http://docs.cocos.com/creator/manual/zh/官方api文档: http://docs.cocos.com/creator/api/zh/官方论坛: https://forum.coco…...
除了sd webui,compfy还有一个sd UI
GitHub - VoltaML/voltaML-fast-stable-diffusion: Beautiful and Easy to use Stable Diffusion WebUI...
c++属于同一个类的不同对象之间可相互访问private和protected成员
先看一个代码例子: #include <stdio.h>class A { private:char* name;void printA_Name() const {printf(name);} public:A(char* name) {this->name name;}void printA_Name(const A& a) {printf(a.name);}void printA_Name2(const A& a) {a.pr…...

QT/C++ 远程数据采集上位机+服务器
一、项目介绍: 远程数据采集与传输 课题要求:编写个基于TCP的网络数据获取与传输的应用程序; 该程序具备以下功能: 1)本地端程序够通过串口与下位机(单片机)进行通信,实现数据采集任务 2)本地端程序能将所获取下位机数据进行保存(如csv文本格式等); 3…...
算法每日一题:保龄球游戏的获胜者
大家好,我是星恒 今天的每一一题是一道简单题目,但是没能秒掉,原因就是题意理解不到位,边界问题没有判断清楚 不过这本来就是一个试错,迭代,积累经验的过程,加油加油,相信做多了&…...
Do you know about domestic CPUs
Do you know about domestic CPUs CPU指令集国产CPU CPU指令集 国产CPU 参考文献 国产CPU之4种架构和6大品牌指令集及架构一文深入了解 CPU 的型号、代际架构与微架构国产GPU芯片厂商有哪些深入GPU硬件架构及运行机制详解服务器GPU架构和基础知识...

软件设计模式 --- 类,对象和工厂模式的引入
Q1:什么是软件设计模式? A:软件设计模式,又称设计模式。它是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。综上&…...

LeetCode74二分搜索优化:二维矩阵中的高效查找策略
题目描述 力扣地址 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则&…...

三极管组成的光控开关电路原理图
什么是光控开关 光控开关/光控时控器采用先进的嵌入式微型计算机控制技术,融光控功能和普通时控器两大功能为一体的多功能高级时控器(时控开关),根据节能需要可以将光控探头(功能)与时控功能同时启用&…...
【PostgreSQL】从零开始:(四十二)系统列
PostgreSQL 中的系统列 PostgreSQL 中的系统列是一组特殊的列,用于存储关于表和视图的元数据信息。这些列是由 PostgreSQL 数据库自动创建和维护的,并且不能直接修改或删除。 每个表都有多个系统列,这些列由系统隐式定义。因此,…...

快速、准确地检测和分类病毒序列分析工具 ViralCC的介绍和详细使用方法, 附带应用脚本
介绍 viralcc是一个基因组病毒分析工具,可以用于快速、准确地检测和分类病毒序列。 github:dyxstat/ViralCC: ViralCC: leveraging metagenomic proximity-ligation to retrieve complete viral genomes (github.com) Instruction of reproducing resul…...

DNs服务学习笔记
DNS:域名系统(英文:Domain Name System)是一个域名系统,是万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。类似于生活中的11…...
获取线程池中任务执行数量
获取线程池中任务执行数量 通过线程池进行任务处理,有时我们需要知道线程池中任务的执行状态。通过ThreadPoolExecutor的相关API实时获取线程数量,排队任务数量,执行完成线程数量等信息。 实例 private static ExecutorService es new Thr…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...