web-dev-qa-db-fra.com

Redimensionner une image d'entrée dans une couche Keras Lambda

J'aimerais que mon modèle keras redimensionne l'image d'entrée à l'aide de cv2 ou similaire.

J'ai vu l'utilisation de ImageGenerator, mais je préférerais écrire mon propre générateur et simplement redimensionner l'image dans la première couche avec keras.layers.core.Lambda.

Comment pourrais-je faire ça?

17
Sam Hammamy

Si vous utilisez le backend tensorflow, vous pouvez utiliser la fonction tf.image.resize_images() pour redimensionner les images dans le calque Lambda.

Voici un petit exemple pour démontrer la même chose:

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()
21
indraforyou