图像语义分割数据增强

使用ImageDataGenerator

看了一大堆的数据增强,也是用的这个函数,都是对图像分类的,但是没有针对语义分割的数据增强,所以写一下
语义分割:是像素级的分类,所以他的标签也是图片的形式

思路:

  1. 先生成一个生成器
  2. 在使用ImageDataGenerator这个函数进行增强设置
  3. 最后用另一个生成器封装

上代码,基于图像分类不说了,网上一搜一大把

调用包

from tensorflow.keras.preprocessing.image import ImageDataGenerator
def Generate(path="train", batch_size=10):
    
    files_train = files[path] 
    while True:
        imgs=[]
        segs=[]
        
        for i in range(batch_size):
#             np.random.seed(17)
            file = random.sample(files_train,1)[0]
            #加载数据
            img, seg = LoadImage(file)
            #处理标签
            seg = ColorsToClass(seg)
            imgs.append(img)
            segs.append(seg)
        yield np.array(imgs),np.array(segs)

增强声明(增强的参数自己选择)

dg_args = dict(featurewise_center = False, 
                  samplewise_center = False,
                  rotation_range = 30, 
                  width_shift_range = 0.1, 
                  height_shift_range = 0.1, 
                  shear_range = 0.01,
                  zoom_range = [0.9, 1.25],  
                  horizontal_flip = True, 
                  vertical_flip = True,
                  fill_mode = 'reflect',
                   data_format = 'channels_last')
# brightness can be problematic since it seems to change the labels differently from the images 
AUGMENT_BRIGHTNESS=True
if AUGMENT_BRIGHTNESS:
    dg_args['brightness_range'] = [0.5, 1.5]
image_gen = ImageDataGenerator(**dg_args)

if AUGMENT_BRIGHTNESS:
    dg_args.pop('brightness_range')
label_gen = ImageDataGenerator(**dg_args)

第二个生成器

def create_aug_gen(in_gen, seed = None):
    np.random.seed(seed if seed is not None else np.random.choice(range(100)))
    for in_x, in_y in in_gen:
        seed = np.random.choice(range(100))
        # keep the seeds syncronized otherwise the augmentation to the images is different from the masks
        image_datagen.fit(in_x, augment=True, seed=seed)
        mask_datagen.fit(in_y, augment=True, seed=seed)
        g_x = image_gen.flow(255*in_x, 
                             batch_size = 4, ##自己调节
                             seed = seed, 
                             shuffle=True)
        g_y = label_gen.flow(in_y, 
                             batch_size = 4, 
                             seed = seed, 
                             shuffle=True)

        yield next(g_x)/255.0, next(g_y)

上效果

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值