【目标检测】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)
相关推荐
站大爷IP3 分钟前
Python中None与NoneType的真相:从单例对象到类型系统的深度解析
python
秋难降3 分钟前
LRU缓存算法(最近最少使用算法)——工业界缓存淘汰策略的 “默认选择”
数据结构·python·算法
站大爷IP14 分钟前
Python新手踩坑实录:这些错误你可能正在犯
python
ezl1fe15 分钟前
RAG 每日一技(十八):手写SQL-RAG太累?LangChain的SQL智能体(Agent)前来救驾!
数据库·人工智能·后端
我星期八休息19 分钟前
大模型 + 垂直场景:搜索/推荐/营销/客服领域开发新范式与技术实践
大数据·人工智能·python
飞哥数智坊24 分钟前
等了这么久,企业微信的AI终于来了!
人工智能
Christo325 分钟前
SIGKDD-2023《Complementary Classifier Induced Partial Label Learning》
人工智能·深度学习·机器学习
深盾安全29 分钟前
uv,下一代Python包管理工具
python
AIGC安琪37 分钟前
Transformer中的编码器和解码器是什么?
人工智能·深度学习·ai·语言模型·大模型·transformer·ai大模型
算家计算1 小时前
3秒搞定产品换装换背景!【ComfyUI-万物迁移工作流】本地部署教程:基于FLUX.1 Kontext上下文感知图像编辑
人工智能