python扩充yolov8数据集(图像和标签同时扩充)

本文介绍了如何使用Python对单张图像进行水平和垂直翻转,并相应地更新YOLO格式的标签。同时提供了一个函数,用于在给定目录下批量扩充图像数据集,生成不同翻转模式下的副本。

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

'''扩充单张图像'''
import os
import cv2

def flip_yolo_labels(labels, img_width, img_height):
    flipped_labels = []
    for label in labels:
        class_id, x_center, y_center, width, height = label.split()
        x_center = 1 - float(x_center)  # 水平翻转中心点 x 坐标
        flipped_labels.append(f"{class_id} {x_center} {y_center} {width} {height}\n")
    return flipped_labels


def flip_image_and_labels(image_folder, label_folder, output_folder):
    for filename in os.listdir(image_folder):
        if filename.endswith('.jpg') or filename.endswith('.png'):
            image_path = os.path.join(image_folder, filename)
            label_path = os.path.join(label_folder, os.path.splitext(filename)[0] + '.txt')

            # 读取并翻转图像
            img = cv2.imread(image_path)
            flipped_img = cv2.flip(img, 1)  # 水平翻转

            # 读取并翻转标签
            with open(label_path, 'r') as file:
                labels = file.readlines()
            flipped_labels = flip_yolo_labels(labels, img.shape[1], img.shape[0])

            # 保存翻转后的图像和标签
            cv2.imwrite(os.path.join(output_folder, 'flipped_' + filename), flipped_img)
            with open(os.path.join(output_folder, 'flipped_' + os.path.splitext(filename)[0] + '.txt'), 'w') as file:
                file.writelines(flipped_labels)


# 设置文件夹路径
image_folder = 'D:\WORK\work1\labelss\\allimage'
label_folder = 'D:\WORK\work1\labelss\\alllabels'
output_folder = 'D:\WORK\work1\labelss\kuochong-images'

# 确保输出文件夹存在
if not os.path.exists(output_folder):
    os.makedirs(output_folder)

# 执行翻转操作
flip_image_and_labels(image_folder, label_folder, output_folder)


'''每张图像可以设置扩充多少张'''
# import os
# import cv2
#
# def flip_yolo_labels(labels, flip_mode, img_width, img_height):
#     flipped_labels = []
#     for label in labels:
#         parts = label.split()
#         class_id = parts[0]
#         x_center, y_center, width, height = map(float, parts[1:])
#
#         if flip_mode == 1 or flip_mode == -1:  # 水平翻转
#             x_center = 1 - x_center
#         if flip_mode == 0 or flip_mode == -1:  # 垂直翻转
#             y_center = 1 - y_center
#
#         flipped_labels.append(f"{class_id} {x_center} {y_center} {width} {height}\n")
#
#     return flipped_labels
#
# def flip_image_and_labels(image_path, label_path, output_image_path, output_label_path, flip_mode):
#     # 读取图像
#     img = cv2.imread(image_path)
#     height, width = img.shape[:2]
#
#     # 翻转图像
#     flipped_img = cv2.flip(img, flip_mode)
#
#     # 读取并翻转标签
#     with open(label_path, 'r') as file:
#         labels = file.readlines()
#     flipped_labels = flip_yolo_labels(labels, flip_mode, width, height)
#
#     # 保存翻转后的图像和标签
#     cv2.imwrite(output_image_path, flipped_img)
#     with open(output_label_path, 'w') as file:
#         file.writelines(flipped_labels)
#
# def augment_dataset(image_folder, label_folder, output_folder, num_copies=3):#num_copies设置扩充多少张
#     if not os.path.exists(output_folder):
#         os.makedirs(output_folder)
#
#     for filename in os.listdir(image_folder):
#         if filename.endswith('.jpg') or filename.endswith('.png'):
#             image_path = os.path.join(image_folder, filename)
#             label_path = os.path.join(label_folder, os.path.splitext(filename)[0] + '.txt')
#
#             # 为每个图像生成指定数量的扩充版本
#             for i in range(num_copies):
#                 output_image_path = os.path.join(output_folder, f"{os.path.splitext(filename)[0]}_flip_{i}.jpg")
#                 output_label_path = os.path.join(output_folder, f"{os.path.splitext(filename)[0]}_flip_{i}.txt")
#                 flip_mode = i - 1  # -1: 水平+垂直翻转, 0: 垂直翻转, 1: 水平翻转
#                 flip_image_and_labels(image_path, label_path, output_image_path, output_label_path, flip_mode)
#
# # 设置文件夹路径
# image_folder = 'path_to_your_image_folder'
# label_folder = 'path_to_your_label_folder'
# output_folder = 'path_to_output_folder'
#
# # 执行数据集扩充
# augment_dataset(image_folder, label_folder, output_folder)

 

 

 

