face_score / app.py
Girishug's picture
Update app.py
4121d5f verified
Raw
History Blame Contribute Delete
5.42 kB
import gradio as gr
from fastai.vision.all import *
import dlib
import cv2
import numpy as np
import requests
# Google Analytics Event Tracking
def send_ga_event(category, action, label=None):
payload = {
'v': '1', # Version of the API
'tid': 'G-RZF99L2LWQ', # Replace with your Measurement ID
'cid': '555', # Client ID (anonymous)
't': 'event', # Event type
'ec': category, # Event category
'ea': action, # Event action
'el': label, # Event label (optional)
}
requests.post('https://www.google-analytics.com/collect', data=payload)
# Load Dlib's pre-trained facial landmark predictor
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
# Load the trained deep learning model
learn = load_learner('beauty_model_finetuned_export.pkl')
# Function to detect landmarks and calculate feature scores (eyes, nose, etc.)
def detect_landmarks(image):
# Convert to grayscale for Dlib
gray = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2GRAY)
faces = detector(gray)
if len(faces) == 0:
return None
face = faces[0]
landmarks = predictor(gray, face)
# Extract landmark points
landmarks_points = [(landmarks.part(i).x, landmarks.part(i).y) for i in range(68)]
# Calculate individual feature scores (eyes, nose)
eyes_score = calculate_eyes_score(landmarks_points)
nose_score = calculate_nose_score(landmarks_points)
return eyes_score, nose_score
# Function to calculate symmetry score for eyes
def calculate_eyes_score(landmarks):
left_eye = landmarks[36:42] # Left eye landmarks
right_eye = landmarks[42:48] # Right eye landmarks
left_eye_center = np.mean(left_eye, axis=0)
right_eye_center = np.mean(right_eye, axis=0)
# Calculate distance between left and right eyes (symmetry)
symmetry_score = np.linalg.norm(left_eye_center - right_eye_center)
# Normalize to a 1-5 scale
normalized_eyes_score = 5 - (symmetry_score / 10) # Adjust divisor based on observation
return max(1, min(5, normalized_eyes_score))
# Function to calculate score for the nose (can use ratio-based measurements)
def calculate_nose_score(landmarks):
# Example: distance between the nose tip and other facial features (e.g., nose bridge)
nose_tip = landmarks[30] # Nose tip
nose_bridge = np.mean([landmarks[27], landmarks[28], landmarks[29]], axis=0) # Nose bridge
# Calculate symmetry or proportion
nose_score = np.linalg.norm(nose_tip - nose_bridge)
# Normalize to a 1-5 scale
normalized_nose_score = 5 - (nose_score / 10) # Adjust divisor based on observation
return max(1, min(5, normalized_nose_score))
# Function to predict combined beauty score (eyes, nose, deep learning score, and total)
def predict(image):
# Resize the image to a consistent size (e.g., 224x224)
image = image.resize((224, 224))
# Send event to Google Analytics when an image is processed
send_ga_event('ImageUpload', 'User uploaded image for beauty score')
# Deep learning model prediction
img = PILImage.create(image)
deep_learning_score = learn.predict(img)[1].item()
# Symmetry score from landmarks (eyes and nose)
symmetry_scores = detect_landmarks(image)
if symmetry_scores is None:
send_ga_event('Error', 'Facial landmarks not detected') # Track errors
return "Error: Could not detect facial landmarks."
eyes_score, nose_score = symmetry_scores
# Calculate facial feature score as an average of eyes and nose
facial_feature_score = (eyes_score + nose_score) / 2
# Calculate total average score (Simple Average)
total_score = (deep_learning_score + facial_feature_score) / 2
# Send event after successful prediction
send_ga_event('Prediction', 'Prediction completed successfully')
# Return detailed scores for each feature and total score
return (f"Deep Learning Score: {deep_learning_score:.2f} / 5\n"
f"Facial Feature Score: {facial_feature_score:.2f} / 5 (Eyes Score: {eyes_score:.2f} / 5, Nose Score: {nose_score:.2f} / 5)\n"
f"Total Combined Score: {total_score:.2f} / 5")
# Gradio interface with disclaimer and description
iface = gr.Interface(
fn=predict,
inputs=gr.Image(type="pil"), # Upload an image in JPG or PNG format
outputs=gr.Text(),
title="Face Beauty Rating with Symmetry and Feature Scores",
description="Upload an image to get a combined beauty score based on deep learning and facial feature scores (eyes, nose). "
"This model was trained on the SCUT-FBP5500 dataset and uses Dlib for landmark detection.\n\n"
"Disclaimer: This model is for educational purposes only and should not be taken as a definitive judgment of physical appearance.\n\n"
"**Note:** Please upload a clear, front-facing photo where the face is fully visible and not obstructed. Ensure good lighting and that the face is not too angled or cropped. The model requires the face to be properly aligned to detect landmarks such as the eyes and nose accurately. Failure to do so may result in errors or inaccurate scores.",
allow_flagging="never",
live=False # Add a Submit button
)
# Launch the app
iface.launch(share=True)