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的Scrapy爬虫框架简单学习笔记
Jan 20 Python
浅谈python中set使用
Jun 30 Python
简单实现python收发邮件功能
Jan 05 Python
Python求出0~100以内的所有素数
Jan 23 Python
python编程嵌套函数实例代码
Feb 11 Python
Python2和Python3的共存和切换使用
Apr 12 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
Jun 04 Python
Django xadmin开启搜索功能的实现
Nov 15 Python
Python urllib2运行过程原理解析
Jun 04 Python
python datetime时间格式的相互转换问题
Jun 11 Python
PyCharm2020.3.2安装超详细教程
Feb 08 Python
简述python四种分词工具,盘点哪个更好用?
Apr 13 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
使用 MySQL 开始 PHP 会话
2006/12/21 PHP
php判断输入不超过mysql的varchar字段的长度范围
2011/06/24 PHP
php json_encode()函数返回json数据实例代码
2014/10/10 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
2015/11/27 PHP
PHP的Yii框架的常用日志操作总结
2015/12/08 PHP
详解PHP的Yii框架中扩展的安装与使用
2016/04/01 PHP
详解PHP使用Redis存储session时的一个Warning定位
2017/07/05 PHP
Microsoft Ajax Minifier 压缩javascript的方法
2010/03/05 Javascript
基于JQuery实现相同内容合并单元格的代码
2011/01/12 Javascript
js常用代码段整理
2011/11/30 Javascript
jquery validate在ie8下的bug解决方法
2013/11/13 Javascript
浏览器窗口加载和大小改变事件示例
2014/02/27 Javascript
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
2015/10/21 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
React实践之Tree组件的使用方法
2017/09/30 Javascript
AngularJS使用ui-route实现多层嵌套路由的示例
2018/01/10 Javascript
vue组件实现进度条效果
2018/06/06 Javascript
浅谈Vue组件及组件的注册方法
2018/08/24 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
2018/11/15 Javascript
layui table动态表头 改变表格头部 重新加载表格的方法
2019/09/21 Javascript
微信小程序如何获取地址
2019/12/24 Javascript
[01:24]DOTA2上海特锦赛OG战队抵达 专车接机入驻总统套房
2016/02/23 DOTA
在Linux上安装Python的Flask框架和创建第一个app实例的教程
2015/03/30 Python
在Python的Django框架中包装视图函数
2015/07/20 Python
Python 3.x基于Xml数据的Http请求方法
2018/12/28 Python
python Popen 获取输出,等待运行完成示例
2019/12/30 Python
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
学习新党章思想汇报
2014/01/09 职场文书
警察先进个人事迹材料
2014/05/16 职场文书
商场父亲节活动方案
2014/08/27 职场文书
让生命充满爱观后感
2015/06/08 职场文书
2016暑期校本培训心得体会
2016/01/08 职场文书
python 解决微分方程的操作(数值解法)
2021/05/26 Python
html实现弹窗的实例
2021/06/09 HTML / CSS
《战锤40K:暗潮》跳票至9月 公布新宣传片
2022/04/03 其他游戏