import os
from xml.dom import minidom
def xml2txt(xml_path, txt_save_path, labels_list):
index_label = list(range(len(labels_list)))
voc_names_dic = dict(zip(labels_list, index_label))
dir_files = os.listdir(xml_path)
for item in dir_files:
doc = minidom.parse(os.path.join(xml_path, item))
name = doc.getElementsByTagName("filename")[0].firstChild.data # image_name
size = doc.getElementsByTagName("size")[0]
width = int(size.getElementsByTagName("width")[0].firstChild.data) # width
height = int(size.getElementsByTagName("height")[0].firstChild.data) # height
objects = doc.getElementsByTagName("object")
label_txt = os.path.join(txt_save_path, name[:-4] + ".txt")
with open(label_txt, 'w') as file:
for obj in objects:
cls = obj.getElementsByTagName("name")[0].firstChild.data # class_name
box = obj.getElementsByTagName("bndbox")[0]
xmin = int(box.getElementsByTagName("xmin")[0].firstChild.data) # x1
ymin = int(box.getElementsByTagName("ymin")[0].firstChild.data) # y1
xmax = int(box.getElementsByTagName("xmax")[0].firstChild.data) # x2
ymax = int(box.getElementsByTagName("ymax")[0].firstChild.data) # y2
x = round((xmin + xmax) / width / 2, 4)
y = round((ymin + ymax) / height / 2, 4)
w = round((xmax - xmin) / width, 4)
h = round((ymax - ymin) / height, 4)
label = int(voc_names_dic[cls])
file.write(str(label) + ' ' + str(x) + ' ' + str(y) + ' ' + str(w) + ' ' + str(h) + '\n')
if __name__ == '__main__':
print("starting convert data ......")
xml_files_path = 'G:\\other\\VOC\\VOCdevkit_test07\\VOC2007\\Annotations'
txt_files_path = 'G:\\other\\VOC\\VOCdevkit_test07\\VOC2007\\Annotations_txt'
voc_names = ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable',
'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor']
xml2txt(xml_files_path, txt_files_path, voc_names)
xml标签数据格式
txt标签数据格式