【目标检测】VOC格式xml标注转换为DOTAv1格式txt标注

  1. voc2dota
python 复制代码
import os
import xml.etree.ElementTree as ET

def convert_voc_to_dota(xml_folder, output_folder):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    
    for xml_file in os.listdir(xml_folder):
        if xml_file.endswith('.xml'):
            tree = ET.parse(os.path.join(xml_folder, xml_file))
            root = tree.getroot()
            
            # 初始化DOTA格式的字符串
            dota_annotations = []
            
            for obj in root.iter('object'):
                robndbox = obj.find('robndbox')
                category = obj.find('name').text
                difficult = obj.find('difficult').text
                
                # 获取顶点坐标,并转换为DOTA格式(使用空格分隔)
                coords = [
                    robndbox.find('x_left_top').text, robndbox.find('y_left_top').text,
                    robndbox.find('x_right_top').text, robndbox.find('y_right_top').text,
                    robndbox.find('x_right_bottom').text, robndbox.find('y_right_bottom').text,
                    robndbox.find('x_left_bottom').text, robndbox.find('y_left_bottom').text
                ]
                dota_format = ' '.join(coords + [category, difficult])
                dota_annotations.append(dota_format)
            
            # 写入转换后的信息到TXT文件
            output_file_path = os.path.join(output_folder, xml_file.replace('.xml', '.txt'))
            with open(output_file_path, 'w') as f:
                for annotation in dota_annotations:
                    f.write("%s\n" % annotation)

# 调用函数,传入XML文件夹路径和输出文件夹路径
xml_folder = 'path/to/xml/folder'
output_folder = 'path/to/output/folder'
convert_voc_to_dota(xml_folder, output_folder)
  1. 可视化dota数据集
python 复制代码
import cv2
import numpy as np
import os
 
 
def draw_rotated_box(img, box, label):
    """在图像上绘制旋转的边界框和标签。"""
    points = np.int0(box)
    cv2.drawContours(img, [points], 0, (0, 255, 0), 2)  # 绘制旋转框
    cv2.putText(img, label, tuple(points[0]), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)  # 添加文本标签
 
 
def visualize_dota_annotations(image_folder, annotation_folder, output_folder):
    """批量处理图像和DOTA标注文件,绘制旋转边界框和标签"""
    # 确保输出文件夹存在
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
 
    # 遍历图像文件
    for img_filename in os.listdir(image_folder):
        img_path = os.path.join(image_folder, img_filename)
        if os.path.isfile(img_path) and img_filename.endswith(('.jpg', '.png')):
            annot_filename = os.path.splitext(img_filename)[0] + '.txt'
            annot_path = os.path.join(annotation_folder, annot_filename)
            output_img_path = os.path.join(output_folder, img_filename)
 
            img = cv2.imread(img_path)
            if img is None:
                continue
 
            if os.path.isfile(annot_path):
                with open(annot_path, 'r') as f:
                    lines = f.readlines()  # Skip imagesource and gsd lines
                    for line in lines:
                        parts = line.strip().split(' ')
                        if len(parts) < 9:
                            continue
                        box = np.array([float(part) for part in parts[:8]]).reshape(4, 2)
                        label = parts[8]
                        draw_rotated_box(img, box, label)
 
            cv2.imwrite(output_img_path, img)
 
# 路径配置
image_folder = 'images'
annotation_folder = 'dota'
output_folder = 'visual'
 
visualize_dota_annotations(image_folder, annotation_folder, output_folder)
相关推荐
JJJJ_iii1 分钟前
【深度学习05】PyTorch:完整的模型训练套路
人工智能·pytorch·python·深度学习
mwq3012314 分钟前
AI的“物理学”:揭秘GPT-3背后改变一切的“缩放定律”
人工智能
DP+GISer22 分钟前
自己制作遥感深度学习数据集进行遥感深度学习地物分类-试读
人工智能·深度学习·分类
victory043124 分钟前
TODO 分类任务指标计算和展示 准确率 F1 Recall
人工智能·机器学习·分类
rengang6624 分钟前
07-逻辑回归:分析用于分类问题的逻辑回归模型及其数学原理
人工智能·算法·机器学习·分类·逻辑回归
居7然38 分钟前
京东开源王炸!JoyAgent-JDGenie如何重新定义智能体开发?
人工智能·开源·大模型·mcp
老兵发新帖43 分钟前
归一化分析3
人工智能
QYR_111 小时前
2025-2031年全球 MT 插芯市场全景分析报告:技术演进、供需格局与投资前景
人工智能·自然语言处理·机器翻译
mwq301231 小时前
从GPT-1到GPT-2的性能飞跃及其驱动因素分析
人工智能