VisDrone数据集txt格式标注更改xml

txt格式,每行从左往右分别<bbox_left>,<bbox_top>,<bbox_width>,<bbox_height>,<score>,<object_category>,<truncation>,<occlusion> 分类:

pedestrian (1), people (2), bicycle (3), car (4), van (5),truck (6), tricycle (7), awning-tricycle (8), bus (9), motor (10), others (11)

代码,从一个文件夹中读取jpg文件,另一个文件夹读标注,汇总成xml格式

# -*- coding:utf-8 -*-
import os
import xml.etree.ElementTree as ET
import cv2


# 增加换行符
def __indent(elem, level=0):
    i = "
" + level * "	"
    if len(elem):
        if not elem.text or not elem.text.strip():
            elem.text = i + "	"
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
        for elem in elem:
            __indent(elem, level + 1)
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
    else:
        if level and (not elem.tail or not elem.tail.strip()):
            elem.tail = i


def __makeXML(shape, realName, f, savePath = "E:/dataset/UAV_for_counting/"):
    root = ET.Element(annotation)  # 创建节点
    tree = ET.ElementTree(root)  # 创建文档

    filename = ET.Element(filename)
    filename.text = txt_path
    root.append(filename)
    # 图像尺寸
    size = ET.Element(size)
    width = ET.Element(width)
    height = ET.Element(height)
    depth = ET.Element(depth)
    width.text = str(shape[0])
    height.text = str(shape[1])
    depth.text = 3
    size.append(width)
    size.append(height)
    size.append(depth)
    root.append(size)

    # 逐行读txt
    while True:
        line = f.readline()
        if line:
            # object节点
            object = ET.Element(object)
            name = ET.Element(name)
            pose = ET.Element(pose)
            difficult = ET.Element(Difficult)
            bndbox = ET.Element(bndbox)
            xmin = ET.Element(xmin)
            ymin = ET.Element(ymin)
            xmax = ET.Element(xmax)
            ymax = ET.Element(ymax)
            truncated = ET.Element(truncated)

            s = line.split(,)

            if s[5] == 1 or s[5] == 2:
                name.text = pedestrian
            elif s[5] == 4 or s[5] == 5 or s[5] == 6 or s[5] == 9:
                name.text = vehicle
            else:
                continue

            xmin.text = s[0]
            ymin.text = s[1]
            xmax.text = str(int(s[0]) + int(s[2]))
            ymax.text = str(int(s[1]) + int(s[3]))

            pose.text = Unspecified
            difficult.text = 0
            truncated.text = s[6]

            bndbox.append(xmin)
            bndbox.append(ymin)
            bndbox.append(xmax)
            bndbox.append(ymax)
            object.append(name)
            object.append(pose)
            object.append(difficult)
            object.append(truncated)
            object.append(bndbox)
            root.append(object)

        else:
            break

    __indent(root)  # 增加换行符
    tree.write(savePath + realName + ".xml", encoding=utf-8, xml_declaration=False)


img_path = "E:/dataset/UAV_for_counting/"
txt_path = "E:/数据集/VisDrone2019-DET-train/annotations/"
filelist = os.listdir(img_path)

for i, filename in enumerate(filelist):
    if filename.endswith(".jpg"):
        img = cv2.imread(img_path + filename)
        size = img.shape

        realName = filename.split(".")[0]
        f = open(txt_path + realName + ".txt", encoding=utf-8)
        __makeXML(size, realName, f)
        f.close()
        print(i, "
")
经验分享 程序员 微信小程序 职场和发展