将 JSON 批量转换为 XML:深度解析与完整实现指南

在数据科学与机器学习项目中,数据预处理始终扮演着不可或缺的角色。尤其当你面对多类别图像标注任务,而标注数据却是以 JSON 形式存在,而目标检测模型却偏好 VOC 格式的 XML 时,这个转换过程就变得极为关键。

本文将带你深入解读一个完整的实战项目:如何将图像分类数据集中每个标注 JSON 批量转换为标准 Pascal VOC 格式的 XML 文件,并同步整理图像资源。文章不仅附带完整代码,还涵盖路径组织、格式规范、注意事项等细节。


🧭 背景设定与挑战目标

想象你正进行一个猫狗识别任务,图像已经用 LabelMe 等工具标注为 JSON 格式,其中包含了边界框(bounding box)、类别信息、图像路径等。你需要:

  1. 从多个子类别文件夹(如“猫/狗”、“训练集/验证集”)中提取图片;
  2. 将对应的 JSON 文件转换为 VOC 结构的 XML;
  3. 输出统一、清晰、便于训练的数据目录结构。

听起来琐碎?没错。但只需一套 Python 脚本,这些都能自动化完成!


🗂️ 项目结构设计(自动创建)

最终数据结构如下所示:

├── your_target_path/
│   ├── 训练/
│   │   ├── images/
│   │   └── xml/
│   └── 验证/
│       ├── images/
│       └── xml/

无须手动创建目录,程序将自动完成所有结构的搭建与数据整理!


🔍 代码核心逻辑剖析

🧩 1. JSON 转 Pascal VOC XML:convert_json_to_voc_xml

该函数负责读取单个标注文件,提取图像尺寸、目标框信息等,并生成标准 Pascal VOC XML。使用了 Python 的 xml.etree.ElementTree 库,无需额外依赖。

🧩 2. XML 构建核心:make_voc_xml

该函数将目标对象逐一转写为 <object> 标签结构,包括:

  • label 标签名
  • points 坐标点(自动计算为 bbox)
  • difficult 标签(可选)

并将其打包为完整的 <annotation> 结构。

🧩 3. 批量处理:process_split

它是处理每个子集(如“训练”/“验证”)的核心函数:

  • 遍历 JSON 文件夹
  • 复制图像文件至目标目录
  • 调用转换函数生成 XML
  • 控制最大数量(默认为 3000)

🛠️ 完整可运行脚本

import os
import shutil
import json
import xml.etree.ElementTree as ETdef make_voc_xml(json_path, img_filename, img_shape, objects, xml_path):# 构建 Pascal VOC XML...def convert_json_to_voc_xml(json_file, xml_file):# 从 JSON 文件中提取图像信息与目标对象,生成 XML...def process_split(split, base_dir, target_base, max_count=3000):img_dst = os.path.join(target_base, split, 'images')xml_dst = os.path.join(target_base, split, 'xml')os.makedirs(img_dst, exist_ok=True)os.makedirs(xml_dst, exist_ok=True)img_count = 0for animal in ['cat', 'dog']:img_src = os.path.join(base_dir, animal, split + '集', 'images')json_src = os.path.join(base_dir, animal, split + '集', 'json')if not os.path.exists(img_src) or not os.path.exists(json_src):continuefiles = [f for f in os.listdir(json_src) if f.endswith('.json')]files = files[:max(0, max_count - img_count)]for fname in files:json_path = os.path.join(json_src, fname)with open(json_path, 'r', encoding='utf-8') as f:data = json.load(f)img_name = os.path.basename(data['imagePath'])img_path = os.path.join(img_src, img_name)if not os.path.exists(img_path):continueshutil.copy(img_path, os.path.join(img_dst, img_name))xml_name = os.path.splitext(img_name)[0] + '.xml'xml_path = os.path.join(xml_dst, xml_name)convert_json_to_voc_xml(json_path, xml_path)img_count += 1if img_count >= max_count:breakif __name__ == "__main__":# ⚠️ 请将以下两个路径替换为你自己的输入/输出目录base_dir = r"请在此填写你的原始数据集路径"target_base = r"请在此填写你希望保存转换结果的位置"# 分别处理训练集与验证集process_split('训练', base_dir, target_base, max_count=3000)process_split('验证', base_dir, target_base, max_count=3000)print("图片和VOC格式xml已整理完成!")

