labelme篇---用labelme将json数据转换成xml格式

labelme篇---用labelme将json数据转换成xml格式

1. 下载code

labelme

本人用的是labelme-master

2. 安装环境

本人是ubuntu22.04的环境

pip install labelme

3. 运行

运行以下代码
命令行如下:

python labelme2voc.py --labels=labels.txt data_annotated data_dataset_voc_self

注:
data_annotatedinput_dir
data_dataset_voc_selfoutput_dir

#!/usr/bin/env python
# fixme:python labelme2voc.py --labels=labels.txt data_annotated data_dataset_voc_self

from __future__ import print_function

import argparse
import glob
import os
import os.path as osp
import sys

import imgviz
import labelme

try:
    import lxml.builder
    import lxml.etree
except ImportError:
    print("Please install lxml:\n\n    pip install lxml\n")
    sys.exit(1)


def main():
    parser = argparse.ArgumentParser(
        formatter_class=argparse.ArgumentDefaultsHelpFormatter
    )
    parser.add_argument("input_dir", help="input annotated directory")
    parser.add_argument("output_dir", help="output dataset directory")
    parser.add_argument("--labels", help="labels file", required=True)
    parser.add_argument(
        "--noviz", help="no visualization", action="store_true"
    )
    args = parser.parse_args()

    if osp.exists(args.output_dir):
        print("Output directory already exists:", args.output_dir)
        sys.exit(1)
    os.makedirs(args.output_dir)
    os.makedirs(osp.join(args.output_dir, "JPEGImages"))
    os.makedirs(osp.join(args.output_dir, "Annotations"))
    if not args.noviz:
        os.makedirs(osp.join(args.output_dir, "AnnotationsVisualization"))
    print("Creating dataset:", args.output_dir)

    class_names = []
    class_name_to_id = {}
    for i, line in enumerate(open(args.labels).readlines()):
        class_id = i - 1  # starts with -1
        class_name = line.strip()
        class_name_to_id[class_name] = class_id
        if class_id == -1:
            assert class_name == "__ignore__"
            continue
        elif class_id == 0:
            assert class_name == "_background_"
        class_names.append(class_name)
    class_names = tuple(class_names)
    print("class_names:", class_names)
    out_class_names_file = osp.join(args.output_dir, "class_names.txt")
    with open(out_class_names_file, "w") as f:
        f.writelines("\n".join(class_names))
    print("Saved class_names:", out_class_names_file)

    for filename in glob.glob(osp.join(args.input_dir, "*.json")):
        print("Generating dataset from:", filename)

        label_file = labelme.LabelFile(filename=filename)

        base = osp.splitext(osp.basename(filename))[0]
        out_img_file = osp.join(args.output_dir, "JPEGImages", base + ".jpg")
        out_xml_file = osp.join(args.output_dir, "Annotations", base + ".xml")
        if not args.noviz:
            out_viz_file = osp.join(
                args.output_dir, "AnnotationsVisualization", base + ".jpg"
            )

        img = labelme.utils.img_data_to_arr(label_file.imageData)
        imgviz.io.imsave(out_img_file, img)

        maker = lxml.builder.ElementMaker()
        xml = maker.annotation(
            maker.folder(),
            maker.filename(base + ".jpg"),
            maker.database(),  # e.g., The VOC2007 Database
            maker.annotation(),  # e.g., Pascal VOC2007
            maker.image(),  # e.g., flickr
            maker.size(
                maker.height(str(img.shape[0])),
                maker.width(str(img.shape[1])),
                maker.depth(str(img.shape[2])),
            ),
            maker.segmented(),
        )

        bboxes = []
        labels = []
        for shape in label_file.shapes:
            if shape["shape_type"] != "rectangle":
                print(
                    "Skipping shape: label={label}, "
                    "shape_type={shape_type}".format(**shape)
                )
                continue

            class_name = shape["label"]
            class_id = class_names.index(class_name)

            (xmin, ymin), (xmax, ymax) = shape["points"]
            # swap if min is larger than max.
            xmin, xmax = sorted([xmin, xmax])
            ymin, ymax = sorted([ymin, ymax])

            bboxes.append([ymin, xmin, ymax, xmax])
            labels.append(class_id)

            xml.append(
                maker.object(
                    maker.name(shape["label"]),
                    maker.pose(),
                    maker.truncated(),
                    maker.difficult(),
                    maker.bndbox(
                        maker.xmin(str(xmin)),
                        maker.ymin(str(ymin)),
                        maker.xmax(str(xmax)),
                        maker.ymax(str(ymax)),
                    ),
                )
            )

        if not args.noviz:
            captions = [class_names[label] for label in labels]
            viz = imgviz.instances2rgb(
                image=img,
                labels=labels,
                bboxes=bboxes,
                captions=captions,
                font_size=15,
            )
            imgviz.io.imsave(out_viz_file, viz)

        with open(out_xml_file, "wb") as f:
            f.write(lxml.etree.tostring(xml, pretty_print=True))


if __name__ == "__main__":
    main()

运行结果如下:

