python之json文件轉xml文件案例講解
json文件格式
這是yolov4模型跑出來的檢測結果result.json
下面是截取的一張圖的檢測結果
{ "frame_id":1, #圖片的序號 "filename":"/media/wuzhou/Gap/rgb-piglet/test/00000000.jpg", #圖片的路徑 "objects": [ #該圖中所有的目標:目標類別、目標名稱、歸一化的框的坐標(xywh格式)、置信度 {"class_id":0, "name":"pp", "relative_coordinates":{"center_x":0.750913, "center_y":0.402691, "width":0.038380, "height":0.193304}, "confidence":0.995435}, {"class_id":0, "name":"pp", "relative_coordinates":{"center_x":0.764775, "center_y":0.199255, "width":0.049979, "height":0.130169}, "confidence":0.994495}, {"class_id":0, "name":"pp", "relative_coordinates":{"center_x":0.560050, "center_y":0.482614, "width":0.036331, "height":0.166377}, "confidence":0.994460}, {"class_id":0, "name":"pp", "relative_coordinates":{"center_x":0.710756, "center_y":0.406446, "width":0.041782, "height":0.191297}, "confidence":0.993540}, {"class_id":0, "name":"pp", "relative_coordinates":{"center_x":0.638335, "center_y":0.238725, "width":0.107689, "height":0.092282}, "confidence":0.992926}, {"class_id":0, "name":"pp", "relative_coordinates":{"center_x":0.780232, "center_y":0.448454, "width":0.041550, "height":0.179540}, "confidence":0.990020}, {"class_id":0, "name":"pp", "relative_coordinates":{"center_x":0.563412, "center_y":0.350035, "width":0.103184, "height":0.059460}, "confidence":0.979756}, {"class_id":0, "name":"pp", "relative_coordinates":{"center_x":0.522591, "center_y":0.195170, "width":0.083014, "height":0.071478}, "confidence":0.970642}, {"class_id":0, "name":"pp", "relative_coordinates":{"center_x":0.658721, "center_y":0.154640, "width":0.103852, "height":0.055686}, "confidence":0.967082}, {"class_id":0, "name":"pp", "relative_coordinates":{"center_x":0.537660, "center_y":0.256810, "width":0.101619, "height":0.095211}, "confidence":0.918135}, {"class_id":0, "name":"pp", "relative_coordinates":{"center_x":0.528618, "center_y":0.481005, "width":0.033226, "height":0.177723}, "confidence":0.310291} ] },
完整代碼
代碼需要指定圖片的路徑,例如 file_dir = “H:/rgb-piglet/five/test”
註意:result.json文件要跟圖片放一起
代碼生成的xml與圖片在同一個路徑下
import json import time import os from PIL import Image import cv2 import numpy as np '''人為構造xml文件的格式''' out0 ='''<annotation> <folder>%(folder)s</folder> <filename>%(name)s</filename> <path>%(path)s</path> <source> <database>None</database> </source> <size> <width>%(width)d</width> <height>%(height)d</height> <depth>3</depth> </size> <segmented>0</segmented> ''' out1 = ''' <object> <name>%(class)s</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>%(xmin)d</xmin> <ymin>%(ymin)d</ymin> <xmax>%(xmax)d</xmax> <ymax>%(ymax)d</ymax> </bndbox> </object> ''' out2 = '''</annotation> ''' def read_json(json_dir): with open(json_dir,"r") as f: data = json.load(f) print(type(data),len(data),type(data[0]),data[0]['frame_id']) return data '''txt轉xml函數''' def translate(fdir,lists): source = {} label = {} data = read_json(fdir+"/result.json") k = 0 for jpg in lists: print(jpg) if jpg[-4:] == '.jpg': image= cv2.imread(jpg)#路徑不能有中文 h,w,_ = image.shape #圖片大小 fxml = jpg.replace('.jpg','.xml') fxml = open(fxml, 'w'); imgfile = jpg.split('/')[-1] source['name'] = imgfile source['path'] = jpg source['folder'] = os.path.basename(fdir) source['width'] = w source['height'] = h fxml.write(out0 % source) for obj in data[k]["objects"]: label['class'] = obj["class_id"] box = obj["relative_coordinates"] '''把txt上的數字(歸一化)轉成xml上框的坐標''' xmin = float(box["center_x"] - 0.5*box["width"])*w ymin = float(box["center_y"] - 0.5*box["height"])*h xmax = float(xmin + box["width"]*w) ymax = float(ymin + box["height"]*h) label['xmin'] = xmin label['ymin'] = ymin label['xmax'] = xmax label['ymax'] = ymax fxml.write(out1 % label) k = k+1 fxml.write(out2) if __name__ == '__main__': file_dir = "H:/rgb-piglet/five/test" lists=[] for i in os.listdir(file_dir): if i[-3:]=='jpg': lists.append(file_dir+'/'+i) #print(lists) translate(file_dir,lists) print('---------------Done!!!--------------')
到此這篇關於python之json文件轉xml文件案例講解的文章就介紹到這瞭,更多相關python之json文件轉xml內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 三分鐘教會你用Python+OpenCV批量裁剪xml格式標註的圖片
- C++中TinyXML讀取xml文件用法詳解
- python批量修改xml文件中的信息
- arcgis.js控制地圖地體的顯示范圍超出區域自動彈回(實現思路)
- Python實現蟻群算法