File size: 2,192 Bytes
46274ff
c096457
bb9fde7
c096457
bb9fde7
46274ff
c096457
 
 
 
 
 
 
 
bb9fde7
 
c096457
1effd41
 
 
 
 
e36cb90
1effd41
 
c096457
 
1effd41
 
 
c096457
1effd41
 
 
 
 
 
 
bb9fde7
 
1effd41
bb9fde7
 
 
 
 
 
1effd41
bb9fde7
 
aa1d293
1effd41
bb9fde7
1effd41
 
bb9fde7
aa1d293
1effd41
 
 
 
 
 
 
 
 
bb9fde7
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
import streamlit as st
import cv2
import numpy as np
from PIL import Image
from fer import FER  

# Set the page config
st.set_page_config(page_title="Emotion Recognition App", layout="centered")

st.title("Emotion Recognition App")

# Upload an image
uploaded_file = st.file_uploader("Upload an image", type=["jpg", "jpeg", "png"])

# Load FER emotion detection model
emotion_detector = FER(mtcnn=True)  # Use MTCNN for better face detection

# Resize image to reduce memory usage
def resize_image(image, max_size=(800, 800)):
    """
    Resizes the image to the specified maximum size while maintaining aspect ratio.
    """
    image.thumbnail(max_size, Image.Resampling.LANCZOS)
    return image

# Process the uploaded image
if uploaded_file is not None:
    # Check file size to prevent loading large images
    if uploaded_file.size > 10 * 1024 * 1024:  # 10 MB limit
        st.error("File too large. Please upload an image smaller than 10 MB.")
    else:
        # Open and resize the image
        image = Image.open(uploaded_file)
        image = resize_image(image)

        # Convert image to numpy array
        image_np = np.array(image)

        # Detect emotions
        results = emotion_detector.detect_emotions(image_np)

        if results:
            for face in results:
                # Get bounding box and detected emotion
                box = face["box"]
                emotions = face["emotions"]
                dominant_emotion = max(emotions, key=emotions.get)

                # Draw a rectangle around the face
                x, y, w, h = box
                cv2.rectangle(image_np, (x, y), (x+w, y+h), (0, 255, 0), 2)

                # Display detected emotion
                cv2.putText(
                    image_np,
                    dominant_emotion,
                    (x, y - 10),
                    cv2.FONT_HERSHEY_SIMPLEX,
                    0.9,
                    (255, 0, 0),
                    2,
                )

            # Display the processed image
            st.image(image_np, caption="Processed Image", use_column_width=True)
        else:
            st.warning("No faces detected or unable to determine emotions.")