### YOLOv8 数据集扩充方法与数据增强技术实现 #### 数据增强的作用 数据增强是一种重要的技术手段,用于增加训练数据的多样性并减少过拟合的风险。对于目标检测任务而言,数据增强能够帮助模型更好地泛化到未见过的数据场景中[^1]。 #### YOLOv8内置的数据增强方式 YOLOv8在网络训练阶段提供了多种在线数据增强方法,这些方法可以直接应用于输入数据而不需额外的手动处理。主要的方式包括: - **马赛克增强 (Mosaic)** 马赛克增强会将四张图片拼接成一张大图作为新的训练样本。这种方式可以显著提升模型对复杂背景多物体分布的学习能力[^1]。 - **混合增强 (Mixup)** 混合增强通过对两张不同图片及其对应的标签按一定比例线性组合来生成新样本。这种方法有助于平滑决策边界,提高模型鲁棒性。 - **随机透视变换 (Random Perspective)** 这一增强方式模拟现实世界中的视角变化,通过调整图像的比例、旋转角度平移距离等方式引入更多样化的视觉效果。 - **颜色空间扰动 (HSV Augmentation)** HSV增强改变图像的颜色属性(色调Hue、饱度Saturation明度Value),从而让模型适应不同的光照条件色彩表现形式。 以上提到的所有增强策略均已在官方仓库中实现,并可通过配置文件灵活启用或禁用某些特定功能。 #### 手动扩展数据集的方法 除了利用框架内部提供的自动增强机制外,还可以借助外部工具预先完成更大规模的数据扩增工作。例如引用材料二提到了一种支持多达九种独立转换操作的技术方案[^2],其中包括但不限于水平/垂直镜像翻转、任意角度范围内的自由旋转以及亮度对比度调节等功能模块。这类离线预处理流程通常更适合那些希望提前准备好全部所需素材再投入正式迭代过程的情况。 以下是基于Python脚本的一个简单例子展示如何批量应用基本几何变形至目录下的每张原始照片连同其关联标注信息一起保存下来形成扩大版集合版本: ```python import os from PIL import Image, ImageOps import xml.etree.ElementTree as ET def flip_image_and_label(image_path, label_path, output_dir): img = Image.open(image_path) flipped_img = ImageOps.mirror(img) tree = ET.parse(label_path) root = tree.getroot() for obj in root.findall('object'): bndbox = obj.find('bndbox') xmin = int(bndbox.find('xmin').text) xmax = int(bndbox.find('xmax').text) new_xmin = img.width - xmax new_xmax = img.width - xmin bndbox.find('xmin').text = str(new_xmin) bndbox.find('xmax').text = str(new_xmax) base_name = os.path.basename(os.path.splitext(image_path)[0]) flipped_img.save(f"{output_dir}/{base_name}_flipped.jpg") tree.write(f"{output_dir}/{base_name}_flipped.xml") # Example usage flip_image_and_label("input/image.jpg", "input/image.xml", "output/") ``` 此代码片段仅演示了一个简单的左右反转案例;实际项目里可根据需求定制更加复杂的逻辑链路覆盖更广泛的变化维度。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值