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实现无证书加密解密实例
Oct 27 Python
django通过ajax发起请求返回JSON格式数据的方法
Jun 04 Python
Python使用urllib2模块抓取HTML页面资源的实例分享
May 03 Python
Python3实现获取图片文字里中文的方法分析
Dec 13 Python
Python命名空间的本质和加载顺序
Dec 17 Python
Django REST framework 分页的实现代码
Jun 19 Python
Python 中list ,set,dict的大规模查找效率对比详解
Oct 11 Python
Python使用requests模块爬取百度翻译
Aug 25 Python
python中翻译功能translate模块实现方法
Dec 17 Python
如何理解python接口自动化之logging日志模块
Jun 15 Python
python中%格式表达式实例用法
Jun 18 Python
Pygame Rect区域位置的使用(图文)
Nov 17 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访问查询mysql数据的三种方法
2006/10/09 PHP
自定义php类(查找/修改)xml文档
2013/03/26 PHP
php5.4传引用时报错问题分析
2016/01/22 PHP
Zend Framework教程之模型Model用法简单实例
2016/03/04 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
javascript实现日历控件(年月日关闭按钮)
2012/12/12 Javascript
ExtJS中设置下拉列表框不可编辑的方法
2014/05/07 Javascript
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
2014/09/26 NodeJs
解决node.js安装包失败的几种方法
2016/09/02 Javascript
nodejs中安装ghost出错的原因及解决方法
2017/10/23 NodeJs
使用Vue-Router 2实现路由功能实例详解
2017/11/14 Javascript
jQuery+koa2实现简单的Ajax请求的示例
2018/03/06 jQuery
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
JS中如何轻松遍历对象属性的方式总结
2019/08/06 Javascript
VUE实现图片验证码功能
2020/11/18 Javascript
解决axios post 后端无法接收数据的问题
2019/10/29 Javascript
微信小程序实现签字功能
2019/12/23 Javascript
[09:33]2015国际邀请赛第四日TOP10
2015/08/08 DOTA
Python的collections模块中的OrderedDict有序字典
2016/07/07 Python
Python实现删除时保留特定文件夹和文件的示例
2018/04/27 Python
Python3基础教程之递归函数简单示例
2019/06/07 Python
HTML的form表单和django的form表单
2019/07/25 Python
python利用re,bs4,requests模块获取股票数据
2019/07/29 Python
python如何安装下载后的模块
2020/07/03 Python
python实现按日期归档文件
2021/01/30 Python
英国最专业的健身器材供应商之一:Best Gym Equipment
2017/12/22 全球购物
英国二手iPhone、音乐、电影和游戏商店:musicMagpie
2018/10/26 全球购物
Booking.com缤客中国:全球酒店在线预订网站
2020/05/03 全球购物
优秀大学生的自我评价
2014/01/16 职场文书
演讲比赛获奖感言
2014/02/02 职场文书
领导欢迎词致辞
2015/01/23 职场文书
团代会闭幕词
2015/01/28 职场文书
纪录片信仰观后感
2015/06/08 职场文书
生日赠语
2015/06/23 职场文书
2016年社区“我们的节日·中秋节”活动总结
2016/04/05 职场文书
什么是动态刷新率DRR? Windows11动态刷新率功能介绍
2021/11/21 数码科技