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

本文介绍了如何使用Python对单张图像进行水平和垂直翻转,并相应地更新YOLO格式的标签。同时提供了一个函数,用于在给定目录下批量扩充图像数据集,生成不同翻转模式下的副本。
摘要由CSDN通过智能技术生成
'''扩充单张图像'''
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)

 

 

  • 13
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
YOLO分类数据集是一种用于训练物体分类模型的数据集YOLO(You Only Look Once)是一种基于深度学习的物体检测和分类算法。与传统的物体检测算法相比,YOLO算法具有更高的实时性能和准确性。 YOLO分类数据集通常包含大量的图像,每个图像都包含一个或多个物体,并且标注了其对应的类别。这些标注信息可以是物体的类别名称、位置以及其他相关属性。这些数据集可以用来训练YOLO模型,使其能够从图像中准确地识别和分类物体。 对于一个典型的YOLO分类数据集,可以使用图像数据和标签文件来表示。图像数据是数据集中的图像文件,标签文件则包含了图像中物体的类别标签和其位置信息。标签文件的格式通常是XML或JSON,其中每个物体都包含了类别名称和边界框的坐标。 为了训练YOLO模型,首先需要数据集划分为训练集和测试集。训练集用于训练模型的参数,而测试集则用于评估模型的性能。接下来,使用数据增强技术对训练集进行增强,以扩充训练数据并提高模型的泛化能力。 训练过程中,将图像输入到YOLO模型中,模型会输出对图像中物体的分类结果和位置信息。通过计算输出结果与真实标签之间的损失函数,可以使用反向传播算法对模型进行优化,以提高模型的准确性和性能。 在训练完成后,可以使用YOLO模型对新的图像进行分类。模型会预测图像中物体的类别,并输出相应的概率值。这些概率可以用来确定图像中物体的类别,从而实现物体分类的功能。 综上所述,YOLO分类数据集是一种用于训练物体分类模型的数据集,可以通过训练和优化YOLO模型来实现准确和实时的物体分类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值