將 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.pswp.cn/web/80371.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80371.shtml
英文地址,請注明出處:http://en.pswp.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’) 當我們…