🧷 使用步骤指南(务必替换路径)

  1. 在本地准备如下数据结构:
    原始路径/
    ├── cat/
    │   ├── 训练集/
    │   │   ├── images/
    │   │   └── json/
    │   └── 验证集/
    └── dog/
    
  2. 修改脚本中的 base_dirtarget_base 变量为你自己的实际路径。
  3. 运行脚本,观察终端输出转换进度。
  4. 转换结果将自动按“训练 / 验证”分文件夹整理好图像与 XML 标注。

📌 技术亮点回顾

  • 纯标准库实现,跨平台无依赖
  • 支持多标签、多边框结构
  • 支持 JSON 合法性与图像路径检查
  • 自动路径管理与目录创建
  • 输出即训练,直接上手模型训练流程

💡 总结

从标注到模型训练,中间这一步格式转换往往被忽视。本文不仅提供了解决方案,更以实战项目为例,系统讲解了数据清洗与结构化管理的全流程。对于任何从事图像识别、目标检测的开发者而言,这都是一份值得收藏的工程模板。


👋 如果你觉得本文有帮助,欢迎点赞 + 收藏 + 关注,一起探索更多 AI 项目实践!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/80371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AlphaEvolve:基于Gemini的算法发现与优化综合报告

引言 • 本报告分析Google DeepMind于2025年5月14日正式发布的AlphaEvolve技术。• AlphaEvolve是一种由Gemini大型语言模型驱动的进化式编码代理&#xff0c;专注于通用算法的发现和优化。• 报告深入探讨AlphaEvolve的技术原理、实际应用及其对未来AI和算法研究的潜在影响。…

排序算法之高效排序:快速排序,归并排序,堆排序详解

排序算法之高效排序&#xff1a;快速排序、归并排序、堆排序详解 前言一、快速排序&#xff08;Quick Sort&#xff09;1.1 算法原理1.2 代码实现&#xff08;Python&#xff09;1.3 性能分析 二、归并排序&#xff08;Merge Sort&#xff09;2.1 算法原理2.2 代码实现&#xf…

Android开发——轮播图引入

Android开发——轮播图引入 一、前期准备与依赖引入二、配置启动类(AndroidManifest.xml)三、构造启动类(MainActivity.java)四、配置布局文件(activity_main.xml)五、最终效果与扩展方向一、前期准备与依赖引入 在开始引入轮播图功能前,需确保已正确搭建Android开发环境…

[逆向工程]C++实现DLL卸载(二十六)

[逆向工程]C实现DLL卸载&#xff08;二十六&#xff09; 引言 DLL注入&#xff08;DLL Injection&#xff09;是Windows系统下实现进程间通信、功能扩展、监控调试的核心技术之一。本文将从原理分析、代码实现、实战调试到防御方案&#xff0c;全方位讲解如何用C实现DLL注入&…

lesson01-PyTorch初见(理论+代码实战)

一、初识PyTorch 二、同类框架 PyTorchVSTensorFlow 三、参数 对比 四、PyTorch生态 四、常用的网络层 五、代码分析 import torch from torch import autogradx torch.tensor(1.) a torch.tensor(1., requires_gradTrue) b torch.tensor(2., requires_gradTrue) c tor…

STM32中的DMA

DMA介绍 什么是DMA? DMA&#xff08;Direct Memory Access&#xff0c;直接存储器访问&#xff09;提供在外设与内存、存储器和存储器之间的高速数据传输使用。它允许不同速度的硬件装置来沟通&#xff0c;而不需要依赖于CPU&#xff0c;在这个时间中&#xff0c;CPU对于内存…

聊聊JetCache的缓存构建

