mmrotate不使用官方的split模块切割数据集,将数据集缩放到1024 * 1024

本文介绍了如何在不使用mmrotate框架的split模块的情况下,通过编写Python脚本将大尺寸图像数据集等比例缩放至1024*1024,并填充多余部分以适应模型训练。脚本同时更新了XML文件中的目标框坐标信息,确保旋转框目标检测的准确性。
摘要由CSDN通过智能技术生成

mmrotate数据集转化transform,不使用split

关于转化的想法

这几天因为项目需要使用旋转框目标检测,因此学习mmrotate框架来做目标检测,但是在学习过程中发现输入的数据集格式都是1024 * 1024,但是我自己的数据集6000 * 4000的,所以需要用到mmrotate官方提供的split模块把数据集进行剪裁,但是由于我的图片上的目标物体本身就少,加上剪裁之后本来完整的物体变成截断的了,所以我想办法把物体能不能把完整的图片输入到网络中进行训练,不使用官方给的剪裁工具(说实话真不好用,而且不适合实际的工业生产),所以我就写了一个脚本,把数据集等比例放缩到1024 * 1024,多余的部分填充为黑色。
下面展示 完整代码

import os
import xml.etree.ElementTree as ET
from PIL import Image

def resize_dataset(dataset_dir, output_dir, target_size):
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    for filename in os.listdir(dataset_dir):
        if filename.endswith('.xml'):
            # 解析XML文件
            xml_path = os.path.join(dataset_dir, filename)
            tree = ET.parse(xml_path)
            root = tree.getroot()

            # 获取图片路径和尺寸信息
            image_filename = root.find('path').text
            image_path = os.path.join(dataset_dir, image_filename)
            image = Image.open(image_path)
            width, height = image.size

            # 计算缩放比例
            max_dimension = max(width, height)
            scale_factor = target_size / max_dimension
            new_width = round(width * scale_factor)
            new_height = round(height * scale_factor)

            # 调整图像大小
            resized_image = image.resize((new_width, new_height), Image.ANTIALIAS)

            # 创建新的图像并填充背景
            background = Image.new('RGB', (target_size, target_size), (0, 0, 0))
            offset = ((target_size - new_width) // 2, (target_size - new_height) // 2)
            background.paste(resized_image, offset)

            # 保存调整后的图像
            new_image_filename = os.path.splitext(filename)[0] + '.png'
            new_image_path = os.path.join(output_dir, new_image_filename)
            background.save(new_image_path, 'PNG')

            # 更新XML文件中的尺寸信息
            for size in root.findall('size'):
                size.find('width').text = str(target_size)
                size.find('height').text = str(target_size)

            # 更新XML文件中的目标框坐标信息
            for obj in root.findall('object'):
                robndbox = obj.find('robndbox')
                if (robndbox == None):
                    print(filename)
                    continue
                cx = float(robndbox.find('cx').text)
                cy = float(robndbox.find('cy').text)
                w = float(robndbox.find('w').text)
                h = float(robndbox.find('h').text)
                angle = float(robndbox.find('angle').text)

                # 缩放目标框坐标
                print(offset[1])
                cx = cx * scale_factor + offset[0]
                cy = cy * scale_factor + offset[1]
                w *= scale_factor
                h *= scale_factor

                # 更新目标框坐标信息
                robndbox.find('cx').text = str(cx)
                robndbox.find('cy').text = str(cy)
                robndbox.find('w').text = str(w)
                robndbox.find('h').text = str(h)

            # 保存更新后的XML文件
            new_xml_path = os.path.join(output_dir, filename)
            tree.write(new_xml_path)

    print('Successfully resized dataset.')

# 调用示例
dataset_dir = R''  # 数据集标注文件xml文件路径
output_dir = R''  # 调整大小后的数据集输出文件夹路径
target_size = 1024  # 目标大小

resize_dataset(dataset_dir, output_dir, target_size)

因为数据集是保密的,因此我不在这里展示结果,但是亲测有效!!!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值