原因:有些同学希望将Mot15数据集用于目标检测模型训练,而模型训练需要的标注文件为VOC的XML文件
目标:将MOT15(txt)文件转换为VOC的XML文件
代码:
import os
import xml.etree.ElementTree as ET
def convert_mot_to_voc(mot_file, output_dir):
with open(mot_file, 'r') as f:
lines = f.readlines()
prev_frame_num = -1 # 上一帧的帧数
xml_root = None # XML 根节点
for line in lines:
data = line.strip().split(',')
frame_num = int(data[0])
track_id = int(data[1])
bbox = [int(float(data[i])) for i in range(2, 6)]
if frame_num != prev_frame_num: # 遇到新的帧数,生成新的 XML 文件
if xml_root is not None: # 将之前的 XML 文件保存
xml_string = ET.tostring(xml_root, encoding='unicode')
xml_file_path = os.path.join(output_dir, f"{prev_frame_num:04d}.xml")
with open(xml_file_path, 'w') as xml_file:
xml_file.write(xml_string)
xml_root = ET.Element('annotation') # 创建新的 XML 根节点
ET.SubElement(xml_root, 'folder').text = output_dir
ET.SubElement(xml_root, 'filename').text = f"{frame_num:04d}.jpg"
ET.SubElement(xml_root, 'path').text = os.path.join(output_dir, f"{frame_num:04d}.jpg")
xml_size = ET.SubElement(xml_root, 'size')
ET.SubElement(xml_size, 'width').text = str(960)
ET.SubElement(xml_size, 'height').text = str(540)
ET.SubElement(xml_size, 'depth').text = str(3)
xml_object = ET.SubElement(xml_root, 'object') # 创建目标节点
ET.SubElement(xml_object, 'name').text = 'car'
ET.SubElement(xml_object, 'pose').text = 'Unspecified'
ET.SubElement(xml_object, 'truncated').text = '0'
ET.SubElement(xml_object, 'difficult').text = '0'
xml_bndbox = ET.SubElement(xml_object, 'bndbox') # 创建边界框节点
ET.SubElement(xml_bndbox, 'xmin').text = str(bbox[0])
ET.SubElement(xml_bndbox, 'ymin').text = str(bbox[1])
ET.SubElement(xml_bndbox, 'xmax').text = str(bbox[0] + bbox[2])
ET.SubElement(xml_bndbox, 'ymax').text = str(bbox[1] + bbox[3])
prev_frame_num = frame_num
if xml_root is not None: # 处理最后一帧的 XML 文件
xml_string = ET.tostring(xml_root, encoding='unicode')
xml_file_path = os.path.join(output_dir, f"{prev_frame_num:04d}.xml")
with open(xml_file_path, 'w') as xml_file:
xml_file.write(xml_string)
# 指定 MOT15 格式的 txt 标注文件路径
mot_file_path = 'mot_file_path/mot_file_path.txt'
# 指定转换后的 VOC 格式的 XML 标注文件保存目录
output_directory = 'output_directory/output_directory'
# 调用函数进行转换
convert_mot_to_voc(mot_file_path, output_directory)
这段代码会根据 MOT15 格式的 txt 标注文件将每一帧的多个目标转换为对应的 XML 文件,并保存在指定的输出目录下。各位同学请确保正确指定输入和输出的文件路径。
喜欢的各位观众点点赞和收藏,以免以后需要时找不到~