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)