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

Yolo分割数据集错误数据删除

检查yolo系列的分割数据,如果怀疑数据集有问题,可以使用此代码,dry_run 先设置为True,执行后会打印有问题的数据,观察打印的数据符合预期,然后,再改为False,删除异常数据。代码如下:

import os
import globdef check_and_clean_segment_labels(label_dir, img_dir=None, num_classes=None, dry_run=False):"""检查 YOLO 分割标签格式,并删除异常标签及其对应的图像。Args:label_dir (str): 标签文件目录(如 'labels/train')img_dir (str or None): 图像文件目录。若为 None,则自动推断(替换 'labels' 为 'images')num_classes (int or None): 类别总数,用于检查 class_id 范围dry_run (bool): 若为 True,仅打印将要删除的文件,不实际删除"""if img_dir is None:# 自动推断 images 路径:将 'labels' 替换为 'images'if 'labels' in label_dir:img_dir = label_dir.replace('labels', 'images')else:raise ValueError("无法自动推断 img_dir,请显式传入 img_dir 参数")label_paths = glob.glob(os.path.join(label_dir, "*.txt"))if not label_paths:print(f"⚠️ 警告:在 {label_dir} 中未找到任何 .txt 标签文件!")return# 支持的图像扩展名IMG_EXTS = {'.jpg', '.jpeg', '.png', '.bmp', '.tiff', '.webp'}invalid_files = []for path in label_paths:with open(path, 'r', encoding='utf-8') as f:lines = [line.strip() for line in f.readlines() if line.strip()]if not lines:invalid_files.append((path, "空文件或无有效行"))continuevalid_file = Truefor i, line in enumerate(lines):parts = line.split()if len(parts) < 7:invalid_files.append((path, f"第 {i + 1} 行:少于7个数值(当前{len(parts)}个),至少需要1个类别+3个点(7个数)"))valid_file = Falsebreaktry:values = list(map(float, parts))except ValueError:invalid_files.append((path, f"第 {i + 1} 行:包含非数字字符"))valid_file = Falsebreakclass_id = int(values[0])if num_classes is not None and (class_id < 0 or class_id >= num_classes):invalid_files.append((path, f"第 {i + 1} 行:类别ID {class_id} 超出范围 [0, {num_classes - 1}]"))valid_file = Falsebreakcoords = values[1:]if len(coords) % 2 != 0:invalid_files.append((path, f"第 {i + 1} 行:坐标数量为奇数({len(coords)}),必须为偶数"))valid_file = Falsebreakif not all(0 <= c <= 1 for c in coords):invalid_files.append((path, f"第 {i + 1} 行:存在坐标超出 [0,1] 范围"))valid_file = Falsebreak# 删除或预览异常文件if invalid_files:print(f"\n❌ 在 {label_dir} 中发现 {len(invalid_files)} 个异常标签文件:\n")for txt_path, reason in invalid_files:print(f"  - {txt_path} → {reason}")# 查找对应的图像文件base_name = os.path.splitext(os.path.basename(txt_path))[0]img_path = Nonefor ext in IMG_EXTS:candidate = os.path.join(img_dir, base_name + ext)if os.path.exists(candidate):img_path = candidatebreakif dry_run:print(f"    🗑️  [DRY RUN] 将删除: {txt_path}")if img_path:print(f"    🗑️  [DRY RUN] 将删除: {img_path}")else:print(f"    ⚠️  未找到对应图像文件(检查 {img_dir})")else:# 实际删除try:os.remove(txt_path)print(f"    ✅ 已删除标签: {txt_path}")except Exception as e:print(f"    ❌ 删除失败 {txt_path}: {e}")if img_path:try:os.remove(img_path)print(f"    ✅ 已删除图像: {img_path}")except Exception as e:print(f"    ❌ 删除失败 {img_path}: {e}")else:print(f"    ⚠️  未找到对应图像文件(检查 {img_dir})")else:print(f"✅ {label_dir} 中所有标签文件格式合法!")if __name__ == "__main__":# ====== 配置你的路径 ======train_label_dir = "datasets/Seg/labels/train"val_label_dir = "datasets/Seg/labels/val"num_classes = 1  # 你的类别数# 设置 dry_run=True 先预览,确认无误后再设为 False 执行删除dry_run = True # 👈 先设为 True 预览!确认后再改为 Falseprint("=== 检查并清理训练集 ===")check_and_clean_segment_labels(label_dir=train_label_dir,num_classes=num_classes,dry_run=dry_run)print("\n=== 检查并清理验证集 ===")check_and_clean_segment_labels(label_dir=val_label_dir,num_classes=num_classes,dry_run=dry_run)
http://www.dtcms.com/a/515612.html

相关文章:

  • Redis原理篇(一)数据结构
  • 1022作业
  • 北京商城型网站建设网上商城的意义
  • 《3D端游云原生日志:开放世界资源加载卡顿的实战与经验沉淀》
  • 2025年渗透测试面试题总结-213(题目+回答)
  • 技术演进中的开发沉思-146 java-servlet:Servlet 在云原生时代的适配”
  • 网件路由器做网站装修公司加盟好还是自己开
  • 【自适应滤波例程】基于新息协方差匹配的自适应EKF (无迹卡尔曼滤波) vs 经典EKF对比,附MATLAB代码下载链接
  • 获得网站源文件破解WordPress站点
  • 【OpenManus深度解析】MetaGPT团队打造的开源AI智能体框架,打破Manus闭源壁垒。包括架构分层、关键技术特点等内容
  • Redis(一):缓存穿透及其解决方法(SpringBoot+mybatis-plus)
  • Tanh 函数详解
  • 【手机篇】AI深度学习在手机中框/RT四周外观检测应用方案
  • 遂宁网站优化东莞市住房和城乡建设局门户网站
  • 基于专家经验的网络异常流量检测技术研究
  • 生成模型实战 | MUNIT详解与实现
  • 网站建设的费用包括微信app下载找回微信
  • JAVA攻防-常规漏洞SQL注入四类型XXE引用点RCE原生框架URL跳转URL处理类
  • Disk Drill Enterprise Windows数据恢复工具
  • 合合信息亮相PRCV:多模态文本智能与内容安全双擎驱动新突破
  • PCIe协议之 Equalization篇 之 理论篇 之 DFE CTLE
  • 接单做一个网站多少钱网站后台修改图片
  • 操作系统4.3.1 文件系统的层次结构
  • 做2手物品通过网站去卖掉好做吗基于.net的个人网站开发实录
  • 三轴云台之线性控制特性
  • c++注意点(15)----状态模式
  • Delmia 软件 Teach 模块 interpolationMode 插补模式应用说明
  • Android Studio新手开发第二十八天
  • 系统与网络安全------弹性交换网络(4)
  • 功能网站首页模板微信小说分销平台