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

Labelme标注数据清洗实战:用Python批量重命名、替换和删除特定标签(附完整代码)

Labelme标注数据清洗实战Python自动化处理标签体系的三大核心场景当你完成一轮图像标注后突然发现标签体系需要调整——可能是命名不规范需要统一可能是类别定义需要修改甚至是某些冗余类别需要删除。手动修改每个JSON文件不仅耗时还容易出错。本文将带你用Python实现Labelme标注数据的自动化清洗覆盖标签重命名、精确替换和安全删除三大高频需求场景。1. 环境准备与数据备份策略在开始任何数据清洗操作前建立可靠的工作环境是首要任务。我们建议使用Python 3.8环境并安装必要的依赖库pip install labelme numpy pandas创建项目目录结构时遵循以下规范能大幅降低后续维护成本/project_root ├── /raw_json # 原始标注文件 ├── /backup # 备份目录 ├── /processed # 处理后的文件 └── scripts/ # 存放处理脚本重要数据安全实践在修改前自动创建备份是必须的。以下代码实现了自动备份功能import shutil from pathlib import Path def backup_json_files(src_dir, backup_dir): 自动备份JSON文件到指定目录 src_path Path(src_dir) backup_path Path(backup_dir) backup_path.mkdir(exist_okTrue) for json_file in src_path.glob(*.json): shutil.copy2(json_file, backup_path / json_file.name) print(f备份完成共备份 {len(list(src_path.glob(*.json)))} 个文件)提示建议在处理前后分别计算JSON文件的MD5校验值确保数据完整性import hashlib def calculate_md5(file_path): with open(file_path, rb) as f: return hashlib.md5(f.read()).hexdigest()2. 标签统一化去除冗余编号多人协作标注时常出现同一类别被添加不同后缀的情况如FCD1、FCD1187等。我们需要将其统一为规范名称。2.1 智能字符串处理方案原始方案直接截取前三位字符存在风险更健壮的做法是使用正则表达式识别模式import re import json from pathlib import Path def standardize_labels(json_dir, patternr([A-Za-z])\d): 使用正则表达式智能识别并统一标签名称 json_dir Path(json_dir) modified_count 0 for json_file in json_dir.glob(*.json): with open(json_file, r, encodingutf-8) as f: data json.load(f) changes_made False for shape in data[shapes]: match re.fullmatch(pattern, shape[label]) if match: new_label match.group(1) if shape[label] ! new_label: shape[label] new_label changes_made True if changes_made: modified_count 1 with open(json_file, w) as f: json.dump(data, f, indent2) print(f处理完成共修改 {modified_count} 个文件)2.2 变更验证与质量检查修改后需要验证变更的正确性。以下检查脚本可帮助发现问题def validate_standardization(json_dir, expected_labels): 验证标签标准化结果 issues [] for json_file in Path(json_dir).glob(*.json): with open(json_file, r) as f: data json.load(f) for shape in data[shapes]: if shape[label] not in expected_labels: issues.append(f{json_file.name}: 发现非预期标签 {shape[label]}) if issues: print(发现验证问题) for issue in issues[:5]: # 只显示前5个问题 print(issue) print(f...共发现 {len(issues)} 个问题) else: print(所有标签均符合预期标准)3. 精确标签替换语义化调整当需要修改类别定义时如dog→puppy精确替换是关键。我们开发了更安全的批量替换方案。3.1 安全替换实现def batch_replace_labels(json_dir, old_to_new): 批量替换标签支持多组替换 json_dir Path(json_dir) change_log {old: {total: 0, files: set()} for old in old_to_new} for json_file in json_dir.glob(*.json): with open(json_file, r, encodingutf-8) as f: data json.load(f) modified False for shape in data[shapes]: if shape[label] in old_to_new: change_log[shape[label]][total] 1 change_log[shape[label]][files].add(json_file.name) shape[label] old_to_new[shape[label]] modified True if modified: with open(json_file, w) as f: json.dump(data, f, indent2) # 生成详细变更报告 print(替换统计报告) for old_name, stats in change_log.items(): new_name old_to_new[old_name] print(f{old_name} → {new_name}:) print(f 总替换次数: {stats[total]}) print(f 涉及文件数: {len(stats[files])})3.2 替换前后可视化对比使用Labelme的Python API可以生成修改前后的可视化对比import labelme import matplotlib.pyplot as plt def visualize_changes(json_file, image_file, old_label, new_label): 可视化标签替换效果 fig, (ax1, ax2) plt.subplots(1, 2, figsize(12, 6)) # 原始标注可视化 labelme.utils.draw_label(image_file, json_file, axax1) ax1.set_title(f原始标注 ({old_label})) # 修改后可视化 modified_json json_file.with_suffix(.modified.json) labelme.utils.draw_label(image_file, modified_json, axax2) ax2.set_title(f修改后 ({new_label})) plt.tight_layout() plt.show()4. 安全删除特定标签类别删除操作不可逆需要特别谨慎。我们实现了带有多重保护的删除方案。4.1 安全删除实现def safe_delete_labels(json_dir, labels_to_delete, dry_runFalse): 安全删除指定标签支持试运行模式 json_dir Path(json_dir) deletion_report {label: {count: 0, files: set()} for label in labels_to_delete} for json_file in json_dir.glob(*.json): with open(json_file, r, encodingutf-8) as f: data json.load(f) # 先统计不修改 original_shapes len(data[shapes]) for shape in data[shapes]: if shape[label] in labels_to_delete: deletion_report[shape[label]][count] 1 deletion_report[shape[label]][files].add(json_file.name) # 实际删除操作 if not dry_run: data[shapes] [s for s in data[shapes] if s[label] not in labels_to_delete] if len(data[shapes]) ! original_shapes: with open(json_file, w) as f: json.dump(data, f, indent2) print(删除操作统计报告) for label, stats in deletion_report.items(): print(f标签 {label}:) print(f 总删除数量: {stats[count]}) print(f 涉及文件数: {len(stats[files])}) if dry_run: print(\n注意当前为试运行模式未实际修改文件)4.2 删除后数据完整性检查删除操作可能影响其他处理逻辑需要验证数据完整性def post_deletion_validation(json_dir): 验证删除操作后的数据完整性 issues [] empty_files [] for json_file in Path(json_dir).glob(*.json): with open(json_file, r) as f: data json.load(f) if not data[shapes]: empty_files.append(json_file.name) # 检查每个shape的结构完整性 for i, shape in enumerate(data[shapes]): if not all(k in shape for k in [label, points, shape_type]): issues.append(f{json_file.name}: 第{i}个shape结构不完整) if issues or empty_files: if empty_files: print(f警告发现 {len(empty_files)} 个空标注文件) if issues: print(f发现 {len(issues)} 个结构问题) else: print(所有文件通过完整性检查)5. 高级技巧与性能优化当处理大规模标注数据集时效率成为关键考量。以下是几个提升处理速度的技巧并行处理实现from concurrent.futures import ThreadPoolExecutor import multiprocessing def parallel_process_json(json_dir, process_func, max_workersNone): 并行处理JSON文件 json_files list(Path(json_dir).glob(*.json)) max_workers max_workers or multiprocessing.cpu_count() * 2 with ThreadPoolExecutor(max_workersmax_workers) as executor: results list(executor.map(process_func, json_files)) return results内存优化方案import ijson def stream_parse_large_json(json_file): 流式处理大JSON文件 with open(json_file, rb) as f: for prefix, event, value in ijson.parse(f): if prefix.endswith(.label): # 在此处处理标签 pass变更追踪与审计日志import logging from datetime import datetime def setup_audit_log(): 配置审计日志系统 logger logging.getLogger(labelme_cleaner) logger.setLevel(logging.INFO) log_file flabelme_clean_{datetime.now().strftime(%Y%m%d_%H%M%S)}.log file_handler logging.FileHandler(log_file) formatter logging.Formatter(%(asctime)s - %(levelname)s - %(message)s) file_handler.setFormatter(formatter) logger.addHandler(file_handler) return logger

