python解析xml文件-----labelimg标签转换成yolov3的标签格式

    xiaoxiao2023-10-30  156

    Python中使用ElementTree对XML文件进行解析

    XML文件格式介绍:

    <tag attrib = > text </tag> tail 例: <player number="24">科比.布莱恩特</player>

    tag,即标签,用于标识该元素表示哪种数据,如player attrib,即属性,用Dictionary形式保存,如{‘number’ = 24’} text,文本字符串,可以用来存储一些数据,如科比.布莱恩特 tail,尾字符串,并不是必须的

    ElementTree常用语法

    导入ElementTree: import xml.etree.ElementTree as ET 直接解析XML文件: tree = ET.parse('img1.xml') #得到的是类ElementTree 获得根节点 : root = tree.getroot() #得到的是类Element 遍历节点跟遍历列表相似: for child in root 提取某个节点跟列表相似: root[0] 提取第一个子节点 root[0].tag 提取第一个子节点的标签 root[0].text 提取第一个子节点的文本 #扩展 root[0][0]则表示以根节点的第一个子节点为根的第一个子节点 节点的常用属性: tag:标签 attrib:属性 text:文本 节点常用方法: find('nodeName') #表示在该节点下,查找其中第一个tag为nodeName的节点。 findall('nodeName') #表示在该节点下,查找其中所有tag为nodeName的节点。

    abelImg产生的xml文件格式如下

    <annotation> <folder>Kite</folder> <filename>img1.jpg</filename> <path>D:\new-bird\original\img1.jpg</path> <source> <database>Unknown</database> </source> <size> <width>177</width> <height>285</height> <depth>3</depth> </size> <segmented>0</segmented> <object> <name>kite</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>102</xmin> <ymin>58</ymin> <xmax>121</xmax> <ymax>74</ymax> </bndbox> </object> <object> <name>kite</name> <pose>Unspecified</pose> <truncated>0</truncated> <difficult>0</difficult> <bndbox> <xmin>148</xmin> <ymin>193</ymin> <xmax>159</xmax> <ymax>198</ymax> </bndbox> </object> </annotation>

    批量地将xml的label格式转化为yolov3的label格式 源代码

    import os import xml.etree.ElementTree as ET dirpath = 'D:/new_bird/label' #原来存放xml文件的目录 newdir = 'D:/new_bird/new_label' #修改label后形成的txt目录 if not os.path.exists(newdir): os.makedirs(newdir) for fp in os.listdir(dirpath): root = ET.parse(os.path.join(dirpath,fp)).getroot() xmin, ymin, xmax, ymax = 0,0,0,0 sz = root.find('size') width = float(sz[0].text) height = float(sz[1].text) filename = root.find('filename').text for child in root.findall('object'): #找到图片中的所有框 sub = child.find('bndbox') #找到框的标注值并进行读取 xmin = float(sub[0].text) ymin = float(sub[1].text) xmax = float(sub[2].text) ymax = float(sub[3].text) try: #转换成yolov3的标签格式,需要归一化到(0-1)的范围内 x_center = (xmin + xmax) / (2 * width) y_center = (ymin + ymax) / (2 * height) w = (xmax - xmin) / width h = (ymax - ymin) / height except ZeroDivisionError: print(filename,'的 width有问题') with open(os.path.join(newdir, fp.split('.')[0]+'.txt'), 'a+') as f: f.write(' '.join([str(2), str(x_center), str(y_center), str(w), str(h) + '\n']))
    最新回复(0)