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 相关文章推荐
Linux下编译安装MySQL-Python教程
Feb 02 Python
python僵尸进程产生的原因
Jul 21 Python
Python类的继承和多态代码详解
Dec 27 Python
python 每天如何定时启动爬虫任务(实现方法分享)
May 21 Python
python 处理telnet返回的More,以及get想要的那个参数方法
Feb 14 Python
Python实现的微信支付方式总结【三种方式】
Apr 13 Python
python使用opencv在Windows下调用摄像头实现解析
Nov 26 Python
简单了解django文件下载方式
Feb 10 Python
Python带参数的装饰器运行原理解析
Jun 09 Python
学会用Python实现滑雪小游戏,再也不用去北海道啦
May 20 Python
Python获取江苏疫情实时数据及爬虫分析
Aug 02 Python
python之json文件转xml文件案例讲解
Aug 07 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
虹吸壶是谁发明的?煮出来的咖啡好喝吗
2021/03/04 冲泡冲煮
phpmailer发送gmail邮件实例详解
2013/06/24 PHP
PHP微信分享开发详解
2017/01/14 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
2019/10/01 PHP
PHP学习记录之常用的魔术常量详解
2019/12/12 PHP
filters.revealTrans.Transition使用方法小结
2010/08/19 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
JS获得浏览器版本和操作系统版本的例子
2014/05/13 Javascript
JS实现闪动的title消息提醒效果
2014/06/20 Javascript
Javascript 函数的四种调用模式
2016/11/05 Javascript
jquery实现多次上传同一张图片
2017/01/09 Javascript
JS实现复制内容到剪贴板功能
2017/02/05 Javascript
基于JavaScript实现五子棋游戏
2020/08/26 Javascript
js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能
2018/01/09 Javascript
axios异步提交表单数据的几种方法
2019/08/11 Javascript
用Python编程实现语音控制电脑
2014/04/01 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
python-tornado的接口用swagger进行包装的实例
2019/08/29 Python
Python中的四种交换数值的方法解析
2019/11/18 Python
TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现
2020/02/17 Python
python else语句在循环中的运用详解
2020/07/06 Python
Ubuntu配置Pytorch on Graph (PoG)环境过程图解
2020/11/19 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
2020/12/14 Python
美国排名第一的在线葡萄酒商店:Wine.com
2016/09/07 全球购物
英国二手物品交易网站:Preloved
2017/10/06 全球购物
丝绸和人造花卉、植物和树木:Nearly Natural
2018/11/28 全球购物
丹麦优惠购物网站:PLUSSHOP
2019/03/24 全球购物
UNOde50美国官网:西班牙珠宝品牌
2020/08/15 全球购物
工程专业求职自荐书范文
2014/02/18 职场文书
我的中国梦演讲稿高中篇
2014/08/19 职场文书
物业工程部主管岗位职责
2015/04/16 职场文书
离婚起诉书范文2016
2015/11/26 职场文书
调解协议书范本
2016/03/21 职场文书
golang 实现并发求和
2021/05/08 Golang
灵能百分百第三季什么时候来?
2022/03/15 日漫
Nginx的gzip相关介绍
2022/05/11 Servers