统计XML文件内标签的种类和其数量及将xml格式转换为yolov5所需的txt格式

1、统计XML文件内标签的种类和其数量

对于自己标注的数据集,需在标注完成后需要对标注好的XML文件校验,下面是代码,只需将SrcDir换成需要统计的xml的文件夹即可。

import os
from tqdm import tqdm
import xml.dom.minidomdef ReadXml(FilePath):if os.path.exists(FilePath) is False:return Nonedom = xml.dom.minidom.parse(FilePath)root_ = dom.documentElementobject_ = root_.getElementsByTagName('object')info = []for object_1 in object_:name = object_1.getElementsByTagName("name")[0].firstChild.databndbox = object_1.getElementsByTagName("bndbox")[0]xmin = int(bndbox.getElementsByTagName("xmin")[0].firstChild.data)ymin = int(bndbox.getElementsByTagName("ymin")[0].firstChild.data)xmax = int(bndbox.getElementsByTagName("xmax")[0].firstChild.data)ymax = int(bndbox.getElementsByTagName("ymax")[0].firstChild.data)info.append([xmin, ymin, xmax, ymax, name])return infodef CountLabelKind(Path):LabelDict = {}print("Star to count label kinds....")for root, dirs, files in os.walk(Path):for file in tqdm(files):if file[-1] == 'l':Infos = ReadXml(root + "\\" + file)for Info in Infos:if Info[-1] not in LabelDict.keys():LabelDict[Info[-1]] = 1else:LabelDict[Info[-1]] += 1return dict(sorted(LabelDict.items(), key=lambda x: x[0]))if __name__ == '__main__':SrcDir = r"D:\program\数据集\自标数据集(fall-nofall)\自标数据集(fall-nofall)\标注1~1000(1)"LabelDict = CountLabelKind(SrcDir)KeyDict = sorted(LabelDict)print("%d kind labels and %d labels in total:" % (len(KeyDict), sum(LabelDict.values())))print(KeyDict)print("Label Name and it's number:")for key in KeyDict:print("%s\t: %d" % (key, LabelDict[key]))

2、运行后报错:xml.parsers.expat.ExpatError: no element found: line 1, column 0

这是因为我的数据集中有XML文件为空

解决办法:最简单就是查看你文件夹下的XML文件的大小是否为0kb,若为0kb,直接删除。

最终统计效果如下:

3、将xml格式转换为yolov5所需的txt格式

先给大家看我的目录:

注意:

①此处的xml—txt.py文件是放在datasets文件夹下的(代码中的绝对路径)。
②imges文件夹中的train目录下的每一张图片都要有相应的xml文件,若无,则手动删除该jpg文件。

train1是存放xml文件的文件夹,train是存放txt文件的文件夹。

文件代码:

import xml.etree.ElementTree as ETimport pickle
import os
from os import listdir, getcwd
from os.path import join
import globclasses = ['fall', 'no  fall', 'no fall', 'nofall']def convert(size, box):dw = 1.0 / size[0]dh = 1.0 / size[1]x = (box[0] + box[1]) / 2.0y = (box[2] + box[3]) / 2.0w = box[1] - box[0]h = box[3] - box[2]x = x * dww = w * dwy = y * dhh = h * dhreturn (x, y, w, h)def convert_annotation(image_name):in_file = open('./labels/train1/' + image_name[:-3] + 'xml')  # xml文件路径out_file = open('./labels/train/' + image_name[:-3] + 'txt', 'w')  # 转换后的txt文件存放路径f = open('./labels/train1/' + image_name[:-3] + 'xml')xml_text = f.read()root = ET.fromstring(xml_text)f.close()size = root.find('size')w = int(size.find('width').text)h = int(size.find('height').text)for obj in root.iter('object'):cls = obj.find('name').textif cls not in classes:print(cls)continuecls_id = classes.index(cls)xmlbox = obj.find('bndbox')b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),float(xmlbox.find('ymax').text))bb = convert((w, h), b)out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')wd = getcwd()if __name__ == '__main__':for image_path in glob.glob("./images/train/*.jpg"):  # 每一张图片都对应一个xml文件这里写xml对应的图片的路径image_name = image_path.split('\\')[-1]convert_annotation(image_name)

转换后的txt文件为:

我的标注标签有四个,分别对应下面这四个数字。

接下来又是漫长且易秃的环境配置之路了。

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

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

相关文章

图像缩放算法双立方插值法

双立方插值法(Bicubic Interpolation)是一种常用的图像缩放算法,它通过对原始图像中的像素进行加权平均来计算目标图像中的像素值。相比双线性插值,双立方插值能更好地保留图像的细节和平滑过渡效果。 具体实现步骤如下&#xff…

Vue路由导航守卫

一、什么是Vue路由导航守卫? Vue路由导航守卫是Vue Router提供的一种机制,它可以让你在路由跳转之前或之后执行一些自定义逻辑,例如:鉴权、重定向等。守卫分为全局守卫、路由独享守卫和组件内守卫。 二、全局守卫 全局守卫作用…

Jenkins执行策略(图文讲解)

Jenkins执行策略-图文讲解 一:手动执行1、手动执行流程2、手动执行操作 二、通过构建触发器——定时执行1、定时执行流程2、定时执行操作 三、当开发部署成功之后进行执行——在测试项配置——关注的项目1、执行流程2、操作流程 四、测试代码有更新的时候自动构建1、…

nginx编译安装详细说明

