首页 文章

数据增强图像数据生成器Keras语义分割

提问于
浏览
15

我使用Keras在一些图像数据上拟合完整的卷积网络以进行语义分割 . 但是,我有一些问题过度拟合 . 我没有那么多数据,我想做数据增加 . 但是,由于我想进行像素分类,我需要任何增强功能,如翻转,旋转和移位,以应用于特征图像和标签图像 . 理想情况下,我想使用Keras ImageDataGenerator进行即时转换 . 但是,据我所知,您无法对要素和标签数据进行等效转换 .

有谁知道是否是这种情况,如果没有,有没有人有任何想法?否则,我将使用其他工具创建更大的数据集,并立即将其全部输入 .

谢谢!

2 回答

  • 11

    有关扩展ImageDataGenerator的工作对于这些类型的情况更加灵活(参见this issue on Github中的示例) .

    此外,正如Mikael Rousson在评论中所提到的,您可以自己轻松创建自己的ImageDataGenerator版本,同时利用其许多内置函数使其更容易 . 下面是我用于图像去噪问题的示例代码,其中我使用随机作物加性噪声来动态生成干净且嘈杂的图像对 . 您可以轻松修改此选项以添加其他类型的扩充 . 之后,您可以使用Model.fit_generator来训练使用这些方法 .

    from keras.preprocessing.image import load_img, img_to_array, list_pictures
    
    def random_crop(image, crop_size):
        height, width = image.shape[1:]
        dy, dx = crop_size
        if width < dx or height < dy:
            return None
        x = np.random.randint(0, width - dx + 1)
        y = np.random.randint(0, height - dy + 1)
        return image[:, y:(y+dy), x:(x+dx)]
    
    def image_generator(list_of_files, crop_size, to_grayscale=True, scale=1, shift=0):
        while True:
            filename = np.random.choice(list_of_files)
            try:
                img = img_to_array(load_img(filename, to_grayscale))
            except:
                return
            cropped_img = random_crop(img, crop_size)
            if cropped_img is None:
                continue
            yield scale * cropped_img - shift
    def corrupted_training_pair(images, sigma):
        for img in images:
            target = img
            if sigma > 0:
                source = img + np.random.normal(0, sigma, img.shape)/255.0
            else:
                source = img
            yield (source, target)
    def group_by_batch(dataset, batch_size):
        while True:
            try:
                sources, targets = zip(*[next(dataset) for i in xrange(batch_size)])
                batch = (np.stack(sources), np.stack(targets))
                yield batch
            except:
                return
    def load_dataset(directory, crop_size, sigma, batch_size):
        files = list_pictures(directory)
        generator = image_generator(files, crop_size, scale=1/255.0, shift=0.5)
        generator = corrupted_training_pair(generator, sigma)
        generator = group_by_batch(generator, batch_size)
        return generator
    

    然后您可以使用以上内容:

    train_set = load_dataset('images/train', (patch_height, patch_width), noise_sigma, batch_size)
    val_set = load_dataset('images/val', (patch_height, patch_width), noise_sigma, batch_size)
    model.fit_generator(train_set, samples_per_epoch=batch_size * 1000, nb_epoch=nb_epoch, validation_data=val_set, nb_val_samples=1000)
    
  • 11

    是的你可以 . 这里是's an example from Keras'的文档 . 你将两个用相同种子播种的发生器和fit_generator压缩在一起 . https://keras.io/preprocessing/image/

    # we create two instances with the same arguments 
    data_gen_args = dict(featurewise_center=True,
                         featurewise_std_normalization=True,
                         rotation_range=90.,
                         width_shift_range=0.1,
                         height_shift_range=0.1,
                         zoom_range=0.2) 
    image_datagen = ImageDataGenerator(**data_gen_args) 
    mask_datagen = ImageDataGenerator(**data_gen_args)
    
    # Provide the same seed and keyword arguments to the fit and flow methods seed = 1 
    image_datagen.fit(images, augment=True, seed=seed) 
    mask_datagen.fit(masks, augment=True, seed=seed)
    
    image_generator = image_datagen.flow_from_directory(
        'data/images',
        class_mode=None,
        seed=seed)
    
    mask_generator = mask_datagen.flow_from_directory(
        'data/masks',
        class_mode=None,
        seed=seed)
    
    # combine generators into one which yields image and masks 
    train_generator = zip(image_generator, mask_generator)
    
    model.fit_generator(
        train_generator,
        samples_per_epoch=2000,
        nb_epoch=50)
    

相关问题