dota数据集的裁剪并转成xml格式

本文介绍如何对Dota数据集进行裁剪,并将其转换为XML格式,适用于机器学习和游戏分析。首先,我们将探讨数据预处理的重要性和步骤,接着详细解释裁剪过程,包括选择关键特征和剔除冗余数据。然后,我们讨论使用Python库如pandas和xml.etree.ElementTree来转换数据格式。最后,我们将提供完整的代码示例和注意事项,帮助读者实现自己的数据转换任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import os
import scipy.misc as misc
from xml.dom.minidom import Document
import numpy as np
import copy, cv2

def save_to_xml(save_path, im_height, im_width, objects_axis, label_name,name):
    im_depth = 0
    object_num = len(objects_axis)
    doc = Document()

    annotation = doc.createElement('annotation')
    doc.appendChild(annotation)

    folder = doc.createElement('folder')
    folder_name = doc.createTextNode('VOC2007')
    folder.appendChild(folder_name)
    annotation.appendChild(folder)

    filename = doc.createElement('filename')
    filename_name = doc.createTextNode(name)
    filename.appendChild(filename_name)
    annotation.appendChild(filename)


    size = doc.createElement('size')
    annotation.appendChild(size)
    width = doc.createElement('width')
    width.appendChild(doc.createTextNode(str(im_width)))
    height = doc.createElement('height')
    height.appendChild(doc.createTextNode(str(im_height)))
    depth = doc.createElement('depth')
    depth.appendChild(doc.createTextNode(str(im_depth)))
    size.appendChild(width)
    size.appendChild(height)
    size.appendChild(depth)
    segmented = doc.createElement('segmented')
    segmented.appendChild(doc.createTextNode('0'))
    annotation.appendChild(segmented)
    for i in range(object_num):
        objects = doc.createElement('object')
        annotation.appendChild(objects)
        object_name = doc.createElement('name')
        object_name.appendChild(doc.createTextNode(label_name[int(objects_axis[i][-1])]))
        objects.appendChild(object_name)
        pose = doc.createElement('pose')
        pose.appendChild(doc.createTextNode('Unspecified'))
        objects.appendChild(pose)
        truncated = doc.createElement('truncated')
        truncated.appendChild(
### 裁剪DOTA数据集的方法 对于DOTA数据集裁剪处理,可以通过官方提供的 `DOTA_devkit` 工具包来实现[^1]。该工具包提供了多种功能模块,其中包括图像分割和标注文件同步更新的功能。 #### 使用 DOTA_devkit 进行裁剪 以下是基于 `DOTA_devkit` 的具体方法: 1. **安装依赖库** 首先需要克隆并设置好 `DOTA_devkit` 环境。确保 Python 和必要的第三方库已正确配置。 2. **运行裁剪脚本** 在 `DOTA_devkit` 中存在专门用于裁剪大图的脚本 `split_image.py` 或类似的函数逻辑。通过调用此脚本,可以将原始的大尺寸遥感图像切分为多个较小的部分,并自动调整对应的标注文件中的目标位置信息。以下是一个简单的代码示例: ```python from dota_utils import split_single # 假设这是 devkit 提供的一个接口 input_img_dir = 'path_to_dota_images' output_split_dir = 'output_directory_for_cropped_images' crop_size = (1024, 1024) # 设置裁剪大小为 1024x1024 overlap_ratio = 0.2 # 图像重叠比例 for img_name in os.listdir(input_img_dir): if img_name.endswith('.png'): image_path = os.path.join(input_img_dir, img_name) split_single(image_path, output_split_dir, crop_size, overlap_ratio) ``` 3. **同步修改标注文件** 当完图像裁剪后,需对原 JSON 格式的标注文件进行解析与重新映射到新的子图上。这一步骤同样由 `DOTA_devkit` 自动完,在执行裁剪的同时会生对应的小图标注文件。 --- #### 手动方式裁剪(无 DOTA_devkit) 如果不想借助官方工具,则可手动编写裁剪程序。下面展示了一个通用的解决方案: ```python import cv2 import json from pathlib import Path def crop_and_update_labels(img_file, label_file, save_dir, crop_size=(1024, 1024), stride=768): """ 对单张图片及其标签进行裁剪,并保存新图片和更新后的标签 参数: img_file: 输入图片路径 label_file: 对应的JSON格式标签文件路径 save_dir: 输出目录 crop_size: 切割窗口大小,默认(1024, 1024) stride: 移动步幅,默认768像素 返回值: None """ img = cv2.imread(str(img_file)) h, w = img.shape[:2] with open(label_file, 'r') as f: labels = json.load(f) cropped_count = 0 for y_start in range(0, h, stride): for x_start in range(0, w, stride): x_end = min(x_start + crop_size[0], w) y_end = min(y_start + crop_size[1], h) if x_end - x_start < crop_size[0] or y_end - y_start < crop_size[1]: continue cropped_img = img[y_start:y_end, x_start:x_end] new_label_list = [] for obj in labels['objects']: bbox = obj['bbox'] # 将全局坐标系下的框转换至局部裁剪区域内的相对坐标 xmin, ymin, xmax, ymax = map(int, bbox) local_xmin = max(min(xmin - x_start, crop_size[0]), 0) local_ymin = max(min(ymin - y_start, crop_size[1]), 0) local_xmax = max(min(xmax - x_start, crop_size[0]), 0) local_ymax = max(min(ymax - y_start, crop_size[1]), 0) if local_xmax > local_xmin and local_ymax > local_ymin: updated_bbox = [local_xmin, local_ymin, local_xmax, local_ymax] new_obj = {**obj} new_obj['bbox'] = updated_bbox new_label_list.append(new_obj) if not new_label_list: continue out_img_path = Path(save_dir) / f"{img_file.stem}_{cropped_count}.jpg" out_json_path = Path(save_dir) / f"{img_file.stem}_{cropped_count}.json" cv2.imwrite(str(out_img_path), cropped_img) with open(out_json_path, 'w') as jf: data = {'image': str(out_img_path.name), 'objects': new_label_list} json.dump(data, jf, indent=4) cropped_count += 1 # 示例调用 input_folder = './dota_data/images/' labels_folder = './dota_data/annotations/' save_output = './processed/' for img_f in Path(input_folder).glob('*.png'): lbl_f = Path(labels_folder) / f"{img_f.stem}.json" if lbl_f.exists(): crop_and_update_labels(img_f, lbl_f, save_output) ``` 上述代码实现了自定义裁剪逻辑,并能够适配不同分辨率的目标检测场景需求[^2][^3]。 --- ### 数据预处理注意事项 - 如果计划训练 YOLO 模型,还需进一步将裁剪后的标注文件转化为其支持的标准输入格式。 - 可视化验证:每次裁剪后建议随机抽取若干样本查看效果是否正常。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值