YOLO标注文件清洗案例代码-学习篇

2024-09-06 13:04

本文主要是介绍YOLO标注文件清洗案例代码-学习篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景简介

YOLO标注文件清洗
训练一个人工智能算法需要一个庞大的数据集,这个数据集需要进行人为标注
但由于出现意外,造成部分数据丢失,使得标注文件和图片文件的文件名前缀不能一一对应
需要写一段代码将可以文件名前缀一一对应的文件保存到一个新的文件夹中,已完成数据的清洗

问题背景

待清洗的文件目录,images中是图片,labels中是txt标注文件,标注后images和labels中的文件名时相同的,现在数据丢失后,部分标注文件images和labels对不上了,
需要筛选出images和labels文件中img和txt文件名字相同的文件,
在这里插入图片描述
比对完导出的文件目录
在这里插入图片描述

代码文件如下:

#抽取的公共方法,拼接返回某个文件夹下所有的文件的路径集合
def get_info(root_from):file_full_path_list = []for root, dirs, files in os.walk(root_from):for file in files:file_full_path = os.path.join(root, file)file_full_path1 = file_full_path.split('\\')file_short_path  = os.path.join(file_full_path1[-2],file_full_path1[-1])#以\\分隔路径后,获取倒数第一第二个元素 拼接起来file_i_name = file_short_path.split(".")[0] #以.分隔字符串,去掉后缀file_full_path_list.append(file_i_name)return file_full_path_listroot_path_from = r'./fire_yolo_format' #待清洗的目录
root_path_save = r'./clean_data'  #清洗后保存的目录
#拼接出待清洗的文件夹下的子文件夹
root_images_from = os.path.join(root_path_from,'images')
root_labels_from = os.path.join(root_path_from,'labels')
#拼接出清洗后存储的子文件夹
root_images_save = os.path.join(root_path_save,'images')
root_labels_save = os.path.join(root_path_save,'labels')print(root_images_from)
print(root_labels_from)
print(root_images_save)
print(root_labels_save)#循环遍历创建清洗后文件存储文件夹
"""dir_list_1 = ['images','labels']
dir_name_list = ['train','test','val']
for dir1 in dir_list_1:for dir2 in dir_name_list:dir_full_path = os.path.join(root_path_save,dir1,dir2)if not os.path.exists(dir_full_path):os.makedirs(dir_full_path)"""#遍历待清洗的图片文件夹下的文件
image_file_full_path_list = get_info(root_images_from)
#print(image_file_full_path_list)
labels_file_full_path_list = get_info(root_labels_from)
print(labels_file_full_path_list)
#labels下的txt和images下的图片名称比较,只比较\\val\\small (28).txt 后面的这部分
#使用集合做交集比较
image_set = set(image_file_full_path_list)
label_set = set(labels_file_full_path_list)
intersection_set = image_set & label_set
print(len(image_set))
print(len(label_set))
print(len(intersection_set))print(intersection_set)#这些是两个集合里都有的,是能一一对上的。
#把这些路径拼接成完整路径再复制到clean_data文件夹
for intersection_i in intersection_set:#file_yolo_format中的能一一对上的文件intersection_i_image_full_path_from = os.path.join(root_images_from,intersection_i) + '.jpg'intersection_i_label_full_path_from = os.path.join(root_labels_from,intersection_i) + '.txt'#要保存到的clean_data的文件完整路径intersection_i_image_full_path_save = os.path.join(root_images_save, intersection_i) + '.jpg'intersection_i_label_full_path_save = os.path.join(root_labels_save, intersection_i) + '.txt'shutil.copy(intersection_i_image_full_path_from, intersection_i_image_full_path_save)shutil.copy(intersection_i_label_full_path_from, intersection_i_label_full_path_save)

这篇关于YOLO标注文件清洗案例代码-学习篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1142084

相关文章

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

Java强制转化示例代码详解

《Java强制转化示例代码详解》:本文主要介绍Java编程语言中的类型转换,包括基本类型之间的强制类型转换和引用类型的强制类型转换,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录引入基本类型强制转换1.数字之间2.数字字符之间引入引用类型的强制转换总结引入在Java编程语言中,类型转换(无论

Vue 调用摄像头扫描条码功能实现代码

《Vue调用摄像头扫描条码功能实现代码》本文介绍了如何使用Vue.js和jsQR库来实现调用摄像头并扫描条码的功能,通过安装依赖、获取摄像头视频流、解析条码等步骤,实现了从开始扫描到停止扫描的完整流... 目录实现步骤:代码实现1. 安装依赖2. vue 页面代码功能说明注意事项以下是一个基于 Vue.js

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu

使用Dify访问mysql数据库详细代码示例

《使用Dify访问mysql数据库详细代码示例》:本文主要介绍使用Dify访问mysql数据库的相关资料,并详细讲解了如何在本地搭建数据库访问服务,使用ngrok暴露到公网,并创建知识库、数据库访... 1、在本地搭建数据库访问的服务,并使用ngrok暴露到公网。#sql_tools.pyfrom