Spaces:
Sleeping
Sleeping
| import sys | |
| # SHIM FOR PYTHON 3.13: fake audioop module before any imports | |
| try: | |
| import audioop | |
| except ImportError: | |
| import types | |
| sys.modules["audioop"] = types.ModuleType("audioop") | |
| import gradio as gr | |
| import xgboost as xgb | |
| import joblib | |
| import json | |
| import numpy as np | |
| # --- Load Assets --- | |
| MODEL_PATH = "severity_model.json" | |
| SCALER_PATH = "feature_scaler.pkl" | |
| FEATURES_PATH = "feature_list.json" | |
| def load_resources(): | |
| model = xgb.XGBRegressor() | |
| model.load_model(MODEL_PATH) | |
| scaler = joblib.load(SCALER_PATH) | |
| with open(FEATURES_PATH) as f: | |
| features = json.load(f) | |
| return model, scaler, features | |
| model, scaler, feature_names = load_resources() | |
| def get_label(score): | |
| if score < 0.33: return "Low 🟢" | |
| if score < 0.66: return "Medium 🟡" | |
| return "High 🔴" | |
| def predict(*args): | |
| input_dict = dict(zip(feature_names, args)) | |
| row = np.array([[input_dict[f] for f in feature_names]], dtype=np.float32) | |
| scaled_row = scaler.transform(row) | |
| prediction = float(model.predict(scaled_row)[0]) | |
| score = max(0, min(1, prediction)) | |
| return round(score, 4), get_label(score) | |
| # --- UI --- | |
| with gr.Blocks(theme=gr.themes.Soft()) as demo: | |
| gr.Markdown("# 🕳️ Pothole Severity Predictor (Civic AI)") | |
| gr.Markdown("Adjust the sliders below to simulate pothole features and predict repair priority.") | |
| with gr.Row(): | |
| with gr.Column(): | |
| a = gr.Slider(0, 1, value=0.1, label="Area Ratio (A)", info="Size of pothole") | |
| d = gr.Slider(0, 1, value=0.1, label="Density (D)", info="Fragmentation") | |
| c = gr.Slider(0, 1, value=0.5, label="Centrality (C)", info="0=Edge, 1=Center") | |
| q = gr.Slider(0, 1, value=0.9, label="Confidence (Q)", info="CV Model Certainty") | |
| m = gr.Slider(0, 1, value=0.1, label="Confirmations (M)", info="User reports") | |
| with gr.Column(): | |
| t = gr.Slider(0, 1, value=0.1, label="Persistence (T)", info="Wait time") | |
| r = gr.Slider(0, 1, value=0.4, label="Road Type (R)", info="0.4:Local, 1.0:Highway") | |
| p = gr.Slider(0, 1, value=0.1, label="Critical Infra (P)", info="Proximity to hospitals/schools") | |
| f = gr.Slider(0, 1, value=0.1, label="Recurrence (F)", info="Historical failure") | |
| x = gr.Slider(0, 1, value=0.0, label="Reopen Count (X)", info="Failed repairs") | |
| btn = gr.Button("Calculate Severity Score", variant="primary") | |
| with gr.Row(): | |
| out_score = gr.Number(label="Severity Score (0-1)") | |
| out_label = gr.Textbox(label="Priority Level") | |
| btn.click(predict, inputs=[a, d, c, q, m, t, r, p, f, x], outputs=[out_score, out_label]) | |
| if __name__ == "__main__": | |
| demo.launch() | |