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


Posted in Python onAugust 07, 2021

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

到此这篇关于python之json文件转xml文件案例讲解的文章就介绍到这了,更多相关python之json文件转xml内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
关于Python中异常(Exception)的汇总
Jan 18 Python
Python 常用的安装Module方式汇总
May 06 Python
pycharm下查看python的变量类型和变量内容的方法
Jun 26 Python
使用Python读取二进制文件的实例讲解
Jul 09 Python
Python wxpython模块响应鼠标拖动事件操作示例
Aug 23 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
Jun 05 Python
python自定义函数实现最大值的输出方法
Jul 09 Python
Python Opencv任意形状目标检测并绘制框图
Jul 23 Python
简单了解django文件下载方式
Feb 10 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
Jun 10 Python
python 两种方法修改文件的创建时间、修改时间、访问时间
Sep 26 Python
python 实现体质指数BMI计算
May 26 Python
一篇文章弄懂Python中的内建函数
Aug 07 #Python
Python 可迭代对象 iterable的具体使用
Aug 07 #Python
Python pandas之求和运算和非空值个数统计
Aug 07 #Python
关于Python中*args和**kwargs的深入理解
Aug 07 #Python
python3操作redis实现List列表实例
Aug 04 #Python
Python pandas求方差和标准差的方法实例
Aug 04 #Python
pandas求平均数和中位数的方法实例
Aug 04 #Python
You might like
PHP实现域名whois查询的代码(数据源万网、新网)
2010/02/22 PHP
sphinx增量索引的一个问题
2011/06/14 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
2013/04/28 PHP
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
JScript分割字符串示例代码
2013/09/04 Javascript
JS批量操作CSS属性详细解析
2013/12/16 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
JS控制表单提交的方法
2015/07/09 Javascript
基于Bootstrap重置输入框内容按钮插件
2016/05/12 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
JavaScript中windows.open()、windows.close()方法详解
2016/07/28 Javascript
jQuery继承extend用法详解
2016/10/10 Javascript
webpack3+React 的配置全解
2017/08/21 Javascript
vue实现鼠标移入移出事件代码实例
2019/03/27 Javascript
Vue 理解之白话 getter/setter详解
2019/04/16 Javascript
js回溯法计算最佳旅行线路代码实例
2019/09/11 Javascript
JavaScript 作用域scope简单汇总
2019/10/23 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
2019/10/29 Javascript
如何配置vue.config.js 处理static文件夹下的静态文件
2020/06/19 Javascript
[55:23]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
利用python模拟sql语句对员工表格进行增删改查
2017/07/05 Python
python如何实现int函数的方法示例
2018/02/19 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
python如何快速生成时间戳
2020/07/21 Python
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
美国高端牛仔品牌:Silver Jeans
2019/12/12 全球购物
100%羊绒:NakedCashmere
2020/08/26 全球购物
Python里面如何实现tuple和list的转换
2012/06/13 面试题
教师演讲稿范文
2014/01/08 职场文书
《伯牙绝弦》教学反思
2014/03/02 职场文书
公司法人授权委托书范本
2014/09/12 职场文书
开发房地产协议书
2014/09/14 职场文书
文明和谐家庭事迹材料(2016精选版)
2016/02/29 职场文书
30岁前绝不能错过的10本书
2019/08/08 职场文书