【目标检测】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)
相关推荐
q_30238195563 分钟前
Atlas200赋能水稻病虫害精准识别:AI+边缘计算守护粮食安全
人工智能·边缘计算
芥末章宇4 分钟前
TimeGAN论文精读
论文阅读·人工智能·论文笔记
腾飞开源6 分钟前
40_Spring AI 干货笔记之 Transformers (ONNX) 嵌入
人工智能·huggingface·onnx·transformers·嵌入模型·spring ai·句子转换器
平凡之路无尽路8 分钟前
google11月agent发展白皮书
人工智能·语言模型·自然语言处理·nlp·aigc·ai编程·agi
腾飞开源8 分钟前
41_Spring AI 干货笔记之 OpenAI SDK 嵌入(官方支持)
人工智能·嵌入模型·spring ai·openai sdk·github models·示例控制器·无密码认证
我的xiaodoujiao8 分钟前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 33--基础知识 8--切换窗口句柄
python·学习·测试工具·pytest
说私域10 分钟前
从“搅局”到“重构”:开源AI智能名片多商户商城小程序对电商生态的范式转型研究
人工智能·重构·开源
dhdjjsjs10 分钟前
Day37 PythonStudy
python
艾莉丝努力练剑14 分钟前
【Python基础:语法第六课】Python文件操作安全指南:告别资源泄露与编码乱码
大数据·linux·运维·人工智能·python·安全·pycharm