• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Python中rapidjson参数校验实现
    • Python常用配置文件ini、json、yaml读写总结
    • Python中json.load()和json.loads()有哪些区别
    • Python中json.dumps()函数的使用解析
    • python 存储json数据的操作
    • 解决python3 json数据包含中文的读写问题
    • python json.dumps中文乱码问题解决
    • Python如何把不同类型数据的json序列化
    上一篇:一篇文章弄懂Python中的内建函数
    下一篇:python非标准时间的转换
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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