File size: 3,514 Bytes
64f524d
f321dde
969e589
fe7f349
cfdd761
f321dde
 
 
 
fe7f349
f321dde
fe7f349
f321dde
 
 
 
 
 
fe7f349
 
f321dde
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fe7f349
f321dde
 
 
 
 
 
fe7f349
f321dde
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fe7f349
f321dde
 
 
 
 
fe7f349
f321dde
 
 
 
 
 
 
fe7f349
 
 
 
 
f321dde
fe7f349
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import gradio as gr
import tensorflow as tf

import numpy as np

def load_labels(filename):
    with open(filename, "r") as file:
        return [line.strip() for line in file.readlines()]

# Function to load the trained model and predict emotion
def model_prediction(test_image):
    model = tf.keras.models.load_model("model/keras_model.h5")
    image = tf.keras.preprocessing.image.load_img(test_image, target_size=(48, 48), color_mode="grayscale")
    input_arr = tf.keras.preprocessing.image.img_to_array(image) / 255.0
    input_arr = np.expand_dims(input_arr, axis=0)
    predictions = model.predict(input_arr)
    return predictions

labels = load_labels("labels.txt")

def get_color(value):
    if value >= 75:
        return "label_red"
    elif value >= 50:
        return "label_yellow"
    else:
        return "label_green"

def create_colored_box(value):
    color_class = get_color(value)
    return gr.Label(value=f"{value:.2f}%", elem_id=color_class)

def predict_emotion(test_image):
    predictions = model_prediction(test_image)
    emotion_index = np.argmax(predictions)
    emotion_probability = predictions[0][emotion_index] * 100
    emotion_name = labels[emotion_index]

    # Predict level of danger based on emotion
    danger_level = 0
    if emotion_name == "sad":
        danger_level = min(100, emotion_probability * 1.2)
    elif emotion_name == "fearful":
        danger_level = min(100, emotion_probability * 1.5)
    elif emotion_name == "fake_expression":
        danger_level = 70  # Example fixed percentage for fake expression

    return (
        emotion_name, 
        create_colored_box(emotion_probability), 
        create_colored_box(danger_level)
    )

def home():
    return (
        "# Welcome to Emotion Analysis for Women Safety! 🌟\n\n"
        "Our mission is to analyze facial emotions and assess the level of potential danger based on detected expressions. "
        "This tool is designed to assist in identifying situations where immediate action might be needed to ensure safety.\n\n"
        "### Features\n"
        "- Detect facial emotions with high accuracy.\n"
        "- Predict potential danger levels based on emotion analysis.\n"
        "- User-friendly interface for seamless experience.\n\n"
        "### How to Use\n"
        "1. Upload an image showing the face.\n"
        "2. View detected emotions and danger percentage.\n"
        "3. Take necessary actions based on insights."
    )

with gr.Blocks(css=""" 
.label_green { background-color: green; color: white; }
.label_yellow { background-color: yellow; color: black; }
.label_red { background-color: red; color: white; }
""") as demo:
    gr.Markdown("# Emotion Analysis for Women Safety")
    gr.Image("logo.webp")
    with gr.Tabs():
        with gr.TabItem("Home"):
            gr.Markdown(home())
        with gr.TabItem("Emotion Analysis"):
            gr.Markdown("## Upload a facial image for emotion analysis:")
            test_image = gr.Image(type="filepath", label="Upload Image")

            with gr.Row():
                predict_btn = gr.Button("Analyze Emotion")
            emotion_label = gr.Label(label="Detected Emotion")
            probability_label = gr.Label(label="Emotion Probability")
            danger_label = gr.Label(label="Danger Level (%)")

            predict_btn.click(predict_emotion, inputs=test_image, outputs=[
                emotion_label, 
                probability_label, 
                danger_label
            ])

demo.launch()