Keras 实时增强添加噪声和对比度

Chr*_*rry 7 image machine-learning image-processing deep-learning keras

Keras 提供了一个ImageDataGenerator类用于实时增强,但它不包括对比度调整和噪声添加。

我们如何在训练期间应用随机噪声水平和随机对比度调整?可以将这些函数添加到 datagen 中的“preprocessing_function”参数中吗?

谢谢你。

And*_*kha 9

您确实可以使用 preprocessing_function 添加噪音。

示例脚本:

import random
import numpy as np

def add_noise(img):
    '''Add random noise to an image'''
    VARIABILITY = 50
    deviation = VARIABILITY*random.random()
    noise = np.random.normal(0, deviation, img.shape)
    img += noise
    np.clip(img, 0., 255.)
    return img

# Prepare data-augmenting data generator
from keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(
        rescale=1./255,
        rotation_range=40,
        width_shift_range=0.2,
        height_shift_range=0.2,
        zoom_range=0.2,
        preprocessing_function=add_noise,
    )

# Load a single image as our example
from keras.preprocessing import image
img_path = 'cat_by_irene_mei_flickr.png'
img = image.load_img(img_path, target_size=(299,299))

# Generate distorted images
images = [img]
img_arr = image.img_to_array(img)
img_arr = img_arr.reshape((1,) + img_arr.shape)
for batch in datagen.flow(img_arr, batch_size=1):
    images.append( image.array_to_img(batch[0]) )
    if len(images) >= 4:
        break

# Display
import matplotlib.pyplot as plt
f, xyarr = plt.subplots(2,2)
xyarr[0,0].imshow(images[0])
xyarr[0,1].imshow(images[1])
xyarr[1,0].imshow(images[2])
xyarr[1,1].imshow(images[3])
plt.show()
Run Code Online (Sandbox Code Playgroud)

脚本生成的示例图像:

具有不同修改和噪声级别的猫的四张图像

  • 很好的答案。请注意,所实现的噪声只会使图像的部分变亮,而不会变暗。另一个注意事项是您的 ImageDataGenerator 将生成像素值为 [0 1] 的图像。我认为许多基于 CNN 的技术都期望零均值数据 - 因此,如果您的数据均值是 0.5(与许多大型图像集合一样,在您列出的转换下),您需要将其移动 -.5。我似乎确实记得,如果您使用迁移学习技术(例如从预训练的初始网络开始等),有些人会期望零均值数据。 (2认同)
  • 还要注意一点:如果您使用 ImageDataGenerator 进行训练/验证分割(validation_split=%),我认为它*可能*也将该 preprocessing_function 应用于验证集。这也许是您不希望发生的事情。 (2认同)

Chr*_*rry 2

来自 Keras 文档:

preprocessing_function:每个输入隐含的函数。该函数将在对其进行任何其他修改之前运行。该函数应采用一个参数:一张图像(等级为 3 的 Numpy 张量),并且应输出具有相同形状的 Numpy 张量。

因此,我创建了一个简单的函数,然后使用imgaug 模块中的图像增强函数。请注意,imgaug 要求图像等级为 4。