您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:python之json文件转xml文件案例讲解

51自学网 2021-10-30 22:24:40
  python
这篇教程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 jsonimport timeimport osfrom PIL import Imageimport cv2import 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内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net!


一篇文章弄懂Python中的内建函数
Python初识逻辑与if语句及用法大全
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。