import gradio as gr
import tensorflow as tf
from PIL import Image
import numpy as np
import cv2
# Loading saved model
model = tf.keras.models.load_model('gender_recognition.h5')
def predict(input_image):
try:
# Convert PIL Image to OpenCV format (numpy array)
input_image = cv2.cvtColor(np.array(input_image), cv2.COLOR_RGB2BGR)
# Resizing and preprocessing input image
input_image = cv2.resize(input_image, (178, 218))
input_image = np.array(input_image).astype(np.float32) / 255.0
input_image = np.expand_dims(input_image, axis=0) # Add a dimension for the batch size
# Making prediction
prediction = model.predict(input_image)
# Postprocess prediction
labels = ['Female', 'Male']
threshold = 0.5 # threshold for classifying as 'Male'
predicted_gender = 'Male' if prediction[0][1] > threshold else 'Female'
prediction_probability = prediction[0][1] if predicted_gender == 'Male' else prediction[0][0]
male_emoji = "\U0001F468" # Man emoji
female_emoji = "\U0001F469" # Woman emoji
selected_emoji = male_emoji if predicted_gender == 'Male' else female_emoji
# Combine the predicted gender and the probability into a single string
output = f"{selected_emoji} {predicted_gender}\n{prediction_probability * 100:.2f}% probability."
return output
except Exception as e:
return str(e)
# Creating Gradio interface
iface = gr.Interface(
fn=predict,
inputs=gr.inputs.Image(shape=(218, 178)),
outputs="text",
title = 'Image Recognition - Gender Detection with InceptionV3',
description="""
This model was trained to predict the gender of a person based on a photo.
The training of this model can be seen on this Kaggle notebook.
Upload a photo to see the how the model predicts the gender of the person on it!"""
)
iface.launch()