目标检测篇:如何根据xml标注文件生成类别classes的json文件

news/2024/7/10 2:51:21 标签: 目标检测, xml, json

1. 介绍

之前在做目标检测任务的时候,发现很多的数据集仅有数据(只有图片+标注的xml文件),没有关于类别的json文件,为了以后方便使用,这里记录一下

一般来说,yolo标注的数据集,只有第一个是数字类别,要是没有classes对应的类别,只能根据图片一个个输入。

对于xml解释性标签文件,标注的时候,object下面的name就是目标检测框的分类,所以这里只有xml生成类别json文件的代码

2. 实现代码

代码实现简单,仅有50行,这里简单介绍

这里root传入的是数据集的xml目录,因为训练集包含本检测任务的所有分类,这里传入的是目录

if __name__ == "__main__":
    root = './my_xml_dataset/train/annotations'          # 数据集的 xml 目录
    xml2json(root)

下面读取xml文件的内容,这里的data以及将单个xml文件全部解析出来

  • open里面的encoding和errors参数是因为本实验的xml包含中文字符,这样可以防止报错,正常的话不需要这两个参数,如果xml编码不一样,根据报错信息,百度一下传入不同编码就行了
  • parse_xml_to_dict  为自定义函数,后面会贴所有代码,这里只需要知道利用递归将xml文件解析成字典文件即可,看下面的data打印信息

接着开始读取单个xml的所有目标类别,如下

classes需要去除重复的目标,生成单个的classes文件

最好生成json文件即可

可以看出,测试数据的目标共有10347个

生成的json文件如下:

3. 完整代码

如下:

import os
from tqdm import tqdm
from lxml import etree
import json


# 读取 xml 文件信息,并返回字典形式
def parse_xml_to_dict(xml):
    if len(xml) == 0:  # 遍历到底层,直接返回 tag对应的信息
        return {xml.tag: xml.text}

    result = {}
    for child in xml:
        child_result = parse_xml_to_dict(child)  # 递归遍历标签信息
        if child.tag != 'object':
            result[child.tag] = child_result[child.tag]
        else:
            if child.tag not in result:  # 因为object可能有多个,所以需要放入列表里
                result[child.tag] = []
            result[child.tag].append(child_result[child.tag])
    return {xml.tag: result}


# 提取xml中name保留为json文件
def xml2json(data):
    xml_path = [os.path.join(data, i) for i in os.listdir(data)]
    classes = []      # 目标类别
    num_object = 0
    for xml_file in tqdm(xml_path, desc="loading..."):
        with open(xml_file,encoding='gb18030',errors='ignore') as fid:      # 防止出现非法字符报错
            xml_str = fid.read()
        xml = etree.fromstring(xml_str)
        data = parse_xml_to_dict(xml)["annotation"]  # 读取xml文件信息
        for j in data['object']:        # 获取单个xml文件的目标信息
            ob = j['name']
            num_object +=1
            if ob not in classes:
                classes.append(ob)
    print(num_object)
    # 生成json文件
    labels = {}
    for index,object in enumerate(classes):
        labels[index] = object
    labels = json.dumps(labels,indent=4)
    with open('class_indices.json','w') as f:
        f.write(labels)


if __name__ == "__main__":
    root = './my_xml_dataset/train/annotations'          # 数据集的 xml 目录
    xml2json(root)

下载地址:关于目标检测:如何根据XML标签文件生成检测类别的json字典文件,包含数据集、测试代码以及生成好的json文件


http://www.niftyadmin.cn/n/5304316.html

相关文章

腾讯云导入导出镜像官方文档

制作与导出 Linux 镜像 https://cloud.tencent.com/document/product/213/17814 制作与导出 Windows 镜像 ​​​​​​https://cloud.tencent.com/document/product/213/17815 云服务器 导出镜像-操作指南-文档中心-腾讯云 (tencent.com) 轻量应用服务器 管理共享镜像-操作指…

搭建一套洗衣洗鞋上门预约小程序系统有多个方便

上门预约洗衣洗鞋干洗店管理小程序系统,功能齐全,助你轻松应对繁杂的管理工作。从订单、客户到库存,一一为你搞定。无论是移动App还是小程序,一切尽在指尖。 1. 订单管理:一键录入,洗涤过程一览无余&#x…

Asp .Net Core系列:基于MySQL的DBHelper帮助类和SQL Server的DBHelper帮助类

文章目录 MySQLDBHelperMSSQLDBHelper MySQLDBHelper app.config中添加配置 <connectionStrings><add name"MySqlConn" connectionString"serverlocalhost;port3306;userroot;password123456;databasedb1;SslModenone"/></connectionStrin…

前端根据URL地址实现下载(txt,图片,word,xlsx,ppt)

前端根据URL地址实现下载&#xff08;txt&#xff0c;图片&#xff0c;word&#xff0c;xlsx&#xff0c;ppt&#xff09; 一、对于txt,图片类的二、对于word&#xff0c;xlsx&#xff0c;ppt类的1.a标签可以实现下载2. window.open&#xff08;&#xff09; 一、对于txt,图片类…

PHP写一个函数能够遍历一个文件夹下的所有文件和子文件夹

社区版本可以用 function myscandir($dir) { $files array(); if ( $handle opendir($dir) ) { while ( ($file readdir($handle)) ! false ) { if ( $file ! ".." && $file ! "." ) { if ( isdir($dir . "/" . $file) ) { $…

华为DriveONE电机控制器拆解实拍

如果说之前的问界M5、M7&#xff0c;华为让我们看到其在智能化上确实拥有遥遥领先的能力&#xff0c;那么在智界S7上&#xff0c;则让我们看到华为在动力、底盘这些硬件执行层面&#xff0c;竟然也有不输给很多车企的实力。1、华为电驱&#xff0c;全球第一&#xff1f;在智界S…

【C++】知识点汇总(上)

C知识点复习上 一、C 概述1. 基本数据类型2. 变量定义和访问3. 常量与约束访问 二、程序控制结构详解与示例1. 表达式2. 选择控制2.1 if 语句2.2 switch 语句 3. 循环控制3.1 for 循环3.2 while 循环3.3 do-while 循环 4. goto 语句5. 控制语句的嵌套 三、函数1. 函数的定义和调…

编程语言的未来:探索技术进步的轨迹

编程语言的未来&#xff1a;探索技术进步的轨迹 随着科技的飞速发展&#xff0c;编程语言在计算机领域中扮演着至关重要的角色。它们是软件开发的核心&#xff0c;为程序员提供了与机器沟通的桥梁。然而&#xff0c;未来的技术进步将如何影响编程语言的走向呢&#xff1f;让我…