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

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

  • XML文件格式介绍:

      text  tail
     
     	例: 科比.布莱恩特
    

    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文件格式如下

     		
     			Kite
     			img1.jpg
     			D:\new-bird\original\img1.jpg
     			
     				Unknown
     			
     			
     				177
     				285
     				3
     			
     			0
     			
     				kite
     				Unspecified
     				0
     				0
     				
     					102
     					58
     					121
     					74
     				
     			
     			
     				kite
     				Unspecified
     				0
     				0
     				
     					148
     					193
     					159
     					198
     				
     			
     		
    
  • 批量地将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']))
    

你可能感兴趣的:(Python)