In [83]:
import numpy as np
import keras
from keras.preprocessing import image
from keras.models import load_model
from keras.applications import imagenet_utils
#from keras.applications.mobilenet import preprocess_input, decode_predictions
import matplotlib.pyplot as plt
%matplotlib inline
In [84]:
model = load_model('bloem_model.h5')
#model.summary()
In [85]:
afb = '01.jpg' #de afbeeldingen staan in de root map
In [86]:
#de afbeelding laden in img
img = image.load_img(afb, target_size=(224,224))
# de afbeelding omzetten naar een image array
img_array = image.img_to_array(img)
# de image array omzetten naar een np array batch (1, 128, 128, 3)
batch = np.expand_dims(img_array, axis=0)
In [87]:
batch.shape
Out[87]:
(1, 224, 224, 3)
In [88]:
#preprocessed_image = preprocess_input(batch)
In [89]:
preprocessed_image = keras.applications.mobilenet.preprocess_input(batch)
In [90]:
preprocessed_image.shape
Out[90]:
(1, 224, 224, 3)
In [91]:
type(preprocessed_image)
Out[91]:
numpy.ndarray
In [92]:
predictions = model.predict(preprocessed_image)
In [93]:
print(predictions) #de waarden van de twee output noduli worden geprint
[[9.9996769e-01 3.2300934e-05]]
In [94]:
predictions.shape
Out[94]:
(1, 2)
In [95]:
#results = imagenet_utils.decode_predictions(predictions)
#results

Bovenstaande code werkt niet!! en geeft de foutmelding:
ValueError: decode_predictions expects a batch of predictions.
(i.e. a 2D array of shape (samples, 1000)). Found array with shape: (1, 2)
Dit betekend dat de functie decode_predictions alleen geschikt is voor een model met 1000 output neuronen.
Dit model heeft 2 output neuronen.
De volgende stappen zijn nu nodig:
1) Een dict met class labels en indices aanmaken.
2) De index van de class met argmax() met de maximale waarde zoeken.
3) het label van die class uitprinten.

In de constructor van het gedownloade model classes = 2 maken werkt niet.
stackoverflow: there no way to tell the decode_predictions that the number of classes has changed

Hier onder mijn oplossing

In [96]:
#dict met class labels maken en indices
class_label = {0:'passiebloem',1:'waterlelie'}
In [97]:
#met max de output van de output neuron met de maximale waarde opzoeken
pred_kans = predictions.max().item() #met item() is pred_kans een float
In [98]:
#geeft de index van de max waarde van de flatten tensor met 0 assen en is dus een integer
pred_name = predictions.argmax().item()
In [99]:
#met predname  de naam van de afbeelding in de class_label dict zoeken (naam is een string)
naam = class_label[pred_name]
In [100]:
#pred_kans omzetten naar een string
print('De geladen afbeelding: '+afb+' is met een zekerheid van: '+str(pred_kans*100)+' % een '+naam+'.')
De geladen afbeelding: 01.jpg is met een zekerheid van: 99.99676942825317 % een passiebloem.