网络编程
位置:首页>> 网络编程>> Python编程>> python之json文件转xml文件案例讲解

python之json文件转xml文件案例讲解

作者:G果  发布时间:2021-11-18 04:54:23 

标签:python,json

json文件格式

这是yolov4模型跑出来的检测结果result.json

python之json文件转xml文件案例讲解

下面是截取的一张图的检测结果


{
"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!!!--------------')            

来源:https://blog.csdn.net/weixin_42899627/article/details/118373040

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com