CoolFace
Apppublic

orxva/svm

sourceHugging Faceupdated 3mo agoView on Hugging Face
0likes
app.py248 linesDownload Raw Back to root
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