Search code examples
pythonkeraskeras-layer

Resizing an input image in a Keras Lambda layer


I would like my keras model to resize the input image using OpenCV or similar.

I have seen the use of ImageGenerator, but I would prefer to write my own generator and simply resize the image in the first layer with keras.layers.core.Lambda.

How would I do this?


Solution

  • If you are using tensorflow backend then you can use tf.image.resize_images() function to resize the images in Lambda layer.

    Here is a small example to demonstrate the same:

    import numpy as np
    import scipy.ndimage
    import matplotlib.pyplot as plt
    
    from keras.layers import Lambda, Input
    from keras.models import Model
    from keras.backend import tf as ktf
    
    
    # 3 channel images of arbitrary shape
    inp = Input(shape=(None, None, 3))
    try:
        out = Lambda(lambda image: ktf.image.resize_images(image, (128, 128)))(inp)
    except :
        # if you have older version of tensorflow
        out = Lambda(lambda image: ktf.image.resize_images(image, 128, 128))(inp)
    
    model = Model(input=inp, output=out)
    model.summary()
    
    X = scipy.ndimage.imread('test.jpg')
    
    out = model.predict(X[np.newaxis, ...])
    
    fig, Axes = plt.subplots(nrows=1, ncols=2)
    Axes[0].imshow(X)
    Axes[1].imshow(np.int8(out[0,...]))
    
    plt.show()