函数名:UA_XML_yolotxt.py
# 借鉴
# https://cxymm.net/article/guoqingru0311/121441636
import os
import xml.etree.ElementTree as ET
# 输入的XML文件位置
xmlDir=r"C:\Users\HIT\Pictures\nopeople\DETRAC-Train-Annotations-XML\DETRAC-Train-Annotations-XML"
# 主函数
for xmlNames in os.listdir(xmlDir):
xmlPath = os.path.join(xmlDir, xmlNames) # xml文件路径
# 直接解析XML文件并获得根节点
tree = ET.parse(xmlPath)
root = tree.getroot()
findall_frames = root.findall("frame") # frame标签列表
fileName=root.attrib["name"]
for findall_frame in findall_frames:
attrib = findall_frame.attrib["num"]
zfill = attrib.zfill(5)
imageName="img"+zfill # 图像的名称
gts = []
target_list = findall_frame.findall("target_list")[0]
findall_targets = target_list.findall("target") # target对应的标签
for findall_target in findall_targets:
gt_temp = []
LabelName = findall_target.findall("attribute")[0].attrib["vehicle_type"] # 获取标签类别
if LabelName == 'car':
gt_temp.append(1)
elif LabelName == 'bus':
gt_temp.append(3)
elif LabelName == 'van':
gt_temp.append(2)
elif LabelName == 'others':
gt_temp.append(3)
box_Dict = findall_target.findall("box")[0].attrib # 标注物体坐标
xmin = float(box_Dict["left"])/960
ymin = float(box_Dict["top"])/540
width = float(box_Dict["width"])/960
height = float(box_Dict["height"])/540
x0 = xmin + width/2
y0 = ymin + height/2
gt_temp.append(x0)
gt_temp.append(y0)
gt_temp.append(width)
gt_temp.append(height)
# gt_temp:存放五个数字,yolo格式txt文件的一行
print(gt_temp)
gts.append(gt_temp)
folder = "images"
img_name = fileName+'_'+imageName
# 文件保存位置
# 新建相应文件夹
with open('E:/UA_XML_yolotxt/'+img_name+".txt", 'w') as f:
for line in gts:
f.writelines(str(line)[1:-1].replace(',', '') + "\n")
f.close()