利用Albumentations工具包进行图像的数据增强(以yolo数据标注格式为例)

最近在看数据增强方法时,看到了这个有趣的工具包,研究了下并以yolo数据标注格式为例写了一个示例脚本。

该工具最大的好处是会根据你使用的数据增强方法自动修改标注框信息!

import albumentations as A
import cv2
import os

"""
该脚本主要实现了利用albumentations工具包对yolo标注数据进行增强
给定一个存放图像和标注文件的主目录,在主目录下自动生成增强的图像和标注文件
"""


def get_enhance_save(old_images_files, old_labels_files, label_list, enhance_images_files, enhance_labels_files):

    # 这里设置指定的数据增强方法
    transform = A.Compose([
        # A.RandomCrop(width=450, height=450),
        # A.HorizontalFlip(p=1),
        A.VerticalFlip(p=1),
        A.RandomBrightnessContrast(p=0.2),
    ], bbox_params=A.BboxParams(format='yolo', min_area=1024, min_visibility=0.2, label_fields=['class_labels']))

    # 这里指定修改后image和label的文件名
    mid_name = "_VerticalFlip"

    label_files_name = os.listdir(old_labels_files)

    for name in label_files_name:

        label_files = os.path.join(old_labels_files, name)

        yolo_b_boxes = open(label_files).read().splitlines()

        bboxes = []

        class_labels = []

        # 对一个txt文件的每一行标注数据进行处理
        for b_box in yolo_b_boxes:
            b_box = b_box.split(" ")
            m_box = b_box[1:5]

            m_box = list(map(float, m_box))

            m_class = b_box[0]

            bboxes.append(m_box)
            class_labels.append(label_list[int(m_class)])

        # 读取对应的图像
        image_path = os.path.join(old_images_files, name.replace(".txt", ".png"))
        if os.path.exists(image_path) is False:
            image_path = os.path.join(old_images_files, name.replace(".txt", ".jpg"))

        image = cv2.imread(image_path)
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

        # 调用上面定义的图像增强方法进行数据增强
        transformed = transform(image=image, bboxes=bboxes, class_labels=class_labels)
        transformed_image = transformed['image']
        transformed_image = cv2.cvtColor(transformed_image, cv2.COLOR_BGR2RGB)
        transformed_b_boxes = transformed['bboxes']
        transformed_class_labels = transformed['class_labels']

        # 先判断目标文件夹路径是否存在
        if os.path.exists(enhance_images_files) is False:
            os.mkdir(enhance_images_files)
        a, b = os.path.splitext(name)
        new_name = a + mid_name + b
        cv2.imwrite(os.path.join(enhance_images_files, new_name.replace(".txt", ".png")), transformed_image)

        if os.path.exists(enhance_labels_files) is False:
            os.mkdir(enhance_labels_files)

        new_txt_file = open(os.path.join(enhance_labels_files, new_name), "w")

        new_bboxes = []

        for box, label in zip(transformed_b_boxes, transformed_class_labels):

            new_class_num = label_list.index(label)
            box = list(box)
            for i in range(len(box)):
                box[i] = str(('%.5f' % box[i]))
            box.insert(0, str(new_class_num))
            new_bboxes.append(box)

        for new_box in new_bboxes:

            for ele in new_box:
                if ele is not new_box[-1]:
                    new_txt_file.write(ele + " ")
                else:
                    new_txt_file.write(ele)

            new_txt_file.write('\n')

        new_txt_file.close()


def main():

    root = r"D:\datasets\T_augmentation"

    old_images_files = os.path.join(root, "images")
    old_labels_files = os.path.join(root, "labels")

    enhance_images_files = os.path.join(root, "enhance_images")
    enhance_labels_files = os.path.join(root, "enhance_labels")

    # 这里设置数据集的类别
    label_list = ["Car", "Plane"]

    # 实现对传入的数据文件进行遍历读取,并进行数据增强
    get_enhance_save(old_images_files, old_labels_files, label_list, enhance_images_files, enhance_labels_files)


if __name__ == '__main__':
    main()

各种示例

AdvancedBlur(左边为原图,右边为增强图像)

        Blur the input image using a Generalized Normal filter with a randomly selected parameters. This transform also adds multiplicative noise to generated kernel before convolution.(使用随机选择参数的广义法线滤波器对输入图像进行模糊处理。这种变换还在卷积之前向生成的内核添加了乘法噪声)

Blur(左边为原图,右边为增强图像)

        Blur the input image using a random-sized kernel.

CLAHE(左边为原图,右边为增强图像) 

        Apply Contrast Limited Adaptive Histogram Equalization to the input image.(对输入图像应用对比度有限的自适应直方图均衡化)

ChannelDropout(左边为原图,右边为增强图像) 

        Randomly Drop Channels in the input Image.

ChannelShuffle (左边为原图,右边为增强图像) 

        Randomly rearrange channels of the input RGB image.

ColorJitter(左边为原图,右边为增强图像) 

        Randomly changes the brightness, contrast, and saturation of an image. Compared to ColorJitter from torchvision, this transform gives a little bit different results because Pillow (used in torchvision) and OpenCV (used in Albumentations) transform an image to HSV format by different formulas. Another difference - Pillow uses uint8 overflow, but we use value saturation.(随机改变图像的亮度、对比度和饱和度。与来自torchvision的ColorJitter相比,这种变换给出了一点不同的结果,因为Pillow(用于torchvision)和OpenCV(用于Albumentations)通过不同的公式将图像转换成HSV格式。另一个区别是--Pillow使用uint8溢出,而我们使用值饱和度)

