import os
from lxml import etree
# 设置输入的xml文件夹,输出的txt的文件夹的位置
path = "G:/BaiduNetdiskDownload/FallDown/Annotations" #xml文件夹
write_path = "/BaiduNetdiskDownload/FallDown/labels" #要存放的txt文件夹
# 切换工作目录
os.chdir(path)
# 获取xml文件夹下的所有文件名
filenames = os.listdir(path)
for filename in filenames:
# 打开写入文件
new_name = filename.split('.')[0] + '.txt'
if not os.path.exists(write_path):
os.mkdir(write_path)
f = open(write_path + '\\' + new_name, 'w')
with open(filename, 'rb') as fp:
# 开始解析xml文件
xml = etree.HTML(fp.read())
width = int(xml.xpath('//size/width/text()')[0])
height = int(xml.xpath('//size/height/text()')[0])
if width == 0 or height == 0:
continue
# 获取对象标签
obj = xml.xpath('//object')
print(len(obj))
for each in obj:
name = each.xpath("./name/text()")[0]
if name == 'down': #xml中的标签名称,有几类标签写几个
classes = 0
if name == 'person':
classes = 1
if classes == 0 or classes == 1:
xmin = int(each.xpath('./bndbox/xmin/text()')[0])
xmax = int(each.xpath('./bndbox/xmax/text()')[0])
ymin = int(each.xpath('./bndbox/ymin/text()')[0])
ymax = int(each.xpath('./bndbox/ymax/text()')[0])
# 归一化(可选)
dw = 1 / width
dh = 1 / height
x_center = (xmin + xmax) / 2
y_center = (ymax + ymin) / 2
w = (xmax - xmin)
h = (ymax - ymin)
x, y, w, h = x_center * dw, y_center * dh, w * dw, h * dh
# 写入
f.write(str(classes) + ' ' + str(x) + ' ' + str(y) + ' ' + str(w) + ' ' + str(h) + ' ' + '\n')
12-01
392
09-09
1558