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

统计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.lryc.cn/news/328884.html

相关文章:

  • 《操作系统导论》第14章读书笔记:插叙:内存操作API
  • HAProxy + Vitess负载均衡
  • 2024年京东云主机租用价格_京东云服务器优惠价格表
  • qt-C++笔记之QSpinBox控件
  • Linux(CentOS)/Windows-C++ 云备份项目(服务器网络通信模块,业务处理模块设计,断点续传设计)
  • 【QQ版】QQ群短剧机器人源码 全网短剧机器人插件
  • 矩阵间关系的建立
  • 【C++】C到C++的入门知识
  • 【c++】简单的日期计算器
  • 基于easyx库的C/C++游戏编程实例-飞机大战
  • stitcher类实现多图自动拼接
  • Ubuntu下udp通信
  • 拌合楼管理软件开发(十三) 对接耀华XK3190-A9地磅(实战篇)
  • FastAPI+React全栈开发10 MongoDB聚合查询
  • python 报错问题汇总
  • 6.5物联网RK3399项目开发实录-驱动开发之LCD显示屏使用(wulianjishu666)
  • 「Android高级工程师」BAT大厂面试基础题集合-下-Github标星6-5K
  • 【算法】基数排序
  • 2核2G服务器优惠价格轻量61元一年,CVM价格313元15个月
  • 不同Python版本和wxPython版本用pyinstaller打包文件大小对比
  • 【C语言】结构体详解(一)
  • AI时代-普通人的AI绘画工具对比(Midjouney与Stable Diffusion)
  • 【蓝桥杯】矩阵快速幂
  • C语言使用STM32开发板手搓高端家居洗衣机
  • 【Hello,PyQt】QTextEdit和QSplider
  • 【力扣】191.位 1 的个数、485.最大连续 1 的个数
  • 蓝桥杯 java 承压计算
  • leetcode268-Missing Number
  • 【jenkins+cmake+svn管理c++项目】jenkins回传文件到svn(windows)
  • 数据结构·二叉树(2)