即插即用,语义分割数据增强

目前数据增强的库有很多,但是针对不同的目的,数据增强的方式各不相同,这次写了一个语义分割数据增强的方法。

通常情况下,数据增强的方式有裁剪,缩放,翻转,增加噪声,修改对比度等等。这次的方法是用于随机裁剪缩放拼接的。

数据准备

VOC格式的数据

JPEGImages下是原始影像,jpg格式,SegmentationClass下是标签,png格式。

 

 之前写过一个数据增强的方式,是用于随机拼接的,不是很完善,此次是对之前的方式进行更新。现图片是上次数据增强后的结果中随便选的几个,可以看出来,只是单纯的进行了缩放拼接。并没有太多处理,大家也可以用没有经过数据增强的图片和标签,只要标签的格式是VOC格式的就行。如果是labelme标注的标签,网上查一下将其转换成VOC格式的脚本就行。

代码

def random_concat_images_and_masks(img_folder, mask_folder,num):

    import os
    import random
    from PIL import Image

    img_names = os.listdir(img_folder)
    selected_img_names = random.sample(img_names, num)

    base_img_name = selected_img_names[0]
    base_img = Image.open(os.path.join(img_folder, base_img_name))
    base_mask_name = os.path.splitext(base_img_name)[0] + '.png'
    base_mask = Image.open(os.path.join(mask_folder, base_mask_name))

    for img_name in selected_img_names[1:]:
        img = Image.open(os.path.join(img_folder, img_name))
        mask_name = os.path.splitext(img_name)[0] + '.png'
        mask = Image.open(os.path.join(mask_folder, mask_name))

        scale = random.uniform(0.5, 1.5)
        img = img.resize((int(img.width * scale), int(img.height * scale)))
        mask = mask.resize((int(mask.width * scale), int(mask.height * scale)))

        base_img.paste(img, (0, 0))
        base_mask.paste(mask, (0, 0))

    return base_img, base_mask

直接上代码,这个函数对图片以及其标签进行了随机缩放,随即裁剪,随机拼接。

使用方式:

base_img,base_mask = random_concat_images_and_masks(img_folder,mask_folder,num)

参数:

img_folder为图像的路径,
mask_folder为标签路径, 
num 为随机选中几个图像。

方法的作用:

此方法会在数据集中随机选择num个图像,以及其对应的标签,进行随机的缩放,裁剪,拼接,并返回图像以及标签

demo:

if __name__ == '__main__':
    img_folder = 'E:/project3/unet-pytorch-main/datasets/JPEGImages'
    mask_folder = 'E:/project3/unet-pytorch-main/datasets/SegmentationClass'
    img_aug_folder = 'E:/project3/unet-pytorch-main/datasets/JPEGImages_augmentation'
    mask_aug_folder = 'E:/project3/unet-pytorch-main/datasets/SegmentationClass_augmentation'

    for i in range(3):
        base_img,base_mask = random_concat_images_and_masks(img_folder,mask_folder,3)
        base_img.save(os.path.join(img_aug_folder,f'aug{i}.jpg'))
        base_mask.save(os.path.join(mask_aug_folder,f'aug{i}.png'))

 循环三次,每次选中数据集中随机三张图片。并save至新文件夹

结果:(我循环了三次,生成三张,这边就用一张举例。

 

 

 代码写的有些奔放哈哈哈,这些小脚本自己用的,不要见怪。

猜你喜欢

转载自blog.csdn.net/m0_50317149/article/details/132325205