如何从json格式转为xml格式(训练yolo模型数据)

json格式:

{
    "labels": [
        {
            "annotations": [
                {
                    "class": "knife",
                    "height": 77.63582481705328,
                    "width": 75.10936905385375,
                    "x": 9.263671131731718,
                    "y": 229.0653225300934
                },
                {
                    "class": "pedestrain",
                    "height": 416.0,
                    "width": 194.0,
                    "x": 53.0,
                    "y": 9.0
                }
            ],
            "class": "image",
            "filename": "1.jpg"
        },
        {
            "annotations": [
                {
                    "class": "knife",
                    "height": 41.42329221119296,
                    "width": 42.26544413225947,
                    "x": 3.3686076842660793,
                    "y": 103.58468629118194
                },
                {
                    "class": "pedestrain",
                    "height": 204.0,
                    "width": 112.0,
                    "x": 33.0,
                    "y": 4.0
                }
            ],
            "class": "image",
            "filename": "2.jpg"
        }
    ]
}

xml格式:

<annotation>
<folder>voc2007</folder>
<filename>1.jpg</filename>
<size>
<width>262</width>
<height>449</height>
<depth>3</depth>
</size>
<object>
<name>knife</name>
<pose>undefine</pose>
<truncated>undefine</truncated>
<difficute>0</difficute>
<bndbox>
<xmin>9.263671131731718</xmin>
<ymin>229.0653225300934</ymin>
<xmax>84.37304018558547</xmax>
<ymax>306.7011473471467</ymax>
</bndbox>
</object>
<object>
<name>pedestrain</name>
<pose>undefine</pose>
<truncated>undefine</truncated>
<difficute>0</difficute>
<bndbox>
<xmin>53.0</xmin>
<ymin>9.0</ymin>
<xmax>247.0</xmax>
<ymax>425.0</ymax>
</bndbox>
</object>
</annotation>

json转xml代码:

import json
import os
from xml.dom.minidom import parseString
import xml.dom.minidom
import cv2
import numpy as np
from tqdm import tqdm

json_path = r"C:\Users\9ling\Desktop\knife\files\disposal_testdata_1130\disposal_testdata_1130.json"
xml_path = r"C:\Users\9ling\Desktop\knife\Annotations"
jpgs_path = r"C:\Users\9ling\Desktop\knife\JPEGImages"
jdata = json.load(open(json_path))["labels"]

_ROOT_NODE = 'annotation'
_FOLDER_NODE = 'voc2007'


# 封装创建节点的过程
def createElementNode(doc, tag, attr):  # 创建一个元素节点
    element_node = doc.createElement(tag)
    # 创建一个文本节点
    text_node = doc.createTextNode(attr)
    # 将文本节点作为元素节点的子节点
    element_node.appendChild(text_node)
    return element_node


def createChildNode(doc, tag, attr, parent_node):
    child_node = createElementNode(doc, tag, attr)
    parent_node.appendChild(child_node)


if __name__ == '__main__':
    for s_jd in tqdm(jdata):
        xml_filename = os.path.join(xml_path, s_jd["filename"].split(".")[0] + ".xml")
        img_path = os.path.join("\\".join(json_path.split("\\")[:-1]), s_jd["filename"])
        im = cv2.imdecode(np.fromfile(img_path), 1)
        if im is None:
            im = cv2.imread(img_path, 1)
        cv2.imwrite(os.path.join(jpgs_path, s_jd["filename"]), im)
        height, width, channel = im.shape

        """创建xml框架"""
        my_dom = xml.dom.getDOMImplementation()
        doc = my_dom.createDocument(None, _ROOT_NODE, None)
        # 获得根节点
        root_node = doc.documentElement
        # folder节点
        createChildNode(doc, 'folder', _FOLDER_NODE, root_node)
        # filename节点
        createChildNode(doc, 'filename', s_jd["filename"], root_node)
        print("正在创建各个结点中...")
        # size节点
        size_node = doc.createElement('size')
        # size子节点
        createChildNode(doc, 'width', str(width), size_node)
        createChildNode(doc, 'height', str(height), size_node)
        createChildNode(doc, 'depth', str(channel), size_node)
        root_node.appendChild(size_node)

        labels = []
        xmin, ymin, xmax, ymax = [], [], [], []
        for i in range(len(s_jd["annotations"])):
            if "x" not in s_jd["annotations"][i] or "y" not in s_jd["annotations"][i] or "width" not in \
                    s_jd["annotations"][i] or "height" not in s_jd["annotations"][i]:
                labels.append(0), xmin.append(0), ymin.append(0), xmax.append(0), ymax.append(0)
                continue
            xmin.append(s_jd["annotations"][i]["x"])
            ymin.append(s_jd["annotations"][i]["y"])
            xmax.append(s_jd["annotations"][i]["x"] + s_jd["annotations"][i]["width"])
            ymax.append(s_jd["annotations"][i]["y"] + s_jd["annotations"][i]["height"])
            labels.append(s_jd["annotations"][i]["class"])

            # object节点
            object_node = doc.createElement('object')
            # object的子节点
            createChildNode(doc, 'name', str(labels[i]), object_node)
            createChildNode(doc, 'pose', 'undefine', object_node)
            createChildNode(doc, 'truncated', 'undefine', object_node)
            createChildNode(doc, 'difficute', str(0), object_node)
            # 创建object子节点bndbox的子节点
            bndbox_node = doc.createElement('bndbox')
            createChildNode(doc, 'xmin', str(xmin[i]), bndbox_node)
            createChildNode(doc, 'ymin', str(ymin[i]), bndbox_node)
            createChildNode(doc, 'xmax', str(xmax[i]), bndbox_node)
            createChildNode(doc, 'ymax', str(ymax[i]), bndbox_node)
            object_node.appendChild(bndbox_node)
            root_node.appendChild(object_node)

        with open('tmp.xml', 'w', encoding='utf-8') as f:
            doc.writexml(f, indent='\t', addindent='\t', newl='\n', encoding="utf-8")
        f.close()
        fin = open('tmp.xml')
        fout = open(xml_filename, 'w')
        lines = fin.readlines()
        for line in lines[1:]:
            if line.split():
                fout.writelines(line)
        fin.close()
        fout.close()

参考:链接1

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值