使用Python进行Yolo目标检测的带txt标签进行数据增强

本文介绍了一款专为YOLOv8设计的Python数据增强脚本,通过多种技术如缩放、翻转、裁剪和图像属性调整,提高模型的泛化能力和在不同条件下的识别能力。脚本提供实用函数方便使用,并展示了效果对比。

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

yolov8导航

        如果大家想要了解关于yolov8的其他任务和相关内容可以点击这个链接,我这边整理了许多其他任务的说明博文,后续也会持续更新,包括yolov8模型优化、sam等等的相关内容。

YOLOv8(附带各种任务详细说明链接)

源码下载地址:

        Python实现Yolo目标检测全面数据增强脚本 - 提升模型性能和泛化能力 

引言

        在目标检测领域,数据增强是提高模型性能的关键步骤。本文介绍了一个专为Yolo目标检测模型设计的数据增强脚本。此脚本使用Python编写,利用PIL库和PyTorch来处理图像和标签数据。 

数据增强的重要性

        数据增强通过对训练数据应用一系列变换来增加数据的多样性,从而提高模型的泛化能力。这对于目标检测尤为重要,因为模型需要能够在各种条件下准确地识别和定位对象。

脚本概述

        我们的脚本包含一个名为 DataAugmentationOnDetection 的类,它实现了多种数据增强技术,如缩放、翻转、裁剪和调整图像属性(亮度、对比度、饱和度)。此外,脚本还提供了一些辅助函数,用于加载图像、读取标签文件、显示处理后的图像,以及保存增强后的图像和标签。

主要方法和功能

  • 缩放(保持比例)resize_keep_ratioresizeDown_keep_ratio 方法可以缩放图像,同时保持其长宽比,适用于不同大小的图像。

  • 随机翻转random_flip_horizonrandom_flip_vertical 方法提供了图像的水平和垂直翻转功能,增加了样本的多样性。

  • 中心裁剪center_crop 方法对图像进行中心裁剪,生成更集中的图像区域,有助于模型关注目标区域。

  • 图像属性调整random_brightrandom_contrastrandom_saturation 方法调整图像的亮度、对比度和饱和度,提高模型对不同光照和颜色条件的适应性。

  • 添加噪声add_gasuss_noiseadd_salt_noiseadd_pepper_noise 方法通过添加不同类型的噪声,使模型能够更好地处理现实世界的不完美图像。

使用示例

        使用这个脚本非常简单。首先,定义图像和标签的文件夹路径,然后调用 runAugumentation 函数处理所有图像。该函数会自动遍历图像文件夹,对每个图像应用多种数据增强方法,并将结果保存到指定目录。

效果展示

        可以通过 plot_pics 函数展示数据增强前后的图像对比。这有助于直观地理解数据增强对图像的影响。

 

 

### 使用 LabelImg 进行图像标注后的数据增强使用LabelImg工具完成图像标注之后,对于大量图片及其对应的标签文件进行高效的数据增强操作是一个常见需求。为了确保在执行诸如翻转、旋转等变换的同时能够同步更新相应的标签信息,可以采用编程方式批量处理这些任务。 #### 批量重命名并集中存储图片 考虑到原始图片按照不同标准分布在多个子目录下,在开始任何进一步的操作之前,应该先统一管理所有待处理的素材。这一步骤可以通过编写脚本来自动添加描述性前缀至每张照片的名字里(例如:“合格_20230101_image.jpg”),从而保留原有的分类特征;接着把这些经过预处理过的影像移动到单一的目标文件夹中以便后续操作[^1]。 ```python import os from shutil import copyfile source_dirs = ['path/to/qualified', 'path/to/unqualified'] # 替换为实际路径列表 destination_dir = './images/train' # 设置目标位置 for src in source_dirs: for filename in os.listdir(src): if filename.endswith(".jpg") or filename.endswith(".png"): new_name = f"{os.path.basename(os.path.normpath(src))}_{filename}" full_src_path = os.path.join(src, filename) dest_file_path = os.path.join(destination_dir, new_name) copyfile(full_src_path, dest_file_path) ``` #### 实现YOLO格式下的数据增强 针对已经存在于`images/train`内的JPEG/PNG文档以及配套的TXT形式边界框定义,可利用Python库如OpenCV来进行视觉效果上的调整,并相应修改关联的文字记录以反映新的几何参数变化情况。下面给出了一段示范代码片段用于说明如何围绕中心点顺时针方向旋转指定角度: ```python import cv2 import numpy as np def rotate_bound(image, angle): (h, w) = image.shape[:2] center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, -angle, scale=1.0) cos = np.abs(M[0, 0]) sin = np.abs(M[0, 1]) nW = int((h * sin) + (w * cos)) nH = int((h * cos) + (w * sin)) M[0, 2] += (nW / 2) - center[0] M[1, 2] += (nH / 2) - center[1] rotated = cv2.warpAffine( image, M, (nW, nH), borderMode=cv2.BORDER_CONSTANT, borderValue=(255, 255, 255) ) return rotated, M def update_yolo_labels(label_lines, rotation_matrix, original_shape, new_shape): updated_labels = [] for line in label_lines.splitlines(): parts = list(map(float, line.strip().split())) cls_id = int(parts[0]) cx_norm, cy_norm, bw_norm, bh_norm = parts[1:] ox, oy = ((cx_norm-.5)*original_shape[1],(cy_norm-.5)*original_shape[0]) point = np.array([ox,oy,1]).reshape(-1,1).astype(np.float32) transformed_point = rotation_matrix @ point nx, ny = map(int,(transformed_point.flatten()+new_shape[::-1]/2)/np.array(new_shape)[::-1]*2) nw, nh = bw_norm*new_shape[1],bh_norm*new_shape[0] updated_line = "{} {} {} {} {}".format(cls_id,nx/(nw+1e-8),ny/(nh+1e-8),bw_norm,bh_norm) updated_labels.append(updated_line) return "\n".join(updated_labels) image_files = ['./images/train/*.jpg'] label_files = ['./labels/train/*.txt'] rotation_angle = 90 # 定义所需的角度值 for img_f, lbl_f in zip(sorted(glob.glob(*image_files)), sorted(glob.glob(*label_files))): with open(lbl_f,'r')as file: labels=file.read() orig_img = cv2.imread(img_f) rot_img, trans_mat = rotate_bound(orig_img.copy(), rotation_angle) upd_lbls = update_yolo_labels(labels,trans_mat,orig_img.shape[:-1][::-1],rot_img.shape[:-1][::-1]) output_filename_base = os.path.splitext(os.path.basename(img_f))[0]+"_rotated" out_img_path = os.path.join('./output_images/',f'{output_filename_base}.jpg') out_txt_path = os.path.join('./output_labels/',f'{output_filename_base}.txt') cv2.imwrite(out_img_path, rot_img) with open(out_txt_path,"w") as txt_out: txt_out.write(upd_lbls) ``` 上述过程实现了对给定角速度范围内随机选取一定数量样本集实施旋转变形动作的功能,同时也保证了`.txt`类型的元数据得以正确无误地跟随主体图形一同被修正保存下来[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

E寻数据

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值