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 tf
from tensorflow.keras.applications.vgg16 import VGG16
from tensorflow.keras.applications.vgg16 import decode_predictions
from tensorflow.keras.preprocessing.image import load_img
import matplotlib.pyplot as plt
import numpy as np
import cv2
# prebuild model with pre-trained weights on imagenet
model = 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, 3
im = np.expand_dims(im, axis=0)
# altro modo di procedere
image = 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 classi
decode_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)]]