相关文章:

Labelme标注数据清洗实战:用Python批量重命名、替换和删除特定标签(附完整代码)

Labelme标注数据清洗实战:Python自动化处理标签体系的三大核心场景 当你完成一轮图像标注后,突然发现标签体系需要调整——可能是命名不规范需要统一,可能是类别定义需要修改,甚至是某些冗余类别需要删除。手动修改每个JSON文件不…...

从SimCLR到CLIP:对比学习在CV领域的演进与落地思考(附避坑指南)

从SimCLR到CLIP:对比学习在视觉智能中的范式跃迁与技术实践 当计算机视觉领域还在为标注数据的稀缺性苦恼时,对比学习像一束光照亮了无监督表征学习的道路。从2020年SimCLR的横空出世,到CLIP开启的多模态新时代,这场技术演进不仅重…...

独立t检验怎么做:软件操作步骤与结果指标解读

一、独立t检验所属模块独立t检验在SPSSAU中归属于【通用方法】模块。二、方法概述独立t检验用于比较两个独立组在某个定量指标上的平均水平是否存在显著差异,常见于性别对比、实验组与对照组对比、不同人群均值比较等场景。对于只有两个组别的差异分析,S…...

如何合并两个表分区_MERGE PARTITIONS合并范围或列表分区

Oracle MERGE PARTITIONS 必须显式指定两个相邻分区名,不支持通配符或FOR VALUES;操作会物理移动数据并锁表,需验证边界值、补全LIST值列表,且DEFAULT分区不可参与合并。ALTER TABLE … MERGE PARTITIONS 语法必须带分区名&#x…...

