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)]]