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命名空间详解
Aug 18 Python
Python中扩展包的安装方法详解
Jun 14 Python
Python实现识别图片内容的方法分析
Jul 11 Python
Python编程深度学习计算库之numpy
Dec 28 Python
python paramiko利用sftp上传目录到远程的实例
Jan 03 Python
浅谈python3.x pool.map()方法的实质
Jan 16 Python
Python读写文件基础知识点
Jun 10 Python
python读取word 中指定位置的表格及表格数据
Oct 23 Python
python requests抓取one推送文字和图片代码实例
Nov 04 Python
如何用OpenCV -python3实现视频物体追踪
Dec 04 Python
pytorch 修改预训练model实例
Jan 18 Python
python函数指定默认值的实例讲解
Mar 29 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
sony ICF-2010 拆解与改装
2021/03/02 无线电
php Mysql日期和时间函数集合
2007/11/16 PHP
php 判断服务器操作系统的类型
2014/02/17 PHP
php利用cookie实现自动登录的方法
2014/12/10 PHP
PHP抓取及分析网页的方法详解
2016/04/26 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
24款非常有用的 jQuery 插件分享
2011/04/06 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
nodejs教程之入门
2014/11/21 NodeJs
基于Bootstrap+jQuery.validate实现Form表单验证
2014/12/16 Javascript
全面解析Bootstrap表单使用方法(表单控件状态)
2015/11/24 Javascript
微信小程序 SocketIO 实例讲解
2016/10/13 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
javascript设计模式之策略模式学习笔记
2017/02/15 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
2017/04/10 jQuery
JavaScript中 DOM操作方法小结
2017/04/25 Javascript
JS实现颜色的10进制转化成rgba格式的方法
2017/09/04 Javascript
JavaScript实用代码小技巧
2018/08/23 Javascript
vue中,在本地缓存中读写数据的方法
2018/09/21 Javascript
JS获取当前时间的实例代码(昨天、今天、明天)
2018/11/13 Javascript
JS中创建自定义类型的常用模式总结【工厂模式,构造函数模式,原型模式,动态原型模式等】
2019/01/19 Javascript
JS函数动态传递参数的方法分析【基于arguments对象】
2019/06/05 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
2020/10/16 Javascript
跟老齐学Python之编写类之三子类
2014/10/11 Python
python树莓派红外反射传感器
2019/01/21 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
Django框架用户注销功能实现方法分析
2019/05/28 Python
Python实例教程之检索输出月份日历表
2020/12/16 Python
领导接待方案
2014/03/13 职场文书
公司应聘求职信
2014/06/21 职场文书
社区两委对照检查材料
2014/08/23 职场文书
招标授权委托书样本
2014/09/23 职场文书
离婚财产处理协议书
2014/09/30 职场文书
2016年小学优秀班主任事迹材料
2016/02/29 职场文书
分享15个Webpack实用的插件!!!
2021/03/31 Javascript