如何用Sunshine打造终极私人游戏串流平台:5步简单指南

如何用Sunshine打造终极私人游戏串流平台:5步简单指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine是一款强大的开源游戏串流服务器,专为Moonli…...

基于若依框架的Java多仓库进销存ERP系统源码|SpringBoot+SpringCloud架构|支持试用与二次开发

温馨提示:文末有联系方式系统核心定位 本系统是一款面向中小企业的现代化网络版ERP解决方案,深度融合进销存管理与多仓库协同能力,采用主流Java技术栈构建,具备高扩展性与模块化设计特点。技术架构亮点 系统基于开源若依&#xff…...

CKS考试通关后,我总结的这16个K8s安全加固实战场景(含详细命令)

CKS认证工程师必备:16个Kubernetes生产级安全加固场景深度解析 在云原生技术快速发展的今天,Kubernetes已成为企业容器编排的事实标准,但随之而来的安全挑战也日益严峻。作为通过CKS认证的工程师,我们不仅需要掌握考试要求的修复技…...

Zephyrus Duo 双屏游戏本体验超酷但价格贵,与竞品相比性能和成本谁更优?

Zephyrus Duo 亮点与目标用户这款笔记本电脑亮点颇多,配备两块全尺寸 16 英寸 OLED 屏幕、顶级的 Nvidia RTX 5090 笔记本 GPU、近乎顶级的 16 核英特尔 Panther Lake 芯片等。不过,它似乎没有明确的目标用户,但能带来超酷且有趣的使用体验。…...

魔兽争霸3终极优化指南:5分钟解决所有兼容性问题

魔兽争霸3终极优化指南:5分钟解决所有兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典游戏《魔兽争霸3》在现代电脑上…...

主从DNS服务器实验

【实验要求】:完成DNS的主服务器配置完成DNS的从服务器配置完成客户端配置【步骤】:一、DNS主服务器配置登录主服务器,完成IP等一切先前配置后,安装bind,进入目录/etc编辑主配置文件named.confvim /etc/named.conflist…...

Transformer在文档级事件抽取中的应用与优化

1. 项目背景与核心价值MAVEN-FACT数据集是近年来事件抽取领域的重要基准测试集,包含超过4,800个文档和118,732个事件实例。这个项目最吸引我的地方在于它首次将事件抽取任务从传统的句子级扩展到了文档级,更贴近真实场景中的信息处理需求。我在处理客户舆…...

【MySQL | 第八篇】索引的使用

目录 一、索引的使用规则 1.最左前缀法则 2.范围查询 3.索引的失效情况 3.1索引列运算 3.2字符串不加引号 3.3模糊查询 3.4or连接的条件 3.5数据分布影响 4.SQL提示 5.覆盖索引⭐⭐⭐⭐⭐ 6.前缀索引 7.单列索引与联合索引 二、索引的涉及原则 一、索引的使用规则…...

Wand-Enhancer:免费解锁WeMod高级功能的完整指南

Wand-Enhancer:免费解锁WeMod高级功能的完整指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 你是否厌倦了WeMod游戏助手的付费限制&…...

别再被5V电源坑了!ESP32-CAM搭配CH340烧录与运行的全流程避坑指南

ESP32-CAM电源与烧录终极指南:从硬件连接到稳定运行 刚拿到ESP32-CAM开发板时,那种跃跃欲试的兴奋感很快会被一连串的硬件问题浇灭——电源接3.3V无法启动、CH340接线错误导致烧录失败、IO0引脚状态不对让设备"装死"。这些问题困扰着每一位刚接…...

从短期利率到波动率:手把手用Python复现CIR模型,搞定金融时间序列模拟

从短期利率到波动率:手把手用Python复现CIR模型,搞定金融时间序列模拟 金融市场的波动性和利率变化常常让分析师们头疼不已。想象一下,你手头有一组历史利率数据,老板突然要求你预测未来半年可能出现的极端情景——这可不是靠直觉…...

Go 语言从入门到进阶 | 第 16 章:反射(Reflection)

