目前数据增强的库有很多,但是针对不同的目的,数据增强的方式各不相同,这次写了一个语义分割数据增强的方法。
通常情况下,数据增强的方式有裁剪,缩放,翻转,增加噪声,修改对比度等等。这次的方法是用于随机裁剪缩放拼接的。
数据准备
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至新文件夹
结果:(我循环了三次,生成三张,这边就用一张举例。
代码写的有些奔放哈哈哈,这些小脚本自己用的,不要见怪。