YOLO数据集实现数据增强的方法(裁剪、平移 、旋转、改变亮度、加噪声等)_yolov5数据增强_路人贾'ω'的博客-CSDN博客
这个看起来比较好目标检测带标签数据增强代码_目标检测 如何带标牌 进行数据增广-CSDN博客
下面这段示例代码将遍历指定文件夹中的图像和标签,根据所定义的增强参数应用相应的增强方法,并将增强后的图像和标签保存到指定的输出文件夹。请注意,Mosaic数据增强的实现需要根据具体需求编写,此处只提供了一个示例框架。根据具体需求,进一步自定义这些图像增强方法。
from PIL import Image
import os
import numpy as np
import random
from torchvision.transforms import functional as F
# 定义文件夹路径
image_folder = "images"
label_folder = "labels"
# 定义输出文件夹路径
output_image_folder = "augmented_images"
output_label_folder = "augmented_labels"
# 创建输出文件夹
os.makedirs(output_image_folder, exist_ok=True)
os.makedirs(output_label_folder, exist_ok=True)
# 自定义数据增强参数
rotate_range = (0, 30) # 随机旋转范围(0到30度)
perspective_prob = 0.5 # Perspective变换概率
horizontal_flip_prob = 0.5 # 水平翻转概率
scale_range = (0.8, 1.2) # 随机缩放范围(80%到120%)
vertical_flip_prob = 0.5 # 垂直翻转概率
mosaic_prob = 0.5 # Mosaic数据增强概率
# 循循环处理文件夹中的图像和标签
for filename in os.listdir(image_folder):
if filename.lower().endswith((".jpg", ".png")):
image_path = os.path.join(image_folder, filename)
label_path = os.path.join(label_folder, filename.replace(".jpg", ".txt"))
# 打开图像
image = Image.open(image_path)
# 打开标签文件
with open(label_path, "r") as label_file:
label_data = label_file.read().strip().split()
# 将标签数据转换为浮点数
labels = [float(val) for val in label_data]
# 随机旋转
if random.random() < 0.5:
rotate_angle = random.uniform(rotate_range[0], rotate_range[1])
image = image.rotate(rotate_angle, resample=Image.BILINEAR)
# Perspective变换
if random.random() < perspective_prob:
image = F.perspective(image)
# 随机水平翻转
if random.random() < horizontal_flip_prob:
image = image.transpose(Image.FLIP_LEFT_RIGHT)
labels[0::2] = [1.0 - x for x in labels[0::2]]
# 随机缩放
if random.random() < scale_range[1]:
scale_factor = random.uniform(scale_range[0], scale_range[1])
new_width = int(image.width * scale_factor)
new_height = int(image.height * scale_factor)
image = image.resize((new_width, new_height), resample=Image.BILINEAR)
labels = [x * scale_factor for x in labels]
# 随机垂直翻转
if random.random() < vertical_flip_prob:
image = image.transpose(Image.FLIP_TOP_BOTTOM)
labels[1::2] = [1.0 - x for x in labels[1::2]]
# Mosaic数据增强
if random.random() < mosaic_prob:
# 实现Mosaic数据增强
# 您可以根据需要编写特定的代码来实现Mosaic增强
# 保存增强后的图像
output_image_path = os.path.join(output_image_folder, filename)
image.save(output_image_path)
# 更新标签文件
updated_label_data = " ".join(map(str, labels))
output_label_path = os.path.join(output_label_folder, filename.replace(".jpg", ".txt"))
with open(output_label_path, "w") as updated_label_file:
updated_label_file.write(updated_label_data)
在上述示例代码中,假设图像文件和标签文件的文件名具有相同的名称,只是文件扩展名不同(图像文件是".jpg",标签文件是".txt")。代码会根据图像文件的名称查找相应的标签文件,并应用增强方法,然后将增强后的图像和标签分别保存到输出文件夹中,保持相同的文件名。
例如,如果有一个名为"image1.jpg"的图像文件,代码会查找相应的标签文件"image1.txt",然后对它们进行增强并分别保存为"image1.jpg"和"image1.txt",以保持文件名一致。
这种匹配文件名和转换的假设适用于示例中的简单情况。如果你的数据组织结构不同,例如图像和标签文件的命名方式不同,你可能需要根据实际情况进行自定义处理,以确保正确匹配和转换。