orxva/svm
0
1from flask import Flask, render_template, request2import joblib3import numpy as np4import os5 6app = Flask(__name__)7 8# Memastikan path absolut untuk loading model Hugging Face9base_dir = os.path.dirname(os.path.abspath(__file__))10models_dir = os.path.join(base_dir, 'models')11 12load_error_str = ""13try:14 svm_depresi = joblib.load(os.path.join(models_dir, 'svm_model_depresi.pkl'))15 svm_kecemasan = joblib.load(os.path.join(models_dir, 'svm_model_kecemasan.pkl'))16 svm_stres = joblib.load(os.path.join(models_dir, 'svm_model_stres.pkl'))17 scaler = joblib.load(os.path.join(models_dir, 'svm_scaler.pkl'))18 models_loaded = True19except Exception as e:20 import traceback21 load_error_str = traceback.format_exc()22 print(f"Error loading models:\n{load_error_str}")23 models_loaded = False24 25# Roasting Dictionary Mapping (Gen-Z Style based on Severity 0-4)26ROAST_DEPRESI = {27 0: "Hidup kamu terlihat cukup tenang. Bersyukur ya, sepertinya tidak ada beban yang terlalu berat saat ini.",28 1: "Sepertinya kamu lagi agak overthinking sedikit. Kurang-kurangi melamun yang tidak perlu, ya.",29 2: "Wah, sepertinya kamu lagi sering dengar playlist galau nih. Jangan lupa luangkan waktu untuk istirahat sejenak.",30 3: "Halo, kalau kamu merasa pikiran sedang berat, jangan dipendam sendiri. Yuk, coba cerita ke orang terdekat!",31 4: "Perhatian sebentar! Pikiran kamu sepertinya butuh pertolongan. Jangan ragu buat ngobrol sama psikolog, kamu nggak sendirian kok."32}33 34ROAST_KECEMASAN = {35 0: "Santai banget nih. Sepertinya kamu bisa menghadapi hari-hari dengan sangat tenang.",36 1: "Ada sedikit rasa gugup saat menghadapi momen penting. Tenang saja, itu hal yang sangat wajar kok.",37 2: "Sepertinya kamu mulai sering merasa khawatir soal masa depan. Coba tarik napas dalam-dalam dan fokus pada hari ini ya.",38 3: "Kamu sepertinya terlalu sering memikirkan hal-hal yang belum terjadi. Coba tenangkan diri, jangan buat dirimu capek karena pikiran sendiri.",39 4: "Kondisi kamu sepertinya sedang sangat waspada terus-menerus. Coba istirahat, jauhkan gadget sebentar, dan cari ketenangan yang kamu butuhkan."40}41 42ROAST_STRES = {43 0: "Bebas stres! Kamu sepertinya pintar mengelola tekanan dan tidak terlalu memusingkan omongan orang.",44 1: "Beban tugas atau kerjaan sepertinya mulai mengganggu waktu tidur kamu. Kurangi konsumsi kafein malam-malam ya.",45 2: "Kamu sepertinya sudah mulai sering lelah. Mungkin ini saatnya ambil waktu luang untuk liburan singkat.",46 3: "Tingkat stres kamu agak tinggi nih, sedikit masalah saja sepertinya bisa memancing emosimu. Yuk, tenangkan pikiran dulu.",47 4: "Pikiran kamu sepertinya sudah sangat kelelahan. Kamu butuh waktu luang sejenak untuk memulihkan energi dari hiruk pikuk rutinitas."48}49 50def generate_pixel_character(dep_score, anx_score, str_score):51 avg_score = (dep_score + anx_score + str_score) / 352 53 # Karakter Minuman dengan Tema Warna Spesifik54 if avg_score < 1:55 return {56 "name": "Air Mineral", 57 "tags": ["#StayHydrated", "#ZenMode"],58 "quote": '"Jernih, tenang, dan selalu menyegarkan."',59 "bg_color": "#D3E9F8", # Diubah agar match background gambar AI60 "theme_color": "#5B96B7",61 "img": "air_mineral.jpeg"62 }63 elif avg_score < 2:64 return {65 "name": "Matcha Latte", 66 "tags": ["#Overthinker", "#Aesthetic"],67 "quote": '"Kelihatan tenang di luar, tapi lumayan rumit di dalam."',68 "bg_color": "#BAD3BA", # Diubah agar match background gambar AI69 "theme_color": "#769A63",70 "img": "matcha_latte.jpeg"71 }72 elif avg_score < 3:73 return {74 "name": "Kopi Hitam", 75 "tags": ["#NeedCoffee", "#DeadlineHustle"],76 "quote": '"Pahitnya pas, sekeras realita hari ini."',77 "bg_color": "#E9D2C0", # Diubah agar match background gambar AI78 "theme_color": "#B57A59",79 "img": "kopi_hitam.jpeg"80 }81 else:82 return {83 "name": "Energy Drink", 84 "tags": ["#LowBattery", "#SurvivalMode"],85 "quote": '"Lagi push limit banget nih, awas meledak!"',86 "bg_color": "#E1CAEE", # Diubah agar match background gambar AI87 "theme_color": "#8B70A6",88 "img": "energy_drink.jpeg"89 }90 91def calculate_digital_activity(X_input):92 score = 093 # 1. Durasi Smartphone94 if X_input[2] > 7: score += 295 elif X_input[2] >= 4: score += 196 97 # 2. Durasi Medsos98 if X_input[3] > 6: score += 299 elif X_input[3] >= 3: score += 1100 101 # 3. Durasi Game102 if X_input[4] > 4: score += 2103 elif X_input[4] >= 2: score += 1104 105 # 4. Durasi Streaming106 if X_input[5] > 4: score += 2107 elif X_input[5] >= 2: score += 1108 109 # 5. Gadget sblm tidur110 if X_input[6] == 1: score += 1111 112 # 6. Terganggu Notif113 score += X_input[7]114 115 # 7. Cemas Tanpa Internet116 if X_input[8] == 1: score += 1117 118 # 8. Menunda Tugas119 if X_input[9] == 1: score += 1120 121 # 9. Waktu Tidur (Kurang tidur)122 if X_input[10] <= 4: score += 2123 elif X_input[10] <= 6: score += 1124 125 # 10. Doom Scrolling126 score += X_input[12]127 128 # 11. Cek HP129 if X_input[11] > 6: score += 2130 elif X_input[11] >= 3: score += 1131 132 # Platform Medsos adalah pertanyaan aktivitas digital ke-12 (Teks), tidak masuk ke skor kuantitatif133 134 if score <= 7: return "Sehat"135 elif score <= 13: return "Sedang"136 else: return "Tinggi"137 138@app.route('/')139def home():140 return render_template('landing.html')141 142@app.route('/form')143def form():144 return render_template('index.html')145 146@app.route('/predict', methods=['POST'])147def predict():148 if not models_loaded:149 return f"Models not loaded on server. Please check backend. Load Error:<br><pre>{load_error_str}</pre>", 500150 151 try:152 # Extract features from form153 frm = request.form154 155 # A. Fitur Aktivitas Digital (13 fitur)156 X_input = [157 float(frm.get('Usia', 20)),158 int(frm.get('Jenis_Kelamin', 0)), # 0 Laki, 1 Perempuan159 float(frm.get('Durasi_Smartphone', 5)),160 float(frm.get('Durasi_Medsos', 3)),161 float(frm.get('Durasi_Game', 0)),162 float(frm.get('Durasi_Streaming', 1)),163 int(frm.get('Gadget_Sblm_Tidur', 0)),164 int(frm.get('Terganggu_Notif', 1)),165 int(frm.get('Cemas_Tanpa_Internet', 0)),166 int(frm.get('Menunda_Tugas', 0)),167 float(frm.get('Waktu_Tidur', 7.0)),168 int(frm.get('Cek_HP_Tanpa_Notif', 2)),169 int(frm.get('Doom_Scrolling', 2))170 ]171 172 # B. Fitur DASS-21 (21 fitur dari kuesioner psikologis)173 dass_input = [int(frm.get(f'DASS_{i}', 0)) for i in range(1, 22)]174 175 # Gabungkan semua input176 all_input = X_input + dass_input177 178 feature_names = [179 "Usia", "Jenis_Kelamin", "Durasi_Smartphone", "Durasi_Medsos", 180 "Durasi_Game", "Durasi_Streaming", "Gadget_Sblm_Tidur",181 "Terganggu_Notif", "Cemas_Tanpa_Internet", "Menunda_Tugas",182 "Waktu_Tidur", "Cek_HP_Tanpa_Notif", "Doom_Scrolling"183 ] + [f"DASS_{i}" for i in range(1, 22)]184 185 import pandas as pd186 X_df = pd.DataFrame([all_input], columns=feature_names)187 188 # Feature Engineering (harus sama persis dengan pipeline training)189 X_df['Total_Screen_Time'] = X_df['Durasi_Smartphone'] + X_df['Durasi_Medsos'] + X_df['Durasi_Game'] + X_df['Durasi_Streaming']190 X_df['Digital_Dependency'] = X_df['Gadget_Sblm_Tidur'] + X_df['Cemas_Tanpa_Internet'] + X_df['Menunda_Tugas'] + X_df['Terganggu_Notif']191 192 # Scale Input193 X_scaled = scaler.transform(X_df)194 195 # Predict 0-4196 dep_pred = int(svm_depresi.predict(X_scaled)[0])197 anx_pred = int(svm_kecemasan.predict(X_scaled)[0])198 str_pred = int(svm_stres.predict(X_scaled)[0])199 200 # Gen-Z Roasting Profile Generation201 bento_character_profile = generate_pixel_character(dep_pred, anx_pred, str_pred)202 203 # Labels for 0-4204 severity_labels = {205 0: "Normal",206 1: "Ringan",207 2: "Sedang",208 3: "Parah",209 4: "Sangat Parah"210 }211 dep_label = severity_labels.get(dep_pred, "Normal")212 anx_label = severity_labels.get(anx_pred, "Normal")213 str_label = severity_labels.get(str_pred, "Normal")214 215 digital_activity_label = calculate_digital_activity(X_input)216 217 roast_texts = {218 'depresi': ROAST_DEPRESI.get(dep_pred, ""),219 'kecemasan': ROAST_KECEMASAN.get(anx_pred, ""),220 'stres': ROAST_STRES.get(str_pred, "")221 }222 223 # Additional single roast box for extreme behavior224 bad_habits_roast = "Screen time kamu tergolong wajar kok. Lanjutkan aktivitas harian normalmu ya."225 if X_input[3] > 6:226 bad_habits_roast = "Waktu medsos kamu tembus " + str(int(X_input[3])) + " jam sehari... pantas jadi capek mikir, yuk kurangi sedikit kebiasaan scroll-nya."227 elif X_input[8] == 1 and X_input[9] == 1:228 bad_habits_roast = "Sering takut tertinggal tren (FOMO) dan menunda pekerjaan. Coba perlahan atur prioritas ya biar hidup lebih tertata."229 230 return render_template('result.html', 231 dep=dep_pred, anx=anx_pred, strs=str_pred,232 dep_label=dep_label, anx_label=anx_label, str_label=str_label,233 roast=roast_texts,234 character=bento_character_profile,235 bad_habits=bad_habits_roast,236 digital_activity=digital_activity_label)237 238 except Exception as e:239 import traceback240 error_msg = traceback.format_exc()241 print(f"Prediction Error: {error_msg}")242 return f"Error Occured: {e}<br><pre>{error_msg}</pre>", 500243 244if __name__ == '__main__':245 # Server configuration for Hugging Face Docker Space246 port = int(os.environ.get("PORT", 7860))247 app.run(host="0.0.0.0", port=port, debug=False)248 