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

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

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

import os
from tqdm import tqdm
import xml.dom.minidom


def ReadXml(FilePath):
    if os.path.exists(FilePath) is False:
        return None
    dom = xml.dom.minidom.parse(FilePath)
    root_ = dom.documentElement
    object_ = root_.getElementsByTagName('object')
    info = []
    for object_1 in object_:
        name = object_1.getElementsByTagName("name")[0].firstChild.data
        bndbox = 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 info


def 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]] = 1
                    else:
                        LabelDict[Info[-1]] += 1

    return 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 ET

import pickle
import os
from os import listdir, getcwd
from os.path import join
import glob

classes = ['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.0
    y = (box[2] + box[3]) / 2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return (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').text
        if cls not in classes:
            print(cls)
            continue
        cls_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文件为:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【科技素养题】少儿编程 蓝桥杯青少组科技素养题 信息素养真题及解析第26套

少儿编程 科技素养 信息素养真题第26套 1、本次考试名称STEMA是STEM Assessment 的缩写。在保持第一个和最后一个字母不变的情况下,将 STEMA 的字母排列组合,一共可以组成()个与原先不同的组合。 A、5 B、6 C、12 D、20 答案:A 考点分析:主要考查小朋友们的逻辑思维…

python安装删除以及pip的使用

目录 你无法想象新手到底会在什么地方出问题——十二个小时的血泪之言! 问题引入 python modify setup 隐藏文件夹 环境变量的配置 彻底删除python 其他零碎发现 管理员终端 删不掉的windous应用商店apps 发现问题 总结 你无法想象新手到底会在什么地方…

深入理解数据结构(2):顺序表和链表详解

文章主题:顺序表和链表详解🌱所属专栏:深入理解数据结构📘作者简介:更新有关深入理解数据结构知识的博主一枚,记录分享自己对数据结构的深入解读。😄个人主页:[₽]的个人主页&#x…

与webpack类似的工具还有哪些?区别?

文章目录 一、模块化工具二、详细对比RollupParcelSnowpackVitewebpack 参考文献 一、模块化工具 模块化是一种处理复杂系统分解为更好的可管理模块的方式 可以用来分割,组织和打包应用。每个模块完成一个特定的子功能,所有的模块按某种方法组装起来&a…

赋能工业智能化升级 | 基于ACM32 MCU的工业通用变频器方案

近年来,随着智能制造对节能的更高要求,通用变频器在工业领域的应用愈加广泛。变频器是一种先进的调速控制设备,通过对电源频率的控制可以实现对电机转速的精确调节,从而提高设备的性能和节能效果。 01 变频器概述 变频器&#xf…

图片标注编辑平台搭建系列教程(6)——fabric渲染原理

原理 fabric的渲染步骤大致如下: 渲染前都设置背景图然后调用ctx.save(),存储画布的绘制状态参数然后调用每个object自身的渲染方法最后调用ctx.restore(),恢复画布的保存状态后处理,例如控制框的渲染等 值得注意的是&#xff0…

分享一个nhanes数据报错的解决方案

美国国家健康与营养调查( NHANES, National Health and Nutrition Examination Survey)是一项基于人群的横断面调查,旨在收集有关美国家庭人口健康和营养的信息。 地址为:https://wwwn.cdc.gov/nchs/nhanes/Default.aspx 今天分享…

二叉树寻找祖先问题-算法通关村

二叉树寻找祖先问题-算法通关村 1 最近公共祖先问题 LeetCode236:给定一个二叉树,找到该树中两个指定节点的最近公共祖先。 最近公共祖先的定义为:“对于有根树T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足是…

绿联 安装轻量源代码管理器 - Gitea

更多信息点击 1、镜像 gitea/gitea:latest 2、安装 2.1、拉取镜像 2.2、创建容器 本示例中限制了内容最大大小为4GB,也可以不做限制。 2.3、基础设置 开启 交互、TTY、重启策略选择最后一项。 2.4、网络 选择桥接即可。 2.5、存储空间 装在路径必须是“/data”…

车载电子电器架构 —— 电气架构开发计划

车载电子电器架构 —— 电气架构开发计划 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

中国象棋AI在线对弈游戏源码

源码介绍 这是一款html5小游戏,主要功能在于js,带一套皮肤、内置ai算法,有能力的可以自行修改。 源码截图 下载地址 链接:https://pan.baidu.com/s/1fYp1HWsd91nJOdX1M8RFtQ?pwdh2iz 提取码:h2iz

Chrome浏览器 安装Vue插件vue-devtools

前言 vue-devtools 是一个为 Vue.js 开发者设计的 Chrome 插件。它可以让你更轻松地审查和调试 Vue 应用程序。与普通的浏览器控制台工具不同,Vue.js devtools 专为 Vue 的响应性数据和组件结构量身定做。 1. 功能介绍 组件树浏览:这个功能可以让你查…

如何在极狐GitLab 自定义 Pages 域名、SSL/TLS 证书

本文作者:徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了在极狐GitLab 用户…

算法学习——LeetCode力扣单调栈篇

算法学习——LeetCode力扣单调栈篇 739. 每日温度 739. 每日温度 - 力扣(LeetCode) 描述 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个…

【带你了解动态规划】

🔥博主:程序员不想YY啊🔥 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家💫 🤗点赞🎈收藏⭐再看💫养成习惯 🌈希望本文对您有所裨益,如有…

milvus knowhere源码编译测试

简介 Knowhere 是 Milvus 的核心向量执行引擎,集成了Faiss、Hnswlib和Annoy等多个向量相似度搜索库。 编译环境 操作系统: Ubuntu 22.04.4 gcc/g:11.4.0 cmake: 3.27.7 安装依赖 apt install build-essential libopenblas-dev libaio-dev python3-dev python…

文生视频大模型Sora的复现经验

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

win10怎么设置屏幕保护,win10设置屏幕保护方法

电脑屏幕保护的作用主要有三个,第一,可以防止电脑因无人操作而使显示器长时间显示同一个画面,导致加速老化而缩短显示器寿命。第二,防止你离开电脑后屏幕上的隐私被偷窥。第三,大幅度降低屏幕亮度,有一定的省电作用。而Win10系统中呢是可以设置屏幕保护的,如果你想了解具…

[flask]session的基本使用

Cookie和Session的区别(面试必备)_cookie和session的作用和区别-CSDN博客 cooike和session都是用来跟踪浏览器用户身份的会话方式 ookie数据存放在客户的浏览器上,session数据放在服务器上 cooike相对于session来说的话,安全性没…

【二分图】【二分图最大匹配】LCP 04. 覆盖

作者推荐 视频算法专题 本文涉及知识点 二分图 二分图最大匹配 LeetCode LCP 04. 覆盖 你有一块棋盘,棋盘上有一些格子已经坏掉了。你还有无穷块大小为1 * 2的多米诺骨牌,你想把这些骨牌不重叠地覆盖在完好的格子上,请找出你最多能在棋盘…