json文件批量转成VOC格式下xml文件(labelme标注的仅有关键点,无框)

最近使用labelme标注一些关键点,json文件如下:

在这里插入图片描述

使用批量转换程序可以将这些标注文件转换成xml格式,转换结果如下:

在这里插入图片描述
所用程序如下,对应更改目录即可:

'''
labelme标注工具标注一些关键点,没有标注框,此程序用于将这些json文件批量转成VOC格式的xml文件
'''
import json
import os
import xml.etree.ElementTree as ET

def json_to_xml(json_file, xml_file):
    with open(json_file, 'r') as f:
        data = json.load(f)

    root = ET.Element('annotation')

    folder = ET.SubElement(root, 'folder')
    folder.text = 'VOC2007'  # 替换为你自己的文件夹名称

    filename = ET.SubElement(root, 'filename')
    filename.text = os.path.splitext(os.path.basename(json_file))[0] + '.jpg'  # 将 .json 文件的文件名替换为对应的 .jpg 文件名

    size = ET.SubElement(root, 'size')
    width = ET.SubElement(size, 'width')
    width.text = str(data['imageWidth'])
    height = ET.SubElement(size, 'height')
    height.text = str(data['imageHeight'])
    depth = ET.SubElement(size, 'depth')
    depth.text = '3'  # 如果您的图像是灰度图像,请将此值更改为 1

    for shape in data['shapes']:
        if shape['shape_type'] == 'point':  # 仅处理关键点类型的标注
            point = shape['points'][0]

            object_node = ET.SubElement(root, 'object')
            name = ET.SubElement(object_node, 'name')
            name.text = shape['label']
            pose = ET.SubElement(object_node, 'pose')
            pose.text = 'Unspecified'
            truncated = ET.SubElement(object_node, 'truncated')
            truncated.text = '0'
            difficult = ET.SubElement(object_node, 'difficult')
            difficult.text = '0'
            bndbox = ET.SubElement(object_node, 'bndbox')
            xmin_node = ET.SubElement(bndbox, 'xmin')
            xmin_node.text = str(int(point[0]))
            ymin_node = ET.SubElement(bndbox, 'ymin')
            ymin_node.text = str(int(point[1]))
            xmax_node = ET.SubElement(bndbox, 'xmax')
            xmax_node.text = str(int(point[0]))
            ymax_node = ET.SubElement(bndbox, 'ymax')
            ymax_node.text = str(int(point[1]))

    tree = ET.ElementTree(root)
    tree.write(xml_file, encoding='utf-8', xml_declaration=True)

if __name__ == '__main__':
    input_dir = '\json'  # 输入目录
    output_dir = '\xml输出'  # 输出目录

    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    for filename in os.listdir(input_dir):
        if filename.endswith('.json'):
            json_file = os.path.join(input_dir, filename)
            xml_file = os.path.join(output_dir, os.path.splitext(filename)[0] + '.xml')
            json_to_xml(json_file, xml_file)

注:这是一期代码共享文章,在接下来的时间里,会陆陆续续将自己在进行实验的一些程序给公开出来,由于能力有限,部分是借鉴来的,所以如果有侵权请联系博主。

另外,做这个系列只是为了方便后人使用,无任何其他目的,如果对您有帮助,不要忘了点赞哦!!!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