序 本文主要研究一下JetCache的缓存构建 invokeWithCached com/alicp/jetcache/anno/method/CacheHandler.java private static Object invokeWithCached(CacheInvokeContext context)throws Throwable {CacheInvokeConfig cic context.getCacheInvokeConfig();CachedAnnoC…

c#队列及其操作

可以用数组、链表实现队列&#xff0c;大致与栈相似&#xff0c;简要介绍下队列实现吧。值得注意的是循环队列判空判满操作&#xff0c;在用链表实现时需要额外思考下出入队列条件。 设计头文件 #ifndef ARRAY_QUEUE_H #define ARRAY_QUEUE_H#include <stdbool.h> #incl…

开源项目实战学习之YOLO11:12.3 ultralytics-models-sam-encoders.py源码分析

👉 点击关注不迷路 👉 点击关注不迷路 👉 另外,前些天发现了一个巨牛的AI人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。感兴趣的可以点击相关跳转链接。 点击跳转到网站。 ultralytics-models-sam 1.sam-modules-encoders.pyblocks.py: 定义模型中的各…

STM32 | FreeRTOS 消息队列

01 一、概述 队列又称消息队列&#xff0c;是一种常用于任务间通信的数据结构&#xff0c;队列可以在任务与任务间、中断和任务间传递信息&#xff0c;实现了任务接收来自其他任务或中断的不固定长度的消息&#xff0c;任务能够从队列里面读取消息&#xff0c;当队列中的消…

Java 安全漏洞扫描工具:如何快速发现和修复潜在问题?

Java 安全漏洞扫描工具&#xff1a;如何快速发现和修复潜在问题&#xff1f; 在当今的软件开发领域&#xff0c;Java 作为一种广泛使用的编程语言&#xff0c;其应用的规模和复杂度不断攀升。然而&#xff0c;随着应用的拓展&#xff0c;Java 应用面临的潜在安全漏洞风险也日益…

Python绘制克利夫兰点图:从入门到实战

Python绘制克利夫兰点图&#xff1a;从入门到实战 引言 克利夫兰点图&#xff08;Cleveland Dot Plot&#xff09;是一种强大的数据可视化工具&#xff0c;由统计学家William Cleveland在1984年提出。这种图表特别适合展示多个类别的数值比较&#xff0c;比传统的条形图更直观…

LVGL- Calendar 日历控件

1 日历控件 1.1 日历背景 lv_calendar 是 LVGL&#xff08;Light and Versatile Graphics Library&#xff09;提供的标准 GUI 控件之一&#xff0c;用于显示日历视图。它支持用户查看某年某月的完整日历&#xff0c;还可以实现点击日期、标记日期、导航月份等操作。这个控件…

多指标组合策略

该策略(MultiConditionStrategy)是一种基于多种技术指标和市场条件的交易策略。它通过综合考虑多个条件来生成交易信号,从而决定买入或卖出的时机。 以下是对该策略的详细分析: 交易逻辑思路 1. 条件1:星期几和价格变化判断 - 该条件根据当前日期是星期几以及价格的变化…

BC 范式与 4NF

接下来我们详细解释 BC 范式&#xff08;Boyce-Codd范式&#xff0c;简称 BCNF&#xff09;&#xff0c;并通过具体例子说明其定义和应用。 一、BC范式的定义 BC范式&#xff08;Boyce-Codd范式&#xff0c;BCNF&#xff09;是数据库规范化理论中的一种范式&#xff0c;它比第…

基于 CSS Grid 的网页,拆解页面整体布局结构

通过以下示例拆解网页整体布局结构&#xff1a; 一、基础结构&#xff08;HTML骨架&#xff09; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"…

采购流程规范化如何实现?日事清流程自动化助力需求、采购、财务高效协作

采购审批流程全靠人推进&#xff0c;内耗严重&#xff0c;效率低下&#xff1f; 花重金上了OA&#xff0c;结果功能有局限、不灵活&#xff1f; 问题出在哪里&#xff1f;是我们的要求太多、太苛刻吗&#xff1f;NO&#xff01; 流程名称&#xff1a; 采购审批管理 流程功能…

全栈项目搭建指南:Nuxt.js + Node.js + MongoDB

全栈项目搭建指南&#xff1a;Nuxt.js Node.js MongoDB 一、项目概述 我们将构建一个完整的全栈应用&#xff0c;包含&#xff1a; 前端&#xff1a;Nuxt.js (SSR渲染)后端&#xff1a;Node.js (Express/Koa框架)数据库&#xff1a;MongoDB后台管理系统&#xff1a;集成在同…

NVMe简介6之PCIe事务层

PCIe的事务层连接了PCIe设备核心与PCIe链路&#xff0c;这里主要基于PCIe事务层进行分析。事务层采用TLP传输事务&#xff0c;完整的TLP由TLPPrefix、TLP头、Payload和TLP Digest组成。TLP头是TLP中最关键的部分&#xff0c;一般由三个或四个双字的长度&#xff0c;其格式定义如…

Python异常模块和包

异常 当检测到一个错误时&#xff0c;Python解释器就无法继续执行了&#xff0c;反而出现了一些错误的提示&#xff0c;这就是所谓的“异常”, 也就是我们常说的BUG 例如&#xff1a;以r方式打开一个不存在的文件。 f open(‘python1.txt’,‘r’,encoding‘utf-8’) 当我们…