import os
from pathlib import Path
# Class names to indices mapping
class_mapping = {
"airplane":0,
"airport":1,
"baseballfield":2,
"basketballcourt":3,
"bridge":4,
"chimney":5,
"dam":6,
"Expressway-Service-area":7,
"Expressway-toll-station":8,
"golffield":9,
"groundtrackfield":10,
"harbor": 11,
"overpass":12,
"ship":13,
"stadium":14,
"storagetank":15,
"tenniscourt":16,
"trainstation":17,
"vehicle":18,
"windmill":19,
}
def convert_label(orig_label_dir, save_dir,image_width, image_height):
"""Converts a single image's DOTA annotation to YOLO OBB format and saves it to a specified directory."""
# orig_label_path = orig_label_dir / f"{image_name}.txt"
# save_path = save_dir / f"{image_name}.txt"
list = os.listdir(orig_label_dir)
for i in list:
orig_label_path = Path(os.path.join(orig_label_dir,i))
save_path = Path(os.path.join(save_dir,i))
with orig_label_path.open("r") as f, save_path.open("w") as g:
lines = f.readlines()
for line in lines:
parts = line.strip().split()
if len(parts) < 9:
continue
class_name = parts[8]
class_idx = class_mapping[class_name]
coords = [float(p) for p in parts[:8]]
normalized_coords = [
coords[i] / image_width if i % 2 == 0 else coords[i] / image_height for i in range(8)
]
formatted_coords = ["{:.6g}".format(coord) for coord in normalized_coords]
g.write(f"{class_idx} {' '.join(formatted_coords)}\n")
if __name__ == '__main__':
labels_path = r"D:\paperabout\dior-r\test\labels"
save_dir = r"D:\paperabout\dior-r\test\yolo"
# image_width=800, image_height=800
convert_label(labels_path,save_dir,image_width=800,image_height=800)
将dota格式标签转为yolo格式。
只读取labels下的标签文件。
class_mapping为DIOR-R数据集的类别。
(本段代码是在DIOR-R格式转DOTA格式的基础上,再转为yolo中obb读取的格式)