s501 / app.py
RougeVertBleu's picture
rollback retour a la ligne
f1b1faa verified
import gradio as gr
import tensorflow as tf
import numpy as np
from PIL import Image, ImageOps
from tensorflow.keras.applications.efficientnet import preprocess_input
# Charger les modèles
model1 = tf.keras.models.load_model('model_v2_Q1.keras')
model2 = tf.keras.models.load_model('model_v2_Q2.keras')
model3_v2 = tf.keras.models.load_model('model_v2_Q3.keras')
#model3_v3 = tf.keras.models.load_model('model_v3_Q3.keras')
model3_v4 = tf.keras.models.load_model('model_v4_Q3.keras')
model4 = tf.keras.models.load_model('model_Q4.keras')
# Gère le formattage des images
def format_image_type1(image):
image = image.resize((64, 64)) # Redimensionner selon la taille attendue
image = np.array(image) / 255.0 # Normalisation
return image_single_fix(image)
def format_image_type2(image):
image = ImageOps.grayscale(image) # Charge en noir et blanc mais avec une meilleure résolution
image = image.resize((128, 128), Image.LANCZOS) # Redimensionner selon la taille attendue
image = np.array(image) / 255.0 # Normalisation
return image_single_fix(image)
def format_image_type3(image):
image = tf.image.resize(image, (128, 128)) # Redimensionner selon la taille attendue
image = preprocess_input(image) # Normalisation
return image_single_fix(image)
def image_single_fix(image_array):
return np.expand_dims(image_array, axis=0) # Ajouter batch dimension (demandé par tensorflow/keras qui demande à recevoir un groupe d'image plutôt que juste une seule)
# Configuration des infos des modèles
models = {
"Modèle 1 (genre uniquement) (⭐⭐)": {
"model": model1,
"type": "gender_only",
"image_format": format_image_type1
},
"Modèle 2 (âge uniquement) (⭐⭐)": {
"model": model2,
"type": "age_only",
"image_format": format_image_type1
},
"Modèle 3 (genre et âge) - V2 (⭐)": {
"model": model3_v2,
"type": "gender_age",
"image_format": format_image_type1
},
"Modèle 3 (genre et âge) - V4 (⭐⭐)": {
"model": model3_v4,
"type": "gender_age",
"image_format": format_image_type1
},
"Modèle 4 (genre et âge) [Transfert d'apprentissage] (⭐⭐⭐)": {
"model": model4,
"type": "age_gender",
"image_format": format_image_type3
}
}
# Fonction de prédiction
def predict(info_text, image, model_name):
model_data = models[model_name]
image_array = model_data["image_format"](image) # Formatter l'image de la façon qui correspond
model = model_data["model"]
model_type = model_data["type"]
prediction = model.predict(image_array)
return_text = ""
if model_type == "gender_only":
gender_value = prediction[0][0]
return_text = display_gender_prediction(gender_value)
elif model_type == "age_only":
age_value = prediction[0][0]
return_text = display_age_prediction(age_value)
elif model_type == "gender_age":
gender_value = prediction[0][0][0]
age_value = prediction[1][0][0]
return_text = display_gender_prediction(gender_value) + "\n" + display_age_prediction(age_value)
elif model_type == "age_gender": # gender_age but prediction data order is reversed
gender_value = prediction[1][0][0]
age_value = prediction[0][0][0]
return_text = display_gender_prediction(gender_value) + "\n" + display_age_prediction(age_value)
else:
raise Exception(f"Unsupported model_type '{model_type}'")
return f"{return_text}"
# Fonctions utiles
def get_gender_confidence(gender_value) -> str:
return f"{round(abs(gender_value - 0.5) * 2 * 100)}%"
def display_gender_prediction(gender_value) -> str:
gender = "Homme" if gender_value < 0.5 else "Femme" # Genre basé sur probabilité
rounded_gender_value_str = str(round(gender_value, 4))
return f"Genre: {gender} ({rounded_gender_value_str} - {get_gender_confidence(gender_value)} certitude)"
def display_age_prediction(age_value) -> str:
age = round(age_value) # Arroundi à l'entier le plus proche "half away zero"
rounded_age_value_str = str(round(age_value, 3))
return f"Age: {age} ({rounded_age_value_str})"
# Interface Gradio
iface = gr.Interface(
fn=predict,
inputs=[
gr.Markdown(value="Prédisez le sexe et l'âge de personnes à partir d'une image de leur tête !\n\nChoisissez simplement un modèle ⚙️ et chargez une photo 🖼️ !", label="Information"),
gr.Image(type="pil"),
gr.Dropdown(choices=list(models.keys()), label="Choisir un modèle")
],
outputs=gr.Textbox(label="Prédictions des modèles")
)
# Lancer l'interface
if __name__ == "__main__":
iface.launch()