前言 在 CentOS 7 上编译安装 Nginx 1.24.0 ,您可以按照以下步骤进行操作。 一、编译前准备 1.1、下载Nginx源代码 下载 Nginx 1.24.0 的源代码压缩包,并解压缩: 访问Nginx官网(http://nginx.org/),找…

Kubeflow文档1:介绍与架构

Kubeflow 2024/3/19版本的文档 此专栏用来展示相关的内容翻译,重点关注本地部署,关于运营商的方案,请自行查阅 文档地址https://www.kubeflow.org/docs/ 开始编辑时间:2024/3/27;最后编辑时间2024/3/27 Kubeflow文…

毕设论文目录设置

添加目录 选择一种格式的自动目录 更新目录 发现该目录中只有1、2章,3、4章 然后再点击更新目录 对应的,小标题添加二级目录

数据库之MyBatisPlus详解

MyBatisPlus MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 官网地址:https://baomidou.com/ 一、入门案…

C++学习随笔(8)——模板初阶

本章我们来学习一下C的模版部分! 目录 1. 泛型编程 2. 函数模板 2.1 函数模板概念 2.1 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 3. 类模板 3.1 类模板的定义格式 3.2 类模板的实例化 1. 泛型编程 如何实现一个通…

精通Go语言文件上传:深入探讨r.FormFile函数的应用与优化

1. 介绍 1.1 概述 在 Web 开发中,文件上传是一项常见的功能需求,用于允许用户向服务器提交文件,如图像、文档、视频等。Go 语言作为一门强大的服务器端编程语言,提供了方便且高效的方式来处理文件上传操作。其中,r.F…

(完结)Java项目实战笔记--基于SpringBoot3.0开发仿12306高并发售票系统--(三)项目优化

本文参考自 Springboot3微服务实战12306高性能售票系统 - 慕课网 (imooc.com) 本文是仿12306项目实战第(三)章——项目优化,本篇将讲解该项目最后的优化部分以及一些压测知识点 本章目录 一、压力测试-高并发优化前后的性能对比1.压力测试相关…

探索C语言中的联合体和枚举:让处理数据更加得心应手

✨✨小新课堂开课了,欢迎欢迎~✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:http://t.csdnimg.cn/Oytke 小新的主页:编程版小新-CSDN博客 C语言中有内置类型, 比如&…

2024年云计算使用报告,89%组织用多云,25%广泛使用生成式AI,45%需要跨云数据集成,节省成本是云首要因素

备注:本文来自Flexera2024年的云现状调研报告的翻译。原报告地址: https://info.flexera.com/CM-REPORT-State-of-the-Cloud Flexera是一家专注于做SaaS的IT解决方案公司,有30年发展历史,5万名客户,1300名员工。Flex…

​数据结构—栈操作经典案例

括号匹配&#xff1a; 这是我最开始写的&#xff0c;运行有问题 对于输入的括号序列&#xff0c;建议使用标准的 C 字符串而不是字符数组。 #include<iostream> using namespace std;typedef char SelemType; typedef int Status; #define OK 1 #define MAXSIZE 100 #…

Qt5.14.2 程序的华丽开场,让Splash窗口释放无限可能!

作为一款有追求的优秀软件&#xff0c;启动时的那个小小的Splash窗口可谓是程序的形象大使&#xff0c;它展现着软件精雕细琢的品味和非凡的待客之道。今天&#xff0c;就让我们一同领略Qt对这个"开场小品"的深谙之道——Splash窗口设计&#xff0c;感受一番Qt大神们…

Python数据分析九

一、Python之列表操作方法remove和pop 在Python中&#xff0c;列表还提供了其他一些常用的操作方法&#xff0c;例如删除指定元素和弹出&#xff08;移除并返回&#xff09;指定位置的元素。其中&#xff0c;remove()方法用于删除列表中第一个匹配的元素&#xff0c;而pop()方…

python基础——异常捕获【try-except、else、finally】

&#x1f4dd;前言&#xff1a; 这篇文章主要介绍一下python基础中的异常处理&#xff1a; 1&#xff0c;异常 2&#xff0c;异常的捕获 3&#xff0c;finally语句 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;C语言入门基础以及python入门…

【C++】右值引用

目录 前言&#xff1a;一、左值引用和右值引用1.1 什么是左值和左值引用1.2 什么是右值和右值引用 二、左值引用和右值引用比较三、右值引用使用场景3.1 传值返回使用场景3.2 移动构造3.3 移动赋值3.4 STL容器接口也增加右值引用3.5 完美转发 前言&#xff1a; 引用是给对象取…

HarmonyOS 应用开发之模型切换

本文介绍如何将一个FA模型开发的声明式范式应用切换到Stage模型&#xff0c;您需要完成如下动作&#xff1a; 工程切换&#xff1a;新建一个Stage模型的应用工程。 配置文件切换&#xff1a;config.json切换为app.json5和module.json5。 组件切换&#xff1a;PageAbility/Serv…

不同的batch_size对精度和损失的影响研究

1 问题 不同的batch_size对训练集和验证集的精度和损失的影响有多大&#xff1f; 2 方法 通过设置不同batch_size算出不同batch_size对应的训练集精度、训练集损失和验证集的精度和损失&#xff0c;通过数据可视化将精度和损失展示出来&#xff0c;比较出不同batch_size对他们的…

CTK插件框架学习-插件注册调用(03)

CTK插件框架学习-新建插件(02)https://mp.csdn.net/mp_blog/creation/editor/136923735 一、CTK插件组成 接口类&#xff1a;对外暴露的接口&#xff0c;供其他插件调用实现类&#xff1a;实现接口内的方法激活类&#xff1a;负责将插件注册到CTK框架中 二、接口、插件、服务…