Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 12|回复: 0

新闻天下Python脚本提取YOLO数据集特定类别 - 幽络源教程

[复制链接]

31万

主题

0

回帖

93万

积分

超级版主

Rank: 8Rank: 8

积分
931356
发表于 昨天 20:22 | 显示全部楼层 |阅读模式
背景
下载了个别人提供的数据集,但是我只需要用到里边的某一个或者某两个类别,因此需要将其他类别的数据集,包括图片和标签删除,当然,这里的删除,并不是直接一一对应删除,因为一张图对应的标签文件中不只有一种类别。

大致步骤

1分析数据集
2必要的预处理
3使用脚本清理指定索引的类别
4处理剩下的类别的标签索引

步骤1分析数据集
我拿了一个边坡相关的yolo数据集,配置文件如图,可以看到其中包含了6类对对象



翻译可知这六类对象为“贫瘠”、“排水缺陷”、“侵蚀”、“倒下的树木”、“斜坡坍塌”、“植被”,可以首先用LabelImg打开查看一下,由于我其需要的是边坡堵塞相关的数据集,如图,这个排水缺陷的类型比较像,因此我这里以提取排水缺陷的数据集为例



步骤2必要的预处理
在正式提取前,非常有必要做一些其他处理,特别是使用别人分享的数据集,比如检查是否包含了分隔标注,毕竟别人的数据集也不能拿来就用,可能是有问题的。

预处理一:规范文件
比如文件包含了多个后缀,例如为aaajpgaaajpg这种,处理方式见

Python批量修改YOLO数据集图片和标签称为UUID幽络源教程(youluoyuancom)

预处理二:检查是否包含了分隔标注
我们这种矩形方框称为box标注,有些别人分享的数据集中可能会包含一些分隔标注的数据,这样混合起来的数据会对训练造成很大影响,虽然yolo自己会忽略掉,处理方式见

Yolo训练问题:Boxandsegmentcountsshouldbeequal,butgotlen(segments)分析与解决(youluoyuancom)

步骤3使用脚本清理指定索引的类别
如图,根据yaml配置文件可知我这里需要提取的是索引为1的类别,即排水缺陷当作边坡(排水沟)堵塞缺陷



使用如下脚本,将索引为0,2,3,4,5的类别全部清除,执行后会将含有索引0,2,3,4,5的标签删除,而且标签文件对应索引信息删了后若文件为空还会将标签txt删除,且删除对应的照片

importos

#目标目录路径
images_dir=r'D:\A01PythonProjects3123\labelImg-master\标签文件批量处理\slopev1iyolov8\train\images'#图片文件目录
labels_dir=r'D:\A01PythonProjects3123\labelImg-master\标签文件批量处理\slopev1iyolov8\train\labels'#标签文件目录
indices_to_remove={0,2,3,4,5}#要删除的类别索引

#遍历labels目录下的所有文件
forfilenameinoslistdir(labels_dir):
file_path=ospathjoin(labels_dir,filename)

ifospathisfile(file_path)andfilenameendswith('txt'):
withopen(file_path,'r')asfile:
lines=filereadlines()

#过滤掉类别索引为0、2、3的行
filtered_lines=[lineforlineinlinesifint(linesplit()[0])notinindices_to_remove]

#如果文件内容不为空,写回过滤后的内容
iffiltered_lines:
withopen(file_path,'w')asfile:
filewritelines(filtered_lines)
print(f'{filename}')
else:
#如果标签文件为空,删除该标签文件及对应的图片文件
image_path=ospathjoin(images_dir,filenamereplace('txt','jpg'))#假设图片是jpg格式
ifospathisfile(image_path):
osremove(image_path)
print(f'删除图片:{image_path}')
osremove(file_path)#删除标签文件
print(f'删除空标签文件:{file_path}')
执行如上脚本后,就能保证图片与标签只会包含我们所需的索引1的类别了,然后修改下yaml为如下图



步骤4处理剩下的类别的标签索引
上边将除了1之外的索引都去掉了,接下来继续将这些索引为1的标签批量更换为0,因为yaml中配置的类别默认是从索引0开始的,执行如下脚本,进行批量更换,别忘了将验证集也更换了

importos

defmodify_txt_labels(folder_path,num):
forfile_nameinoslistdir(folder_path):
#确保是txt文件
iffile_nameendswith('txt'):
file_path=ospathjoin(folder_path,file_name)
modified_lines=

#读取并修改每一行
withopen(file_path,'r',encoding='utf-8')asfile:
forlineinfile:
parts=linesplit()#分割每行内容
ifparts:#如果这一行不是空行
parts[0]=num#替换首个数字为num
modified_lines脚本end(''join(parts))#重新组合

#将修改后的内容写回文件
withopen(file_path,'w',encoding='utf-8')asfile:
filewrite('\n'join(modified_lines)+'\n')
#替换的数字
num='0'
#替换为你的文件夹路径
folder_path=r"D:\A01PythonProjects3123\labelImg-master\标签文件批量处理\slopev1iyolov8\train\labels"
modify_txt_labels(folder_path,num)
至此,我们从6大类的数据集中提取出了自己所需的一类数据集

结语
以上是幽络源原创的使用Python脚本将yolo数据集提取部分特定类别的教程,如有不懂之处可加群询问交流

?



业内人士认为,幽络源的发展标志着整个行业在快速稳步的前进中。幽络源-免费源码,网络兼职,技术教程,项目服务一站式综合平台。https://www.youluoyuan.com/

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|企业-展美呗贤果有限公司

GMT+8, 2025-4-27 04:51 , Processed in 0.084140 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表