Spaces:
Sleeping
Sleeping
# -*- coding: utf-8 -*- | |
""" | |
Spyder Editor | |
Use pretrained model to recognize an image. | |
""" | |
import os | |
import numpy as np | |
import pandas as pd | |
import PIL | |
import tensorflow as tf | |
from tensorflow.keras.applications import EfficientNetV2S | |
from tensorflow.keras.applications import Xception | |
from tensorflow.keras.applications import MobileNetV3Small | |
""" | |
model = ResNet50(weights='imagenet') | |
img_path = 'elephant.jpg' | |
img = keras.utils.load_img(img_path, target_size=(224, 224)) | |
x = keras.utils.img_to_array(img) | |
x = np.expand_dims(x, axis=0) | |
x = preprocess_input(x) | |
preds = model.predict(x) | |
# decode the results into a list of tuples (class, description, probability) | |
# (one such list for each sample in the batch) | |
print('Predicted:', decode_predictions(preds, top=3)[0]) | |
""" | |
# Take a pretrained model, its preprocess input functions, prediction function, | |
# the image to be predicted. | |
# Return the decoded prediction. | |
def pretrained_model(image, model_name, preprocess_fn, | |
decoded_predictions_fn): | |
# preprocess with the model's function | |
x = preprocess_fn(image) | |
# predictions | |
pred = model_name.predict(x) | |
# decode the results into a list of tuples (class, description, probability) | |
decoded_pred = decoded_predictions_fn(pred, top=3) | |
# Must put in the [0] first element of the | |
# decoded predictions. | |
pred_df = pd.DataFrame( | |
decoded_pred[0], | |
columns=["class", "description", "probability"] | |
) | |
return pred_df | |
# Load the specific image size for the model | |
# path = filepath of the image | |
# size = size to be loaded | |
def load_and_resize_image(img_path, size=(224, 224, 3)): | |
img = tf.keras.utils.load_img( | |
path=img_path, target_size=size) | |
x = tf.keras.utils.img_to_array(img) | |
x = np.expand_dims(x, axis=0) | |
print(f"Shape of x: {x.shape}") | |
return x | |
def predict(img_path): | |
# Set the data directory | |
data_dir = "images" | |
image_list = ["cat.jpg", "mrt_train.jpg", | |
"apples.jpg", "duck.jpg", "daisy.jpg"] | |
# Xception: (299x299) | |
# EfficientNetV2S: (384, 384) | |
# MobileNetV2: (224, 224, 3) | |
# Load the image | |
# img_path = os.path.join(data_dir, image_list[4]) | |
print(f"image path: {img_path}") | |
# Efficient Net V2 Small | |
img = load_and_resize_image( | |
img_path, | |
size=(384, 384)) | |
eff_net = EfficientNetV2S(include_top=True, | |
weights='imagenet', | |
input_shape=(384, 384, 3)) | |
pred_df_eff = pretrained_model( | |
img, | |
eff_net, | |
tf.keras.applications.efficientnet_v2.preprocess_input, | |
tf.keras.applications.efficientnet_v2.decode_predictions, | |
) | |
print(pred_df_eff[["description", "probability"]]) | |
# Mobile Net V3 Small | |
img = load_and_resize_image(img_path, size=(224, 224)) | |
mobile_net = MobileNetV3Small(include_top=True, | |
weights="imagenet", | |
input_shape=(224, 224, 3)) | |
pred_df_mob = pretrained_model( | |
img, | |
eff_net, | |
tf.keras.applications.mobilenet_v3.preprocess_input, | |
tf.keras.applications.mobilenet_v3.decode_predictions, | |
) | |
print(pred_df_mob[["description", "probability"]]) | |
# Xception | |
img = load_and_resize_image(img_path, size=(299, 299)) | |
xcept = Xception(include_top=True, | |
weights="imagenet", | |
input_shape=(299, 299, 3)) | |
pred_df_xcept = pretrained_model( | |
img, | |
xcept, | |
tf.keras.applications.xception.preprocess_input, | |
tf.keras.applications.xception.decode_predictions, | |
) | |
print(pred_df_xcept[["description", "probability"]]) | |
# Format the output for gradio label | |
dict_eff = dict({ | |
"Description": pred_df_eff["description"], | |
"Probability": pred_df_eff["probability"] | |
}) | |
dict_mob = dict({ | |
"Description": pred_df_mob["description"], | |
"Probability": pred_df_mob["probability"] | |
}) | |
dict_xcept = dict({ | |
"Description": pred_df_xcept["description"], | |
"Probability": pred_df_xcept["probability"] | |
}) | |
return pred_df_eff[["description", "probability"]], \ | |
pred_df_mob[["description", "probability"]], \ | |
pred_df_xcept[["description", "probability"]] | |
# Main | |
if __name__ == "__main__": | |
predict() | |