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定时检查某个进程是否已经关闭的方法
May 20 Python
日常整理python执行系统命令的常见方法(全)
Oct 22 Python
python实现求最长回文子串长度
Jan 22 Python
tensorflow 获取变量&amp;打印权值的实例讲解
Jun 14 Python
Python实现Linux监控的方法
May 16 Python
Python中的十大图像处理工具(小结)
Jun 10 Python
Python替换月份为英文缩写的实现方法
Jul 15 Python
Django框架基础模板标签与filter使用方法详解
Jul 23 Python
如何给Python代码进行加密
Jan 10 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
Feb 10 Python
学会python自动收发邮件 代替你问候女友
May 20 Python
python对 MySQL 数据库进行增删改查的脚本
Oct 22 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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
随时给自己贴的图片加文字的php水印
2007/03/16 PHP
mac下使用brew配置环境的步骤分享
2011/05/23 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
javascript 对象的定义方法
2007/01/10 Javascript
JavaScript与DOM组合动态创建表格实例
2012/12/23 Javascript
jquery的父子兄弟节点查找示例代码
2014/03/03 Javascript
基于js实现投票的实例代码
2015/08/04 Javascript
基于jquery css3实现点击动画弹出表单源码特效
2015/08/31 Javascript
第一次接触Bootstrap框架
2016/10/24 Javascript
JS遍历对象属性的方法示例
2017/01/10 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
JS原生数据双向绑定实现代码
2017/08/14 Javascript
vue-cli 默认路由再子路由选中下的选中状态问题及解决代码
2018/09/06 Javascript
vue-cli项目修改文件热重载失效的解决方法
2018/09/19 Javascript
Angular8路由守卫原理和使用方法
2019/08/29 Javascript
JS实现简易留言板特效
2019/12/23 Javascript
Element-UI+Vue模式使用总结
2020/01/02 Javascript
vue项目中在可编辑div光标位置插入内容的实现代码
2020/01/07 Javascript
[04:42]5分钟带你了解什么是DOTA2(第一期)
2017/02/07 DOTA
Python连接mssql数据库编码问题解决方法
2015/01/01 Python
10款最好的Web开发的 Python 框架
2015/03/18 Python
Python彩色化Linux的命令行终端界面的代码实例分享
2016/07/02 Python
使用Py2Exe for Python3创建自己的exe程序示例
2018/10/31 Python
python实现淘宝秒杀脚本
2020/06/23 Python
python使用matplotlib画柱状图、散点图
2019/03/18 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
2020/10/12 Python
Html5踩坑记之mandMobile使用小记
2020/04/02 HTML / CSS
马来西亚最热门的在线时尚商店:FashionValet
2018/11/11 全球购物
事业单位绩效考核实施方案
2014/03/27 职场文书
槐乡的孩子教学反思
2014/04/27 职场文书
2014年母亲节演讲稿范文
2014/05/07 职场文书
党员民主生活会整改措施
2014/09/26 职场文书
工作业绩不及格检讨书
2014/10/28 职场文书
2015年见习期工作总结
2014/12/12 职场文书
jquery插件实现搜索历史
2021/04/24 jQuery