Defocus(左边为原图,右边为增强图像) 

        Apply defocus transform.(应用散焦变换)

Downscale(左边为原图,右边为增强图像) 

        Decreases image quality by downscaling and upscaling back.

Emboss(左边为原图,右边为增强图像) 

        Emboss the input image and overlays the result with the original image.(对输入的图像进行压印,并将结果与原始图像叠加。)

Equalize(左边为原图,右边为增强图像) 

        Equalize the image histogram.(对图像直方图进行均衡化)

FancyPCA(左边为原图,右边为增强图像) 

        Augment RGB image using FancyPCA from Krizhevsky's paper "ImageNet Classification with Deep Convolutional Neural Networks"

 

Reference:

        GitHub - albumentations-team/albumentations: Fast image augmentation library and an easy-to-use wrapper around other libraries. Documentation: https://albumentations.ai/docs/ Paper about the library: https://www.mdpi.com/2078-2489/11/2/125

        Bounding boxes augmentation for object detection - Albumentations Documentation 

  • 12
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: EMNIST数据集是一个大型的手写数字和字母识别数据集,在将其转换为YOLO可识别的数据格式之前,需要对数据进行一些处理步骤。 首先,数据集中的图像需要进行预处理,以确保它们的大小和分辨率符合YOLO的要求。然后,对于每个图像,需要标注其中的数字或字母的位置以及相关的类别信息。 接下来,可以使用一个标注工具,如 LabelImg,将这些标注转换为YOLO需要的标注格式。一般来说,YOLO需要每个图像的路径和一个包含目标框位置和类别信息的文本文件。 最后,可以将处理并标注的数据集分为训练数据集和测试数据集,然后将其输入YOLO进行训练。 总的来说,将EMNIST数据集转换为YOLO可识别的数据格式需要一些数据预处理和标注步骤,但是它们对于提高模型准确性是非常有益的。 ### 回答2: EMNIST数据集是一个包含手写数字和字母的数据集,可以用于模式识别和机器学习任务。要将EMNIST数据集转换为YOLO可识别的数据格式,需要进行以下步骤: 首先,加载EMNIST数据集并进行预处理。EMNIST数据集中的图像分辨率较低,通常为28x28像素。我们可以将图像进行缩放,将其调整为YOLO模型所需的固定大小(例如416x416像素)。这可以通过图像处理库(如OpenCV)来完成。 其次,我们需要将原始标签格式转换为YOLO可识别的标签格式。EMNIST数据集的标签是整数值,表示图像中的字符或数字。YOLO模型需要的是每个边界框的类别标签和包围框的位置信息。因此,我们需要将每个字符的标签转换成对应的类别标签,并计算每个边界框的位置信息(中心坐标、宽度和高度)。 接下来,根据转换后的标签信息,我们需要将数据格式转换为YOLO可识别的数据格式YOLO模型需要的格式是每行表示一个图像的信息,每行包括图像路径和对应的边界框信息。边界框信息包括类别标签、边界框的中心坐标、宽度和高度。可以将每个图像的标签和边界框信息保存在一个文本文件中。 最后,训练YOLO模型。使用经过转换的数据格式和相应的标签数据,可以进行模型的训练。可以使用YOLO的相关库和工具来进行训练,并根据训练效果进行模型的优化和调整。 通过以上步骤,可以将EMNIST数据集转换为YOLO可识别的数据格式,并使用该格式进行模型训练和图像识别。 ### 回答3: EMNIST数据集是一个手写字母和数字的图像数据集,通常用来进行机器学习和图像识别任务。要将它转换为YOLO可识别的数据格式,我们需要按照以下步骤处理数据集: 1. 下载和导入数据集:首先,我们需要从适当的来源下载EMNIST数据集,并确保将数据集文件导入到我们的工作环境中。 2. 数据预处理:接下来,我们需要对数据集进行预处理,以便将其转换为YOLO可识别的格式。这包括一些步骤: - 将每个样本的图像调整为固定大小,以便与YOLO模型的输入大小匹配。 - 将图像转换为RGB格式,因为YOLO模型通常使用RGB图像进行训练。 - 对每个样本进行标签处理,以便将类别索引转换为适当的YOLO格式。例如,将每个字母或数字的标签编码为独热编码。 - 将图像和标签的处理后的数据保存在一个新的文件中,以供后续的训练和测试使用。 3. 划分数据集:为了进行训练和测试,我们需要将数据集划分为训练集和测试集。通常,我们使用大部分数据作为训练集,剩下的部分作为测试集。可以根据需求进行划分,并将划分好的数据集保存下来。 4. 创建YOLO标签文件:YOLO模型需要一个标签文件,其中包含了每个样本的位置和类别信息。我们可以使用训练集数据来制作这个标签文件。在标签文件中,每一行对应一个样本,格式为:类别索引 + 中心坐标(x, y) + 宽度 + 高度。这些信息可以通过对图像进行处理和分析得到。 5. 进行训练和测试:将数据集和标签文件加载到YOLO模型中,进行训练和测试。根据需要,可以调整模型的超参数和训练策略,以获得更好的性能和准确度。 以上步骤是将EMNIST数据集处理成YOLO可识别的数据格式的基本思路。根据具体的要求和实际情况,可能需要根据需要进行一些额外的处理和调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值