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标签数据格式

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