labelme中json转xml

该代码实现了一个Python脚本,用于读取包含图像标注信息的JSON文件,删除不必要的数据,然后生成对应的XML文件。脚本中包含了获取坐标中心点、美化XML内容的函数,并特别关注了坐标转换问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读取json文件,删除不需要的信息,生成对应xml文件。在生成过程中需要注意坐标问题,看是否需要转换。


import os,glob,json
import xml.etree.ElementTree as ET
from pathlib import Path
import numpy as np

#获得中心点的坐标
def get_cx_cy(points):
    cx = (points[0][0]+points[1][0])/2.
    cy = (points[0][1]+points[1][1])/2.
    points = np.array(points)
    xmin = min(points[:, 0])
    xmax = max(points[:, 0])
    ymin = min(points[:, 1])
    ymax = max(points[:, 1])
    w = max(points[:,0])-min(points[:,0])
    h = max(points[:,1])-min(points[:,1])
    return xmin, xmax, ymin, ymax

#美化内容(+换行)
def indent(elem,level=0):
    i = "\n" + level * "  "
    if len(elem):
        if not elem.text or not elem.text.strip():
            elem.text = i + "  "
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
        for elem in elem:
            indent(elem, level + 1)
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
    else:
        if level and (not elem.tail or not elem.tail.strip()):
            elem.tail = i

#写入xml文件
def write_xml(data,imgpath,savepath):
    root = ET.Element('annotation') #创建节点
    tree = ET.ElementTree(root) #创建文档
    #图片文件上一级目录
    folder = ET.Element("folder")
    img_folder = imgpath.split(os.sep)[-2]
    folder.text = img_folder
    root.append(folder)
    #文件名
    imgname = Path(imgpath).stem
    #imgname = os.path.basename(imgpath)
    filename = ET.Element("filename")
    filename.text = imgname + ".png"
    root.append(filename)

    #路径
    path = ET.Element("path")
    path.text = imgpath
    root.append(path)

    #source
    source = ET.Element("source")
    root.append(source)
    database = ET.Element("database")
    database.text = "Unknown"
    source.append(database)

    #size
    size = ET.Element("size")
    root.append(size)
    width = ET.Element("width") #宽
    width.text = str(data["imageWidth"])
    size.append(width)
    height = ET.Element("height")#高
    height.text = str(data["imageHeight"])
    size.append(height)
    depth = ET.Element("depth") #深度
    depth.text = str(3)
    size.append(depth)

    #segmented
    segmented = ET.Element("segmented")
    segmented.text = str(0)
    root.append(segmented)

    # 目标
    for shape in data["shapes"]:
        object_ = ET.Element("object")
        root.append(object_)
        #标注框类型
        # type_ = ET.Element("type")
        # type_.text = "bndbox"
        # object_.append(type_)
        #目标类别
        name = ET.Element("name")
        name.text = shape["label"]
        object_.append(name)
        #pose
        pose = ET.Element("pose")
        pose.text = "Unspecified"
        object_.append(pose)
        #截断情况
        truncated = ET.Element("truncated")
        truncated.text = str(0) #默认为0,表示未截断
        object_.append(truncated)
        #样本困难度
        # difficult = ET.Element("difficult")
        # difficult.text = str(0) #默认为0,表示非困难样本
        # object_.append(difficult)
        #四个端点
        bndbox = ET.Element("bndbox")
        object_.append(bndbox)
        # 获得中心点的坐标和宽高
        xmin, xmax, ymin, ymax = get_cx_cy(shape["points"])

        # 看你的xml文件中需要保存的内容
        xmin_ = ET.Element("xmin")
        xmin_.text = str(xmin)
        bndbox.append(xmin_)
        #cy
        ymin_ = ET.Element("ymin")
        ymin_.text = str(ymin)
        bndbox.append(ymin_)
        #w
        xmax_ = ET.Element("xmax")
        xmax_.text = str(xmax)
        bndbox.append(xmax_)
        #h
        ymax_ = ET.Element("ymax")
        ymax_.text = str(ymax)
        bndbox.append(ymax_)
        # #angle
        # angle = ET.Element("angle")
        # angle.text = str(0.0)
        # bndbox.append(angle)

    indent(root,0)
    tree.write(savepath+os.sep+imgname+".xml","UTF-8",xml_declaration=True)

#解析json文件
def load_json(jsonpath):
    data = json.load(open(jsonpath,"r"))
    del data["version"]
    try:
        del data["flags"]
    except Exception as e:
        del data["flag"]
    del data["imagePath"]
    del data["imageData"]
    return data

if __name__ == '__main__':
    json_dir = r"\dataset_class\json"    #原json文件的路径
    imgpath = r"\dataset_class\daisha"
    save_dir = r"\dataset_class\xml"   #保存文件夹路径
    os.makedirs(save_dir,exist_ok=True)
    json_file = os.listdir(json_dir)
    for i in range(len(json_file)):
        jsonpath = os.path.join(json_dir,str(json_file[i]))
        imgpath = jsonpath.replace(".json", ".png")
        # 加载json文件中的数据,获得data
        data = load_json(jsonpath)
        write_xml(data, imgpath, save_dir)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

。七十二。

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

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

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

打赏作者

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

抵扣说明:

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

余额充值