将dior r 数据集标签转换为dota格式标签
时间:2023.9.27
1.将dior数据集标签转换为dota格式标签
import os
import xml.etree.ElementTree as ET
# 输入文件夹路径和输出文件夹路径
input_folder = '/root/autodl-tmp/dior/Annotations/Oriented Bounding Boxes/'
output_folder = '/root/autodl-tmp/dior_dota_format/all_annfiles/'
# 遍历输入文件夹中的所有XML文件
for filename in os.listdir(input_folder):
if filename.endswith('.xml'):
xml_path = os.path.join(input_folder, filename)
print(f'convert {filename}')
# 解析XML文件
tree = ET.parse(xml_path)
root = tree.getroot()
# 创建用于存储文本数据的列表
text_data = []
# 遍历XML元素并提取所需的信息
for obj in root.findall('.//object'):
robndbox = obj.find('robndbox')
if robndbox is not None:
x_left_top = robndbox.find('x_left_top').text
y_left_top = robndbox.find('y_left_top').text
x_right_top = robndbox.find('x_right_top').text
y_right_top = robndbox.find('y_right_top').text
x_right_bottom = robndbox.find('x_right_bottom').text
y_right_bottom = robndbox.find('y_right_bottom').text
x_left_bottom = robndbox.find('x_left_bottom').text
y_left_bottom = robndbox.find('y_left_bottom').text
name = obj.find('name').text
difficult = obj.find('difficult').text
# 将提取的信息格式化并添加到文本数据列表中
text_line = f"{x_left_top} {y_left_top} {x_right_top} {y_right_top} {x_right_bottom} {y_right_bottom} {x_left_bottom} {y_left_bottom} {name} {difficult}\n"
text_data.append(text_line)
# 创建输出文件路径
output_path = os.path.join(output_folder, filename.replace('.xml', '.txt'))
# 将文本数据写入输出文件
with open(output_path, 'w') as output_file:
output_file.writelines(text_data)
print("转换完成!")
trainval和test共23463个标签文件
2.将trainval和test标签文件分开
dota数据集路径:
|–DOTA
|–trainval
|–imgages
|–annfiles
|–test
|–images
|–annfiles
将所有标签分别分配到/DOTA/trainval/annfiles/和/DOTA/test/annfiles/下
trainval 共11725个标签文件
test 共11738个标签文件
import os
import shutil
# 源文件夹和目标文件夹路径
source_folder = '/root/autodl-tmp/dior_dota_format/all_annfiles/'
trainval_target_folder = '/root/autodl-tmp/dior_dota_format/trainval/annfiles/'
# 读取trainval.txt文件中的文件名列表
with open('/root/autodl-tmp/dior/ImageSets/Main/trainval.txt', 'r') as file:
file_names = file.read().splitlines()
# 遍历文件名列表并复制文件
total_trainval = 0
for file_name in file_names:
source_file_path = os.path.join(source_folder, f"{file_name}.txt")
target_file_path = os.path.join(trainval_target_folder, f"{file_name}.txt")
# 使用shutil库进行文件复制
if os.path.exists(source_file_path):
total_trainval += 1
shutil.copy(source_file_path, target_file_path)
print(f"复制 {file_name}.txt 完成")
print("trainval 复制完成!")
print(f"total trainval {total_trainval}")
test_target_folder = '/root/autodl-tmp/dior_dota_format/test/annfiles/'
# 读取trainval.txt文件中的文件名列表
with open('/root/autodl-tmp/dior/ImageSets/Main/test.txt', 'r') as file:
file_names = file.read().splitlines()
# 遍历文件名列表并复制文件
total_test = 0
for file_name in file_names:
source_file_path = os.path.join(source_folder, f"{file_name}.txt")
target_file_path = os.path.join(test_target_folder, f"{file_name}.txt")
# 使用shutil库进行文件复制
if os.path.exists(source_file_path):
total_test += 1
shutil.copy(source_file_path, target_file_path)
print(f"复制 {file_name}.txt 完成")
print("test 复制完成!")
print(f"total test {total_test}")
print(f"total trainval {total_trainval}")
print(f"total test {total_test}")