mprateek's picture
Update app.py
e0510c6 verified
raw
history blame
No virus
2.44 kB
import streamlit as st
from PIL import Image
from transformers import pipeline
import pandas as pd
import matplotlib.pyplot as plt
# Set Streamlit configuration to disable PyplotGlobalUseWarning
st.set_option('deprecation.showPyplotGlobalUse', False)
# Initialize an image classification pipeline
pipe = pipeline("image-classification", model="trpakov/vit-face-expression")
# Title of the Streamlit app
st.title("Single Image Emotion Recognition")
# Upload a single image
uploaded_image = st.file_uploader("Upload an image", type=["jpg", "png"], accept_multiple_files=False)
# Process the image immediately after it's uploaded
if uploaded_image:
# Load the image
image = Image.open(uploaded_image)
# Display the uploaded image
st.image(image, caption="Uploaded Image", use_column_width=True)
# Predict emotion using the pipeline
result = pipe(image)
predicted_class = result[0]["label"]
predicted_emotion = predicted_class.split("_")[-1].capitalize()
emotion_score = result[0]["score"]
# Display predicted emotion and score
st.write(f"Predicted Emotion: {predicted_emotion}")
st.write(f"Emotion Score: {emotion_score:.4f}")
# Emotion statistics (for visualization)
emotion_counts = pd.Series([predicted_emotion])
# Define a color map for emotions
color_map = {
'Neutral': '#B38B6D',
'Happy': '#FFFF00',
'Sad': '#0000FF',
'Angry': '#FF0000',
'Disgust': '#008000',
'Surprise': '#FFA500',
'Fear': '#000000'
}
# Assign colors to the pie chart
pie_colors = [color_map.get(emotion, '#999999') for emotion in emotion_counts.index]
# Plot a small pie chart
fig_pie, ax_pie = plt.subplots(figsize=(4, 4))
ax_pie.pie(emotion_counts, labels=emotion_counts.index, autopct='%1.1f%%', startangle=140, colors=pie_colors)
ax_pie.axis('equal')
ax_pie.set_title("Emotion Distribution")
st.pyplot(fig_pie)
# Plot a small bar chart
fig_bar, ax_bar = plt.subplots(figsize=(4, 4))
emotion_counts.plot(kind='bar', color=pie_colors, ax=ax_bar)
ax_bar.set_xlabel('Emotion')
ax_bar.set_ylabel('Count')
ax_bar.set_title("Emotion Count")
ax_bar.yaxis.set_major_locator(plt.MaxNLocator(integer=True))
for i in ax_bar.patches:
ax_bar.text(i.get_x() + i.get_width() / 2, i.get_height() + 0.1, int(i.get_height()), ha='center', va='bottom')
st.pyplot(fig_bar)