python xml 格式的数据集标注文件解析(修改、保存、删除),可视化

1、XML 格式分析

需要关注的一般只有:
filename :图片名称
size:width,heights 图片尺寸
object:图片中标注的目标,可能含有多个目标,这个xml就有2个标注目标
----- name:标注目标 类别标签 labels
----- bndbox :标注目标框 xmin ,ymin ,xmax ,ymax (左上角,右下角坐标)
在这里插入图片描述

2、可视化:把 xml 中的目标框在原图上绘制出来 ,并显示标签

import xml.etree.ElementTree as ET # 读取xml。
import os
from PIL import Image,ImageDraw,ImageFont

def parse_rec(filename): 
	tree = ET.parse(filename) # 解析读取xml函数
	objects = []
	img_dir =[]
	for xml_name in tree.findall('filename'):
		img_path = os.path.join(pic_path, xml_name.text)
		img_dir.append(img_path)
	for obj in tree.findall('object'):
		obj_struct = {}
		obj_struct['name'] = obj.find('name').text
		obj_struct['pose'] = obj.find('pose').text
		obj_struct['truncated'] = int(obj.find('truncated').text)
		obj_struct['difficult'] = int(obj.find('difficult').text)
		bbox = obj.find('bndbox')
		obj_struct['bbox'] = [int(bbox.find('xmin').text),
							  int(bbox.find('ymin').text),
							  int(bbox.find('xmax').text),
							  int(bbox.find('ymax').text)]
		objects.append(obj_struct)
	
	return objects,img_dir
# 可视化
def visualise_gt(objects,img_dir): 
	for id,img_path in enumerate(img_dir):
		img = Image.open(img_path)
		draw = ImageDraw.Draw(img)
		for a in objects:
			xmin =int(a['bbox'][0])
			ymin =int(a['bbox'][1])
			xmax =int(a['bbox'][2])
			ymax =int(a['bbox'][3])
			label = a['name']
			draw.rectangle((xmin,ymin,xmax,ymax), fill=None, outline=(0,255,0),width=2)
			draw.text((xmin-10,ymin-15), label, fill = (0,255,0),font=font)  # 利用ImageDraw的内置函数,在图片上写入文字
		img.show()
	


fontPath = "C:\Windows\Fonts\Consolas\consola.ttf" # 字体路径
root = 'F:/dataset/AQM'
ann_path = os.path.join(root, 'Annotations')  # xml文件所在路径
pic_path = os.path.join(root, 'JPEGImages')  # 样本图片路径
font = ImageFont.truetype(fontPath, 16)

for filename in os.listdir(ann_path):
	xml_path = os.path.join(ann_path,filename)
	object,img_dir = parse_rec(xml_path)
	visualise_gt(object,img_dir )

3、对 xml 及进行操作的重要函数

官方手册
xml.etree.ElementTree 资料
Elements and Element Trees

XML是一种固有的分层数据格式,最自然的表示方法是使用树,其内元素称作子节点

通过 parse() 解析xml文本,返回根元素 tree。(一级节点Annotation)
通过对 tree 进行findall操作,可到到带有指定标签的节点(二级节点eg:filename,object)。

ps:findall与find我也没搞明白有啥区别

Element对象有以下常用属性:
1、.tag: 标签
2、.text: 去除标签,获得标签中的内容。
3、.attrib: 获取标签中的属性和属性值。
4、.findall() : 只找到带有标签的 所有节点
5、.append() : 增加新节点
6、.set():增加或者修改属性
7、.remove():删除节点

保存xml文件ElementTree.write()

xml.dom.minidom,另一种xml的解析方式

  • 8
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值