MoodSyncAI / fusion.py
TanRJ's picture
Update fusion.py
4e54dea verified
import pandas as pd
import plotly.express as px
def map_emotion_to_sentiment(emotion):
emotion = emotion.lower()
positive_emotions = ["happy", "surprise"]
negative_emotions = ["sad", "angry", "fear", "fearful", "disgust"]
if emotion in positive_emotions:
return "positive"
elif emotion in negative_emotions:
return "negative"
return "neutral"
def fusion_logic(
image_emotion,
image_score,
text_sentiment,
text_score,
audio_sentiment="not provided",
audio_score=0.0
):
image_sentiment = map_emotion_to_sentiment(image_emotion)
modality_sentiments = [image_sentiment, text_sentiment]
modality_scores = [image_score, text_score]
if audio_sentiment != "not provided":
modality_sentiments.append(audio_sentiment)
modality_scores.append(audio_score)
sentiment_counts = {}
for sentiment in modality_sentiments:
sentiment_counts[sentiment] = sentiment_counts.get(sentiment, 0) + 1
majority_sentiment = max(sentiment_counts, key=sentiment_counts.get)
unique_sentiments = set(modality_sentiments)
if len(unique_sentiments) == 1:
status = "ALIGNED"
badge = "🟢 Aligned"
elif len(unique_sentiments) == 2 and sentiment_counts[majority_sentiment] > 1:
status = "PARTIAL MISMATCH"
badge = "🟡 Partial Mismatch"
else:
status = "MISMATCH DETECTED"
badge = "🟠 Mismatch Detected"
confidence = round(sum(modality_scores) / len(modality_scores) * 100, 2)
return {
"image_sentiment": image_sentiment,
"majority_sentiment": majority_sentiment,
"status": status,
"badge": badge,
"confidence": confidence
}
def generate_summary(
image_emotion,
image_sentiment,
text_sentiment,
audio_sentiment,
fusion_status,
audio_used=False
):
if audio_used:
modality_description = (
f"The image suggests {image_sentiment} emotion through a facial expression "
f"classified as {image_emotion}. The typed text shows {text_sentiment} sentiment, "
f"while the audio transcript shows {audio_sentiment} sentiment."
)
else:
modality_description = (
f"The image suggests {image_sentiment} emotion through a facial expression "
f"classified as {image_emotion}. The typed text shows {text_sentiment} sentiment."
)
if fusion_status == "ALIGNED":
return (
modality_description
+ " All available modalities are emotionally aligned, suggesting consistent emotional expression."
)
if fusion_status == "PARTIAL MISMATCH":
return (
modality_description
+ " The system detected a partial mismatch. Some emotional signals agree, but at least one modality differs."
)
return (
modality_description
+ " The system detected a clear mismatch between the modalities."
)
def create_bar_chart(predictions, title):
df = pd.DataFrame(predictions)
df["score"] = df["score"] * 100
fig = px.bar(
df,
x="label",
y="score",
title=title,
text=df["score"].round(2)
)
fig.update_layout(
yaxis_title="Confidence (%)",
xaxis_title="Class"
)
return fig
def create_timeline_chart(timeline_data):
df = pd.DataFrame(timeline_data)
fig = px.line(
df,
x="frame",
y="confidence",
color="emotion",
markers=True,
title="Webcam Emotion Changes Over Time"
)
fig.update_layout(
xaxis_title="Captured Frame",
yaxis_title="Confidence (%)"
)
return fig