| 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 |
|
|
| |
| 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_v4 = tf.keras.models.load_model('model_v4_Q3.keras') |
| model4 = tf.keras.models.load_model('model_Q4.keras') |
|
|
|
|
| |
| def format_image_type1(image): |
| image = image.resize((64, 64)) |
| image = np.array(image) / 255.0 |
| return image_single_fix(image) |
|
|
| def format_image_type2(image): |
| image = ImageOps.grayscale(image) |
| image = image.resize((128, 128), Image.LANCZOS) |
| image = np.array(image) / 255.0 |
| return image_single_fix(image) |
|
|
| def format_image_type3(image): |
| image = tf.image.resize(image, (128, 128)) |
| image = preprocess_input(image) |
| return image_single_fix(image) |
|
|
| def image_single_fix(image_array): |
| return np.expand_dims(image_array, axis=0) |
|
|
|
|
| |
| 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 |
| } |
| } |
|
|
|
|
| |
| def predict(info_text, image, model_name): |
| model_data = models[model_name] |
| |
| image_array = model_data["image_format"](image) |
| |
| 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_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}" |
|
|
|
|
| |
| 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" |
| 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) |
| rounded_age_value_str = str(round(age_value, 3)) |
| return f"Age: {age} ({rounded_age_value_str})" |
|
|
|
|
| |
| 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") |
| ) |
|
|
|
|
| |
| if __name__ == "__main__": |
| iface.launch() |
|
|