Introduzione
In questo secondo articolo dedicato all'utilizzo di reti pre-trained in ambito Image Classification, esamino il codice per utilizzare VGG16.
Il codice
import tensorflow as tffrom tensorflow.keras.applications.vgg16 import VGG16from tensorflow.keras.applications.vgg16 import decode_predictionsfrom tensorflow.keras.preprocessing.image import load_imgimport matplotlib.pyplot as pltimport numpy as npimport cv2
# prebuild model with pre-trained weights on imagenetmodel = VGG16(weights='imagenet', include_top=True)
model.compile(optimizer='sgd', loss='categorical_crossentropy')
# resize into VGG16 trained images' format
IMAGE_PATH = '/home/opc/cat1.jpg'
image = load_img(IMAGE_PATH, target_size=(224, 224))
plt.imshow(image)
im = cv2.resize(cv2.imread(IMAGE_PATH), (224, 224))# il metodo predict si attende un tensore N, 224, 224, 3# quindi per una sola immagine deve essere 1, 224, 224, 3im = np.expand_dims(im, axis=0)
# altro modo di procedereimage = np.array(image)image = np.expand_dims(image, axis=0)image.shape
# predict
out = model.predict(image)index = np.argmax(out)# print(index)
# vediamo le probabilità per le varie classidecode_predictions(out)
plt.plot(out.ravel())plt.show()
I risultato per un'immagine di un gatto è:
[[('n02123045', 'tabby', 0.8142928),
('n02123159', 'tiger_cat', 0.14372984),
('n02124075', 'Egyptian_cat', 0.032006603),
('n02127052', 'lynx', 0.0075874226),
('n04589890', 'window_screen', 0.0008968747)]]