当前位置: 首页 > news >正文

目标检测篇:如何根据xml标注文件生成类别classes的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 = 0for 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 +=1if ob not in classes:classes.append(ob)print(num_object)# 生成json文件labels = {}for index,object in enumerate(classes):labels[index] = objectlabels = 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.lryc.cn/news/273091.html

相关文章:

  • spring见解2基于注解的IOC配置
  • Uncaught TypeError: Cannot read property ‘snj‘ of null
  • Jenkins基础教程
  • 嵌入式C语言--WatchDog最全概念
  • 数据结构【树篇】(二)
  • 2024上海城博会|上海国际城市与建筑博览会-官 网
  • Dockerfile - 基于 SpringBoot 项目自定义镜像(项目上线全过程)
  • 论文查重降重写成大白话可以吗
  • 【WPF.NET开发】WPF中的命令
  • 怎么将epub转换成txt文件?
  • Java单词排序
  • Moonsong Labs与Web3演变
  • 流媒体学习之路(WebRTC)——GCC分析(4)
  • k8s持久化存储(NFS-StorageClass)
  • java servlet软件缺陷库管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
  • 19|BabyAGI:根据气候变化自动制定鲜花存储策略
  • 面试经典150题(62-64)
  • 流量困境下,2024年餐饮商家的直播带货生意到底怎么做?
  • C++ 具名要求-基本概念-指定该类型对象可以默认构造
  • T527 Android13遥控适配
  • 第三部分使用脚手架:vue学习(61-65)
  • 【Linux学习笔记】解析Linux系统内核:架构、功能、工作原理和发展趋势
  • springboot连接oracle报错ORA-12505解决方案
  • 服务器为什么大多用 Linux?
  • C++上位软件通过Snap7开源库访问西门子S7-200/合信M226ES数据块的方法
  • 通信及信号处理领域期刊影响因子、分区及期刊推荐-2024版
  • cfa一级考生复习经验分享系列(十五)
  • 如潮好评!优秀选手视角下的第二届粤港澳大湾区(黄埔)国际算法算例大赛
  • 软件测试之冒烟测试
  • NE555学习笔记-2024