simple secuencial redes principiantes para modelo installing imagenes convolucionales con clasificacion python machine-learning keras computer-vision

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



keras simple model (5)

Solo estoy empezando con keras y aprendizaje automático en general.

Entrené un modelo para clasificar imágenes de 2 clases y lo model.save() utilizando model.save() . Aquí está el código que utilicé:

from keras.preprocessing.image import ImageDataGenerator from keras.models import Sequential from keras.layers import Conv2D, MaxPooling2D from keras.layers import Activation, Dropout, Flatten, Dense from keras import backend as K # dimensions of our images. img_width, img_height = 320, 240 train_data_dir = ''data/train'' validation_data_dir = ''data/validation'' nb_train_samples = 200 #total nb_validation_samples = 10 # total epochs = 6 batch_size = 10 if K.image_data_format() == ''channels_first'': input_shape = (3, img_width, img_height) else: input_shape = (img_width, img_height, 3) model = Sequential() model.add(Conv2D(32, (3, 3), input_shape=input_shape)) model.add(Activation(''relu'')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(32, (3, 3))) model.add(Activation(''relu'')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Conv2D(64, (3, 3))) model.add(Activation(''relu'')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(64)) model.add(Activation(''relu'')) model.add(Dropout(0.5)) model.add(Dense(1)) model.add(Activation(''sigmoid'')) model.compile(loss=''binary_crossentropy'', optimizer=''rmsprop'', metrics=[''accuracy'']) # this is the augmentation configuration we will use for training train_datagen = ImageDataGenerator( rescale=1. / 255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) # this is the augmentation configuration we will use for testing: # only rescaling test_datagen = ImageDataGenerator(rescale=1. / 255) train_generator = train_datagen.flow_from_directory( train_data_dir, target_size=(img_width, img_height), batch_size=batch_size, class_mode=''binary'') validation_generator = test_datagen.flow_from_directory( validation_data_dir, target_size=(img_width, img_height), batch_size=batch_size, class_mode=''binary'') model.fit_generator( train_generator, steps_per_epoch=nb_train_samples // batch_size, epochs=epochs, validation_data=validation_generator, validation_steps=5) model.save(''model.h5'')

Se entrenó con éxito con una precisión de 0,98 que es bastante bueno. Para cargar y probar este modelo en nuevas imágenes, utilicé el siguiente código:

from keras.models import load_model import cv2 import numpy as np model = load_model(''model.h5'') model.compile(loss=''binary_crossentropy'', optimizer=''rmsprop'', metrics=[''accuracy'']) img = cv2.imread(''test.jpg'') img = cv2.resize(img,(320,240)) img = np.reshape(img,[1,320,240,3]) classes = model.predict_classes(img) print classes

Produce:

[[0]]

¿Por qué no daría el nombre real de la clase y por qué [[0]] ?

Gracias por adelantado.


Eso es porque estás obteniendo el valor numérico asociado con la clase. Por ejemplo, si tiene dos clases de gatos y perros, Keras los asociará con valores numéricos 0 y 1. Para obtener la asignación entre sus clases y su valor numérico asociado, puede usar

>>> classes = train_generator.class_indices >>> print(classes) {''cats'': 0, ''dogs'': 1}

Ahora ya sabes el mapeo entre tus clases e índices. Así que ahora lo que puedes hacer es

if classes[0][0] == 1: prediction = ''dog'' else: prediction = ''cat''


Puede 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 una matriz numpy con forma (1, height, width, channels) . Luego, lo cargamos en el modelo y predecimos su clase, devuelto como un valor real en el rango [0, 1] (clasificación binaria en este ejemplo).


Reenviando el ejemplo por @ritiek, yo también soy un principiante en ML, quizás este tipo de formato ayude a ver el nombre en lugar de solo el número de clase.

images = np.vstack([x, y]) prediction = model.predict(images) print(prediction) i = 1 for things in prediction: if(things == 0): print(''%d.It is cancer''%(i)) else: print(''%d.Not cancer''%(i)) i = i + 1


Si alguien todavía está luchando para hacer predicciones sobre 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 ) produce una matriz numpy 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á como [[0], [1], [1], [0]] )

Debe convertir su etiqueta real (por ejemplo, ''cancer'', ''not cancer'' ) en codificación binaria ( 0 para "cáncer", 1 para "no cáncer") para la clasificación binaria. Luego interpretará la salida de la secuencia de [[0]] como que tiene la etiqueta de clase ''cancer''