XML和JSON格式转换成txt

news2024/12/22 19:48:57

XML如下这种:

  • 转换代码

    import os
    import xml.etree.ElementTree as ET
    
    # xml文件存放目录(修改成自己的文件名)
    input_dir = r'C:\121\Annotations'
    
    # 输出txt文件目录(自己创建的文件夹)
    out_dir = r'C:\121\txt'
    
    class_list = []
    
    
    # 获取目录所有xml文件
    def file_name(input_dir):
        F = []
        for root, dirs, files in os.walk(input_dir):
    
            for file in files:
                # print file.decode('gbk')    #文件名中有中文字符时转码
                if os.path.splitext(file)[1] == '.xml':
                    t = os.path.splitext(file)[0]
                    F.append(t)  # 将所有的文件名添加到L列表中
        return F  # 返回L列表
    
    
    # 获取所有分类
    def get_class(filelist):
        for i in filelist:
            f_dir = input_dir + "\\" + i + ".xml"
            in_file = open(f_dir, encoding='UTF-8')
            filetree = ET.parse(in_file)
            in_file.close()
            root = filetree.getroot()
            for obj in root.iter('object'):
                cls = obj.find('name').text
                if cls not in class_list:
                    class_list.append(cls)
    
    
    def ConverCoordinate(imgshape, bbox):
        # 将xml像素坐标转换为txt归一化后的坐标
        xmin, xmax, ymin, ymax = bbox
        width = imgshape[0]
        height = imgshape[1]
        dw = 1. / width
        dh = 1. / height
        x = (xmin + xmax) / 2.0
        y = (ymin + ymax) / 2.0
        w = xmax - xmin
        h = ymax - ymin
    
        # 归一化
        x = x * dw
        y = y * dh
        w = w * dw
        h = h * dh
    
        return x, y, w, h
    
    
    def readxml(i):
        f_dir = input_dir + "\\" + i + ".xml"
    
        txtresult = ''
    
        outfile = open(f_dir, encoding='UTF-8')
        filetree = ET.parse(outfile)
        outfile.close()
        root = filetree.getroot()
    
        # 获取图片大小
        size = root.find('size')
        width = int(size.find('width').text)
        height = int(size.find('height').text)
        imgshape = (width, height)
    
        # 转化为yolov5的格式
        for obj in root.findall('object'):
            # 获取类别名
            obj_name = obj.find('name').text
    
            obj_id = class_list.index(obj_name)
            # 获取每个obj的bbox框的左上和右下坐标
            bbox = obj.find('bndbox')
            xmin = float(bbox.find('xmin').text)
            xmax = float(bbox.find('xmax').text)
            ymin = float(bbox.find('ymin').text)
            ymax = float(bbox.find('ymax').text)
            bbox_coor = (xmin, xmax, ymin, ymax)
    
            x, y, w, h = ConverCoordinate(imgshape, bbox_coor)
            txt = '{} {} {} {} {}\n'.format(obj_id, x, y, w, h)
            txtresult = txtresult + txt
    
        # print(txtresult)
        f = open(out_dir + "\\" + i + ".txt", 'a')
        f.write(txtresult)
        f.close()
    
    
    # 获取文件夹下的所有文件
    filelist = file_name(input_dir)
    
    # 获取所有分类
    get_class(filelist)
    
    # 打印class
    print(class_list)
    
    # xml转txt
    for i in filelist:
        readxml(i)
    
    # 在out_dir下生成一个class文件
    f = open(out_dir + "\\classes.txt", 'a')
    classresult = ''
    for i in class_list:
        classresult = classresult + i + "\n"
    f.write(classresult)
    f.close()
    

JSON格式一:

{“image”: “3591.jpg”, “annotations”: [{“label”: “boat”, “coordinates”: {“x”: 163.9615384615385, “y”: 76.0384615384616, “width”: 146.0, “height”: 23.0}}, {“label”: “boat”, “coordinates”: {“x”: 247.4615384615385, “y”: 38.538461538461604, “width”: 291.0, “height”: 52.0}}, {“label”: “boat”, “coordinates”: {“x”: 1756.9615384615386, “y”: 32.538461538461604, “width”: 136.0, “height”: 56.0}}]}]

  • 对应的转换代码如下:

    import os
    import json
    
    # 指定包含 JSON 文件的文件夹路径
    folder_path = "C:/labels/json/"
    
    # 获取文件夹中所有 JSON 文件的文件名
    json_files = [f for f in os.listdir(folder_path) if f.endswith(".json")]
    
    for json_file in json_files:
        # 构建 JSON 文件的完整路径
        json_path = os.path.join(folder_path, json_file)
    
        # 读取 JSON 文件
        with open(json_path, "r") as file:
            data = json.load(file)
    
        # 提取注释信息
        annotations = data[0]['annotations']
    
        # 转换为文本格式
        annotations_str = ""
        for annotation in annotations:
            coordinates = annotation['coordinates']
            #设置输出的内容格式
            #annotation_str = f"label: {annotation['label']}, x: {coordinates['x']}, y: {coordinates['y']}, width: {coordinates['width']}, height: {coordinates['height']}\n"
            annotation_str = f"{'0'} {coordinates['x']} {coordinates['y']} {coordinates['width']} {coordinates['height']}\n"
            annotations_str += annotation_str
    
        # 构建文本文件的路径和文件名
        txt_file = os.path.splitext(json_file)[0] + ".txt"
        txt_path = os.path.join(folder_path, txt_file)
    
        # 保存注释信息为文本文件
        with open(txt_path, "w") as file:
            file.write(annotations_str)
    
    

    JSON格式二

  • 转换代码

import json
import os

name2id = {'boat': 0}  # 标签名称


def convert(img_size, box):
    dw = 1. / (img_size[0])
    dh = 1. / (img_size[1])
    x = (box[0] + box[2]) / 2.0 - 1
    y = (box[1] + box[3]) / 2.0 - 1
    w = box[2] - box[0]
    h = box[3] - box[1]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return (x, y, w, h)


def decode_json(json_floder_path, json_name):
    txt_name = 'C:/Users/labels/txt/' + json_name[0:-5] + '.txt'
    # txt文件夹的绝对路径
    txt_file = open(txt_name, 'w')

    json_path = os.path.join(json_floder_path, json_name)
    data = json.load(open(json_path, 'r', encoding='gb2312', errors='ignore'))

    img_w = data['imageWidth']
    img_h = data['imageHeight']

    for i in data['shapes']:

        label_name = i['label']
        if (i['shape_type'] == 'rectangle'):
            x1 = int(i['points'][0][0])
            y1 = int(i['points'][0][1])
            x2 = int(i['points'][1][0])
            y2 = int(i['points'][1][1])

            bb = (x1, y1, x2, y2)
            bbox = convert((img_w, img_h), bb)
            txt_file.write(str(name2id[label_name]) + " " + " ".join([str(a) for a in bbox]) + '\n')


if __name__ == "__main__":

    json_floder_path = 'C:/Users/labels/json/'
    # json文件夹的绝对路径
    json_names = os.listdir(json_floder_path)
    for json_name in json_names:
        decode_json(json_floder_path, json_name)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/564206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pix2pixHD代码---数据集处理

在train文件中:其中dataset是dataloader的方法,而dataloader等于CreateDataLoader。 所以我们跳到CreateDataLoader: 在CreateDataLoader中返回的是dataset_loader,是来自于CustomDatasetDataLoader。切调用了initialize。因为C…

零次学习(Zero-Shot Learning)

零次学习(Zero-Shot Learning) 零样本学习zero-shot learning,是最具挑战的机器识别方法之一。2009年,Lampert 等人提出了Animals with Attributes数据集和经典的基于属性学习的算法,开始让这一算法引起广泛关注。 零…

qt quick(qml)通过arcgis导入自定义格式地图(Windows 版本)

参考ArcGIS Maps SDK for Qt 参考Display a map 安装 预先安装的软件 安装ArcGIS SDK 点击ArcGIS Maps SDK for Qt 注册账号 要注册成developer版本用户的,不然之后可能没办法生成API 下载 下载之后安装,一路next就可以了 在QT中创建ArcGIS项目…

CMOS图像传感器——TDI CIS(2)

在之前的文章 CMOS图像传感器——TDI CIS_tdi相机的工作原理_沧海一升的博客-CSDN博客时间延迟积分(Time-Delay Integration, TDI)技术是一种特殊的成像模式https://blog.csdn.net/qq_21842097/article/details/119873386 对CMOS TDI图像传感器做了基本介绍,这里我们…

django项目结合vue执行

