De schets is een python 3.7.6 schets. De pakketten zijn in anaconda binnen een virtuele omgeving geinstalleerd.
De schets maakt gebruik van keras versie 2.3.1, numpy versie 1.18.1 en tensorflow versie 2.1.0
Het MobileNet model is getrained met 1000 imagenet classes. Imagenet bevat meer dan 14 miljoen afbeeldingen verdeeld in 20.000 classes of categorieen
Stap 1, De benodigde pakketten importeren
import keras
from keras.preprocessing import image
from keras.models import Model
from keras.applications import imagenet_utils
from keras.applications import MobileNet
from keras.applications.mobilenet import preprocess_input
import numpy as np
Stap 2, mobilenet_1_0_224_tf.h5 model downloaden
"mobile" is het model object
https://github.com/fchollet/deep-learning-models
mobile = keras.applications.mobilenet.MobileNet()
Stap 3, De te testen afbeelding laden
De waarden van de pixels zijn getallen <-1,1>
img = image.load_img('plaatjes/hond.jpg', target_size=(224, 224))
#img = image.load_img('plaatjes/vogel.jpg', target_size=(224, 224))
#img = image.load_img('plaatjes/kat.jpg', target_size=(224, 224))
#img = image.load_img('plaatjes/bloem1.jpg', target_size=(224, 224))
img_array = image.img_to_array(img)
img_array.shape #(224, 224, 3)
Stap 5, De image array omzetten in een numpy array met 4 assen (batch size, W, H, color)
met axis=0 wordt er een as met lengte 1 aan het begin van de image array geplaatst
ipv color spreekt men ook van channels.
img_array_expanded_dims = np.expand_dims(img_array, axis=0)
img_array_expanded_dims.shape #(1, 244, 244, 3)
Stap 6, Met de preprocess_input stap wordt de batch geschikt gemaakt voor het mobilenet model
preprocessed_image = keras.applications.mobilenet.preprocess_input(img_array_expanded_dims)
preprocessed_image.shape #(1, 224,224, 3)
Stap 7, De preprocessed image array door het netwerk sturen
predictions = mobile.predict(preprocessed_image)
predictions.shape #(1, 1000)
Stap 8, De output is de predictions array deze naar een python list omzetten (decode).
Stap 9, De results list printen.
results = imagenet_utils.decode_predictions(predictions)
print(results)
[[('n02106662', 'German_shepherd', 0.9798971), ('n02105162', 'malinois', 0.019698815),
('n02091467', 'Norwegian_elkhound', 0.00032357377), ('n02105251', 'briard',
2.2722812e-05), ('n02105412', 'kelpie', 2.2068109e-05)]]
Te zien is dat de afbeelding met 98% zekerheid een German Shepherd is
Het classificatie resultaat van de vogel
[[('n01580077', 'jay', 0.855893), ('n01807496', 'partridge', 0.05049236),
('n01530575', 'brambling', 0.036979247), ('n01828970', 'bee_eater', 0.014948133),
('n01608432', 'kite', 0.0074693463)]]
Het classificatie resultaat van de kat
[[('n02091244', 'Ibizan_hound', 0.10332401), ('n02101556', 'clumber', 0.09446074),
('n02087046', 'toy_terrier', 0.093962625), ('n02094258', 'Norwich_terrier', 0.0813645),
('n02115913', 'dhole', 0.06622107)]]
Het classificatie resultaat van de bloem
[[('n02206856', 'bee', 0.5107316), ('n11939491', 'daisy', 0.31991774),
('n02190166', 'fly', 0.05764599), ('n02219486', 'ant', 0.018282568),
('n07718747', 'artichoke', 0.012232409)]]