系列:Go 语言从入门到进阶 作者:耿雨飞 适用版本:go v1.26.2 前置条件 在开始本章学习之前,请确保: 已完成第 6 章(接口与多态)的学习,理解接口的动态类型和动态值 已完成第 4 章(复合数据类型)的学习,熟悉结构体和标签语法 已获取 Go 1.26.2 源码树(go-go1.26.2 …...

用STM32F103和VS1053B手搓一个MP3播放器:从SD卡读取到OLED显示的完整流程

用STM32F103和VS1053B打造高保真MP3播放器:从硬件搭建到软件优化的全流程解析 在嵌入式音频开发领域,DIY一个具备完整功能的MP3播放器始终是检验开发者系统设计能力的经典项目。本文将基于STM32F103微控制器与VS1053B解码芯片的组合,深入剖析…...

Claude Code 十大必装 MCP 排行榜(2026年最新版)

🏆 Claude Code 十大必装 MCP 排行榜(2026年最新版) 作为一名重度使用 Claude Code 的开发者,我踩过不少坑,也发现了许多能极大提升开发效率的 MCP。今天就把我心目中最值得安装的10个 MCP 整理出来,附带详…...

Synopsys AXI VIP实战:除了outstanding检查,回调机制还能帮你做哪些事?

Synopsys AXI VIP回调机制深度实战:解锁验证效率的五大高阶技巧 AXI总线作为现代SoC设计的核心互联标准,其验证复杂度随着系统规模呈指数级增长。Synopsys验证IP(VIP)提供的回调机制,就像给验证工程师配备了一把瑞士军…...

如何搭建个人游戏串流服务器:Sunshine完整指南

如何搭建个人游戏串流服务器:Sunshine完整指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine是一款开源的游戏串流服务器,能够将高性能电脑上的游…...

实战解析:在华为云Stack(HCS 6.5)中如何为Oracle RAC规划BMS裸金属与高性能云硬盘

华为云Stack 6.5环境下Oracle RAC的裸金属与存储架构设计指南 当企业将Oracle RAC这类关键数据库迁移到私有云环境时,基础设施的规划直接决定了业务系统的稳定性和性能表现。华为云Stack 6.5(HCS)作为成熟的私有云解决方案,其BMS裸…...

告别双系统折腾!用Python工具rosbags一键搞定ROS1/ROS2的bag文件互转

告别双系统折腾!用Python工具rosbags一键搞定ROS1/ROS2的bag文件互转 在机器人开发领域,数据记录与回放是调试和验证算法的重要环节。ROS1和ROS2作为机器人操作系统的主流版本,各自采用不同的数据存储格式,这给开发者带来了不小的…...

海外短剧APP开发,从0到1:硬刚谷歌商店合规,打通海外多币种支付!

短剧出海“掘金”正当时,但很多团队在第一步就卡住了:APP 被谷歌商店拒审、支付掉单严重、封号风险高。相比 H5 的灵活,APP 虽然周期长,但 留存和 LTV 更高,是建立品牌壁垒的必选项。 今天就聊聊如何开发一款符合谷歌…...

番茄小说下载器:构建个人数字图书馆的高效解决方案

番茄小说下载器:构建个人数字图书馆的高效解决方案 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 还在为网络不稳定无法畅快阅读而烦恼吗?这款基于Rus…...

大语言模型偏见量化实战(R语言统计框架全公开)

更多请点击: https://intelliparadigm.com 第一章:大语言模型偏见量化的基本概念与R语言生态定位 大语言模型(LLM)偏见量化是指通过可复现的统计指标与实验范式,系统性地测量模型在性别、种族、地域、职业等维度上输出…...

【VS Code MCP插件生态架构白皮书】:20年IDE架构师亲授从零搭建高兼容、可扩展、易维护的MCP服务层(含4层抽象设计图+3大协议适配范式)

更多请点击: https://intelliparadigm.com 第一章:VS Code MCP插件生态搭建手册 MCP 协议与 VS Code 集成原理 MCP(Model Context Protocol)是面向大模型工具调用的开放协议,VS Code 通过官方语言服务器协议&#xf…...

如何实现ComfyUI-Manager离线部署:3种本地安装方案详解

如何实现ComfyUI-Manager离线部署:3种本地安装方案详解 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various cust…...

数字线程:数字孪生的“中枢神经”,如何驱动产业智能升级?

数字线程:数字孪生的“中枢神经”,如何驱动产业智能升级? 引言 (配图建议:一张对比图,左侧是分散、断裂的传统数据流,右侧是通过一条光带“数字线程”串联起的全生命周期数据闭环。)…...

深入Gold-YOLO的GD机制:看华为如何用‘聚集-分发’解决YOLO系列的老大难问题

深入解析Gold-YOLO的GD机制:重新定义多尺度特征融合范式 当目标检测领域还在为FPN和PANet的信息传输瓶颈争论不休时,华为诺亚方舟实验室在2023年NeurIPS会议上抛出了一枚技术"深水炸弹"——Gold-YOLO。这个以"聚集-分发"&#xff08…...

上下文多臂老虎机在LLM查询优化中的应用与实现

1. 上下文多臂老虎机在LLM查询优化中的核心原理上下文多臂老虎机(Contextual Bandits)是强化学习中的一个重要分支,它通过结合上下文信息来优化决策过程。在自然语言处理领域,这种方法被广泛应用于查询优化和响应生成。其核心原理…...