import streamlit as st # from transformers import pipeline from deepface import DeepFace import numpy as np # import custom helper functions from backend import check_image_rotation # pipeline = pipeline(task="image-classification", model="julien-c/hotdog-not-hotdog") st.title("Your Emotions? Or Nah?") # st.title("Hot Dog? Or Not?") file_name = st.file_uploader("Upload a photo of your face") # file_name = st.file_uploader("Upload a hot dog candidate image") if file_name is not None: # make two columns col1, col2 = st.columns(2) # capture image with intended rotation image = check_image_rotation(file_name) # display image in left column col1.image(image, use_column_width=True) # capture image data for face analysis image_data = np.array(image) # define a list of backends in case face cannot be detected backends = ['opencv', 'mtcnn', 'retinaface', 'mediapipe', 'ssd'] # attempt tracker attempt = 0 # retry loop while True: try: # capture predictions from deepface emotion model predictions = DeepFace.analyze(image_data, actions=['emotion'], detector_backend=backends[attempt]) # ensure only the main prediction object is processed, if len(predictions) > 1: # when more than one face is detected by the backend, faces = [(face, face['region']['w'] * face['region']['h']) for face in predictions] # by using the predictions connected to the largest bounding box new_predictions = sorted(faces, key=lambda x: x[1], reverse=True)[0][0] emotion_dict = new_predictions['emotion'] else: emotion_dict = predictions['emotion'] # capture desired prediction data emotions = list(emotion_dict.keys()) probabilities = list(emotion_dict.values()) # display in the right column... col2.header("Emotion Probabilities") # ...each emotion category and its probability for i in range(len(emotions)): col2.subheader(f"{emotions[i]}: {probabilities[i]:.2f}%") break except Exception as e: # if the analysis fails to detect a face, try a different backend attempt += 1 if attempt < len(backends): print(f"Retrying with backend `{backends[attempt]}` due to error: {str(e)}") else: print(f"Failed to analyze image after attempting all detector backends available. Please upload a new image.")