Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| from transformers import AutoTokenizer, AutoModelForSequenceClassification | |
| import torch | |
| from concurrent.futures import ThreadPoolExecutor | |
| # ------------------------------ | |
| # 1) Load Models | |
| # ------------------------------ | |
| # Mental Model | |
| mental_model_name = "ShubhamCoder01/stress-detection-model" | |
| mental_tokenizer = AutoTokenizer.from_pretrained(mental_model_name) | |
| mental_model = AutoModelForSequenceClassification.from_pretrained(mental_model_name) | |
| # Physical / Emotion Model | |
| physical_model_name = "ShubhamCoder01/General-Emotion-detect" | |
| physical_tokenizer = AutoTokenizer.from_pretrained(physical_model_name) | |
| physical_model = AutoModelForSequenceClassification.from_pretrained(physical_model_name) | |
| physical_id2label = {0: 'Joy', 1: 'Sadness', 2: 'Anger', 3: 'Love', 4: 'Surprise', 5: 'Fear'} | |
| # Polarity Model | |
| polarity_model_name = "ShubhamCoder01/college-context-polarity-detect" | |
| polarity_tokenizer = AutoTokenizer.from_pretrained(polarity_model_name) | |
| polarity_model = AutoModelForSequenceClassification.from_pretrained(polarity_model_name) | |
| polarity_id2label = {0: 'NEGATIVE', 1: 'POSITIVE', 2:"NORMAL"} | |
| # ------------------------------ | |
| # 2) Fuzzy Stress Score Maps | |
| # ------------------------------ | |
| mental_map = {"Anxiety": 0.85, "Bipolar": 0.80, "Depression": 0.92, | |
| "Normal": 0.0, "Personality disorder": 0.78, | |
| "Stress": 0.95, "Suicidal": 1.0} | |
| polarity_map = {"NEGATIVE": 0.75, "POSITIVE": 0.0, "NORMAL": 0.30} | |
| emotion_map = {"Joy": 0.0, "Sadness": 0.88, "Anger": 0.70, | |
| "Love": 0.10, "Surprise": 0.25, "Fear": 0.95} | |
| # Conditional probabilities (Mental -> Polarity / Emotion) | |
| cond_p = { | |
| "Anxiety": {"NEGATIVE": 0.8, "POSITIVE": 0.1, "NORMAL": 0.5}, | |
| "Bipolar": {"NEGATIVE": 0.7, "POSITIVE": 0.2, "NORMAL": 0.5}, | |
| "Depression": {"NEGATIVE": 0.9, "POSITIVE": 0.05, "NORMAL": 0.4}, | |
| "Normal": {"NEGATIVE": 0.2, "POSITIVE": 0.6, "NORMAL": 0.8}, | |
| "Personality disorder": {"NEGATIVE": 0.6, "POSITIVE": 0.2, "NORMAL": 0.5}, | |
| "Stress": {"NEGATIVE": 0.85, "POSITIVE": 0.05, "NORMAL": 0.3}, | |
| "Suicidal": {"NEGATIVE": 1.0, "POSITIVE": 0.0, "NORMAL": 0.2} | |
| } | |
| cond_e = { | |
| "Anxiety": {"Joy":0.1,"Sadness":0.85,"Anger":0.7,"Love":0.1,"Surprise":0.2,"Fear":0.9}, | |
| "Bipolar": {"Joy":0.2,"Sadness":0.75,"Anger":0.6,"Love":0.2,"Surprise":0.3,"Fear":0.8}, | |
| "Depression": {"Joy":0.0,"Sadness":0.95,"Anger":0.7,"Love":0.05,"Surprise":0.1,"Fear":0.95}, | |
| "Normal": {"Joy":0.8,"Sadness":0.1,"Anger":0.1,"Love":0.7,"Surprise":0.3,"Fear":0.2}, | |
| "Personality disorder": {"Joy":0.2,"Sadness":0.8,"Anger":0.6,"Love":0.2,"Surprise":0.3,"Fear":0.7}, | |
| "Stress": {"Joy":0.0,"Sadness":0.88,"Anger":0.7,"Love":0.1,"Surprise":0.25,"Fear":0.95}, | |
| "Suicidal": {"Joy":0.0,"Sadness":1.0,"Anger":0.8,"Love":0.0,"Surprise":0.1,"Fear":1.0} | |
| } | |
| # Model weights | |
| W_M, W_P, W_E = 0.75, 0.15, 0.10 | |
| # ------------------------------ | |
| # 3) Prediction Functions | |
| # ------------------------------ | |
| def predict_mental(text): | |
| inputs = mental_tokenizer(text, return_tensors="pt", truncation=True, padding=True) | |
| with torch.no_grad(): | |
| outputs = mental_model(**inputs) | |
| probs = torch.nn.functional.softmax(outputs.logits, dim=-1) | |
| idx = torch.argmax(probs).item() | |
| return mental_model.config.id2label[idx], probs[0][idx].item() | |
| def predict_physical(text): | |
| inputs = physical_tokenizer(text, return_tensors="pt", truncation=True, padding=True) | |
| with torch.no_grad(): | |
| outputs = physical_model(**inputs) | |
| probs = torch.nn.functional.softmax(outputs.logits, dim=-1) | |
| idx = torch.argmax(probs).item() | |
| return physical_id2label[idx], probs[0][idx].item() | |
| def predict_polarity(text): | |
| inputs = polarity_tokenizer(text, return_tensors="pt", truncation=True, padding=True) | |
| with torch.no_grad(): | |
| outputs = polarity_model(**inputs) | |
| probs = torch.nn.functional.softmax(outputs.logits, dim=-1) | |
| idx = torch.argmax(probs).item() | |
| return polarity_id2label[idx], probs[0][idx].item() | |
| # ------------------------------ | |
| # 4) Fuzzy Stress Score Calculation | |
| # ------------------------------ | |
| def calculate_stress_score(mental_label, mental_conf, | |
| polarity_label, polarity_conf, | |
| emotion_label, emotion_conf): | |
| adj_M = mental_conf * mental_map[mental_label] | |
| adj_P = polarity_conf * cond_p[mental_label][polarity_label] * polarity_map[polarity_label] | |
| adj_E = emotion_conf * cond_e[mental_label][emotion_label] * emotion_map[emotion_label] | |
| stress_score = W_M * adj_M + W_P * adj_P + W_E * adj_E | |
| return stress_score | |
| # ------------------------------ | |
| # 5) Combined Prediction | |
| # ------------------------------ | |
| def predict_all(text): | |
| # Parallel model inference | |
| with ThreadPoolExecutor() as executor: | |
| future_mental = executor.submit(predict_mental, text) | |
| future_physical = executor.submit(predict_physical, text) | |
| future_polarity = executor.submit(predict_polarity, text) | |
| mental_label, mental_conf = future_mental.result() | |
| physical_label, physical_conf = future_physical.result() | |
| polarity_label, polarity_conf = future_polarity.result() | |
| stress_score = calculate_stress_score( | |
| mental_label, mental_conf, | |
| polarity_label, polarity_conf, | |
| physical_label, physical_conf | |
| ) | |
| # Low confidence flag | |
| low_confidence = mental_conf < 0.25 or physical_conf < 0.5 or polarity_conf < 0.5 | |
| return { | |
| "Mental": mental_label, | |
| "Mental_conf": round(mental_conf,4), | |
| "Physical": physical_label, | |
| "Physical_conf": round(physical_conf,4), | |
| "Polarity": polarity_label, | |
| "Polarity_conf": round(polarity_conf,4), | |
| "Stress_Score": round(stress_score,4), | |
| "Low_Confidence_Flag": low_confidence | |
| } | |
| # ------------------------------ | |
| # 6) Gradio Interface | |
| # ------------------------------ | |
| iface = gr.Interface( | |
| fn=predict_all, | |
| inputs=gr.Textbox(lines=3, placeholder="Enter a sentence..."), | |
| outputs="json", | |
| title="Student Stress Detection (Fuzzy Probabilistic)", | |
| description="Predict Mental, Emotion, Polarity and Fuzzy Stress Score using parallel model inference." | |
| ) | |
| iface.launch(share=True) | |