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

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)

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值