File size: 2,717 Bytes
b85e25b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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()