开发环境下直接把vue打包后的文件放在django项目,启动前端项目直接打包即可 注意事项: settings.py文件 TEMPLATES [ { ‘BACKEND’: ‘django.template.backends.django.DjangoTemplates’, # ‘DIRS’: [], ‘DIRS’: [os.path.join(BASE_DIR,‘front…

Java基础面试题突击系列5

👩🏻 作者:一只IT攻城狮 ,关注我不迷路 ❤️《java面试核心知识》突击系列,持续更新… 💐 面试必知必会学习路线:Java技术栈面试系列SpringCloud项目实战学习路线 📝再小的收获x365天…

mac 切换java jdk版本 java8 java11

1. 终端执行命令 查看本地各版本jdk:mac通常默认安装了jdk1.8 安装目录是 /Library/Java/JavaVirtualMachines/ cd /Library/Java/JavaVirtualMachines/ ls 2. 上述命令列出的各版本目录名 后,在全局配置文件.bash_profile中新增上面命令列出的各…

四月,收割12家offer,面试也太容易了吧....

前言 下面是我根据工作这几年来的面试经验,加上之前收集的资料,整理出来350道软件测试工程师 常考的面试题。字节跳动、阿里、腾讯、百度、快手、美团等大厂常考的面试题,在文章里面都有 提到。 虽然这篇文章很长,但是绝对值得你…

005 - STM32学习笔记 - 启动代码

005 - STM32学习笔记 - 启动代码 常用汇编指令 指令名称作用EQU给数字常量取一个符号名,相当于C语言中的#define;AREA汇编一个新的代码段或者数据段;SPACE分配内存空间;PRESERVE8当前文件栈需要按照8字节对齐;EXPORT…

【ChatGPT】ChatGPT自动生成思维导图

参考视频:https://edu.csdn.net/learn/38346/613917 应用场景:自学,“研一学生如何学习机器学习”的思维导图 问:写一个“研一学生如何学习机器学习”的思维导图内容,以markdown代码块格式输出 # 研一学生如何学习…

探索人工智能和机器学习的前沿趋势

🌟 深度学习的突破🌟 强化学习的进展🌟 可解释性和公平性的挑战(1000字)🌟 自动化和智能化的未来(1000字) 在当今科技飞速发展的时代,人工智能(Artificial In…

全网最牛最前面的浦发银行软件测试面试题精讲分析

面试永远都是软件测试人重点关注的问题,最近也总有很多想去银行面试的小伙伴来问我,有没有什么方法技巧传授一下。 那今天就给大家总结一些浦发银行的面试题,小伙伴们可以看看如果是自己能不能流畅地回答上来这些面试题。 1、说说你们公司测…

c++积累12-const

1、文件作用域-const修饰变量默认为文件局部变量 注意:非const变量默认为extern。要使const变量能够在其他文件中访问,必须在文件中显式地指定它为extern。 1) 未被const修饰的变量在不同文件的访问 可以看到是能够默认不加const是可以正常访问的 2) …

某大型啤酒企业:构建网络安全软实力,首选Coremail反钓鱼演练

客户背景 某大型啤酒厂商的公司规模和市场份额多年来始终都处于行业领先地位,积极赞助多项体育赛事,持续丰富和提升品牌形象。作为一家具有全球影响力的企业,自然也成为了全球黑客等攻击团伙的重点目标,而系统攻击的开端便是钓鱼…

什么是产品路线图?如何做产品路线图规划

产品路线图规划 •产品路线图是一个高层次的战略计划,它描述了产品在未来一段时间可能会如何发展和壮大,产品路线图确保整个产品团队持续关注产品的目标,帮助产品负责人把握产品的战略方向,调整产品的优先级和产品规划。 里程碑…

轻松打造智能化性能测试监控平台:【JMeter+Grafana+Influxdb】的优化整合方案

目录 【引言】 【背景说明】 【实现原理】 【平台搭建】 方法一:Windows或macOS环境下搭建 1.InfluxDB安装 2.grafana安装 3.jmeter配置 方法二:Linux环境下搭建 1.influxdb安装 2.grafana安装 3.jdkjmeter安装 方法三:docker容…

L1-093 猜帽子游戏

宝宝们在一起玩一个猜帽子游戏。每人头上被扣了一顶帽子,有的是黑色的,有的是黄色的。每个人可以看到别人头上的帽子,但是看不到自己的。游戏开始后,每个人可以猜自己头上的帽子是什么颜色,或者可以弃权不猜。如果没有…

python接口自动化测试之unittest自动化测试框架基本使用

目录 unittest简单介绍 unittest基础使用 unittest.Testcase setUp tearDown setUpClass tearDownClass 测试用例 unittest.main() unitteest提供的各种断言方式 unittest测试用例跳过执行 跳过执行测试用例共有四种写法 self.skipTest(reason) 跳过执行测试用例注…

手动搭建一个简单的MVVMLight框架的方法

本章讲述:手动搭建一个简单的MVVMLight框架步骤: 1、下载MVVMLight所需要的dll库文件 主要文件包括:CommonServiceLocator.dll、GalaSoft.MvvmLight.dll、GalaSoft.MvvmLight.Extras.dll、GalaSoft.MvvmLight.Platform.dll、System.Windows.…