在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
### 回答1: 将Labelme的JSON文件转换为XML格式,可以使用以下步骤: 1. 安装Python解释器和相关库,如xml.etree.ElementTree和json。 2. 打开JSON文件并读取其中的数据。 3. 创建一个XML根元素,并将JSON数据中的每个对象转换为XML元素。 4. 将XML元素添加到根元素中。 5. 将XML根元素写入XML文件中。 以下是一个示例Python代码,可将Labelme的JSON文件转换为XML格式: ```python import json import xml.etree.ElementTree as ET # 打开JSON文件并读取其中的数据 with open('labelme.json') as f: data = json.load(f) # 创建XML根元素 root = ET.Element('annotation') # 将JSON数据中的每个对象转换为XML元素 for obj in data['shapes']: element = ET.SubElement(root, 'object') ET.SubElement(element, 'name').text = obj['label'] ET.SubElement(element, 'xmin').text = str(obj['points'][][]) ET.SubElement(element, 'ymin').text = str(obj['points'][][1]) ET.SubElement(element, 'xmax').text = str(obj['points'][1][]) ET.SubElement(element, 'ymax').text = str(obj['points'][1][1]) # 将XML根元素写入XML文件中 tree = ET.ElementTree(root) tree.write('labelme.xml') ``` 在上面的代码中,我们假设JSON文件中包含一个名为“shapes”的数组,其中每个对象都包含一个名为“label”的属性和一个名为“points”的属性,该属性是一个包含两个点的数组,表示矩形的左上角和右下角。我们将每个对象转换为一个XML元素,并将其添加到XML根元素中。最后,我们将XML根元素写入名为“labelme.xml”的XML文件中。 ### 回答2: Labelme是一款常用的图像标注工具,它可以生成json格式的标注文件。但是在一些需要使用xml格式的任务中,需要将json格式转换为xml格式。以下是该转换过程的详细步骤。 1. 安装Python库:首先需要安装两个Python库,分别是jsonxml.etree.ElementTree。可以使用命令行输入“pip install library_name”来安装这两个库。 2. 读取json文件:使用Pythonjson库打开json格式的标注文件。 3. 创建根节点和子节点:使用xml.etree.ElementTree库创建一个根节点和一些子节点。根节点是包含标注信息的最外层节点,而子节点则包含了具体的标注信息。 4. 循环遍历标注信息:使用Python的for循环来遍历每一个标注信息。在循环中,使用子节点将标注信息添加到根节点中。 5. 保存xml文件:使用xml.etree.ElementTree库将xml格式的标注信息保存到一个文件中。在保存时,可以添加格式参数,以便浏览器和阅读器可以以美观的方式解释文件内容。 以下是一个示例代码段,用于将json格式的标注文件转换为xml格式: import json import xml.etree.ElementTree as ET with open('example.json') as json_file: data = json.load(json_file) root = ET.Element('annotation') filename = ET.SubElement(root, 'filename') filename.text = data['filename'] for obj in data['objects']: object_node = ET.SubElement(root, 'object') name_node = ET.SubElement(object_node, 'name') name_node.text = obj['name'] bbox_node = ET.SubElement(object_node, 'bndbox') xmin_node = ET.SubElement(bbox_node, 'xmin') xmin_node.text = str(obj['bbox'][0]) ymin_node = ET.SubElement(bbox_node, 'ymin') ymin_node.text = str(obj['bbox'][1]) xmax_node = ET.SubElement(bbox_node, 'xmax') xmax_node.text = str(obj['bbox'][2]) ymax_node = ET.SubElement(bbox_node, 'ymax') ymax_node.text = str(obj['bbox'][3]) tree = ET.ElementTree(root) tree.write('example.xml', xml_declaration=True, encoding='utf-8') 通过上述步骤,我们成功将json格式的标注文件转换为了xml格式,以便在其他任务中使用。需要注意的是,由于标注文件的内容可能会有所不同,因此在实际应用中,可能需要对上述代码进行适当的修改和调整。 ### 回答3: Labelme是一款强大的工具,可以使用它来创建语义分割的标注数据,在使用过程中,它会生成.json格式的标注数据文件。这是一个非常有用的文件格式,但是在某些情况下,我们会需要将.json文件转换成.xml文件,以方便其他应用程序的使用。 那么,如何将labelme json文件转换成xml文件呢?下面是具体的步骤: 第一步:准备工作 在开始转换之前,需要先安装Python解释器和相关的库。可以通过pip安装以下库: pip install lxml # 用于处理xml文件 pip install json # 用于解析json文件 同时,还需要将需要转换的.json文件保存在本地,并且打开一个文本编辑器准备将输出的内容粘贴进去。 第二步:编写代码 下面的Python代码可以将json文件转换成xml: ```python import json from lxml import etree def json2xml(json_obj): root = etree.Element("root") def parseJson(json_obj, parent): if isinstance(json_obj, dict): for key in json_obj: if isinstance(json_obj[key], list): node = etree.Element(key) parent.append(node) for element in json_obj[key]: sub_node = etree.Element("item") node.append(sub_node) parseJson(element, sub_node) else: node = etree.Element(key) parent.append(node) parseJson(json_obj[key], node) elif isinstance(json_obj, list): for element in json_obj: node = etree.Element("item") parent.append(node) parseJson(element, node) else: parent.text = json_obj parseJson(json_obj, root) return etree.tostring(root, pretty_print=True, encoding='utf-8').decode() if __name__ == '__main__': with open('test.json') as f: # 打开需要转换的json文件 data = f.read() json_obj = json.loads(data) xml_str = json2xml(json_obj) # 转换成xml格式 print(xml_str) # 输出xml ``` 第三步:运行代码 将上面的代码保存到本地,并运行代码,输出的结果就是我们要的.xml文件。 执行代码的时候,需要注意一些问题,比如json_obj的数据类型和转换的.encode()类型等问题。 总结 通过上面的操作步骤,我们就可以将生成的.json文件转换成.xml文件。这个过程可能需要运行几次才会得到想要的结果,但是只要你按照上述步骤操作,那么你就可以节省大量的时间和精力,从而加快你的工作效率。同时,要记得备份原来的.json文件,并进行适当的比对,以保证转换的准确性。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心惠天意

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值