Saltar al contenido

¿Cómo predecir la imagen de entrada usando un modelo entrenado en Keras?

Si encuentras algún detalle que no comprendes nos puedes dejar un comentario y te responderemos lo mas rápido que podamos.

Solución:

Si alguien todavía tiene dificultades para hacer predicciones sobre las imágenes, aquí está el código optimizado para cargar el modelo guardado y hacer predicciones:

# Modify 'test1.jpg' and 'test2.jpg' to the images you want to predict on

from keras.models import load_model
from keras.preprocessing import image
import numpy as np

# dimensions of our images
img_width, img_height = 320, 240

# load the model we saved
model = load_model('model.h5')
model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

# predicting images
img = image.load_img('test1.jpg', target_size=(img_width, img_height))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)

images = np.vstack([x])
classes = model.predict_classes(images, batch_size=10)
print classes

# predicting multiple images at once
img = image.load_img('test2.jpg', target_size=(img_width, img_height))
y = image.img_to_array(img)
y = np.expand_dims(y, axis=0)

# pass the list of multiple images np.vstack()
images = np.vstack([x, y])
classes = model.predict_classes(images, batch_size=10)

# print the classes, the images belong to
print classes
print classes[0]
print classes[0][0]

keras predict_classes (docs) salidas A numpy array de predicciones de clase. Que en su caso modelo, el índice de neurona de activación más alta de su última capa (softmax). [[0]] significa que su modelo predijo que sus datos de prueba son de clase 0. (por lo general, pasará varias imágenes y el resultado se verá así [[0], [1], [1], [0]] )

Debe convertir su etiqueta actual (p. ej. 'cancer', 'not cancer') en codificación binaria (0 por ‘cáncer’, 1 para ‘no cáncer’) para la clasificación binaria. Luego interpretará la salida de su secuencia de [[0]] como tener etiqueta de clase 'cancer'

Puedes usar model.predict() para predecir la clase de una sola imagen de la siguiente manera [doc]:

# load_model_sample.py
from keras.models import load_model
from keras.preprocessing import image
import matplotlib.pyplot as plt
import numpy as np
import os


def load_image(img_path, show=False):

    img = image.load_img(img_path, target_size=(150, 150))
    img_tensor = image.img_to_array(img)                    # (height, width, channels)
    img_tensor = np.expand_dims(img_tensor, axis=0)         # (1, height, width, channels), add a dimension because the model expects this shape: (batch_size, height, width, channels)
    img_tensor /= 255.                                      # imshow expects values in the range [0, 1]

    if show:
        plt.imshow(img_tensor[0])                           
        plt.axis('off')
        plt.show()

    return img_tensor


if __name__ == "__main__":

    # load model
    model = load_model("model_aug.h5")

    # image path
    img_path = '/media/data/dogscats/test1/3867.jpg'    # dog
    #img_path = '/media/data/dogscats/test1/19.jpg'      # cat

    # load a single image
    new_image = load_image(img_path)

    # check prediction
    pred = model.predict(new_image)

En este ejemplo, una imagen se carga como un numpy array con forma (1, height, width, channels). Luego, lo cargamos en el modelo y predecimos su clase, devuelta como un valor real en el rango [0, 1] (clasificación binaria en este ejemplo).

Recuerda que tienes la opción de agregar una reseña si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *