| import gradio as gr |
| import pandas as pd |
| import joblib |
| import folium |
|
|
| |
| model = joblib.load('crime_model.pkl') |
| crime_classes = joblib.load('classes.pkl') |
|
|
| def predict_hotspot(lat, lon, hour, day, month): |
| |
| input_data = pd.DataFrame([[hour, day, month, lat, lon]], |
| columns=['hour', 'day_of_week', 'month', 'latitude', 'longitude']) |
| |
| |
| probs = model.predict_proba(input_data)[0] |
| prediction = model.predict(input_data)[0] |
| |
| |
| result_dict = {crime_classes[i]: float(probs[i]) for i in range(len(crime_classes))} |
| |
| |
| m = folium.Map(location=[lat, lon], zoom_start=14, tiles="CartoDB positron") |
| |
| |
| max_prob = max(probs) |
| color = "red" if max_prob > 0.4 else "orange" |
| |
| folium.Circle( |
| location=[lat, lon], |
| radius=400, |
| popup=f"Predicted: {prediction}", |
| color=color, |
| fill=True, |
| fill_opacity=0.4 |
| ).add_to(m) |
| |
| folium.Marker([lat, lon], tooltip="Query Point").add_to(m) |
| |
| |
| map_html = m._repr_html_() |
| |
| return result_dict, map_html |
|
|
| |
| with gr.Blocks(theme=gr.themes.Soft()) as demo: |
| gr.Markdown("# 🛡️ Predictive Crime Hotspot Analysis") |
| gr.Markdown("Identify potential crime-prone areas using Random Forest machine learning.") |
| |
| with gr.Row(): |
| with gr.Column(scale=1): |
| lat_input = gr.Number(label="Latitude", value=28.61) |
| lon_input = gr.Number(label="Longitude", value=77.23) |
| hour_slider = gr.Slider(0, 23, step=1, label="Hour of Day (24h)") |
| day_slider = gr.Slider(0, 6, step=1, label="Day (0=Mon, 6=Sun)") |
| month_slider = gr.Slider(1, 12, step=1, label="Month") |
| btn = gr.Button("Analyze Risk", variant="primary") |
| |
| with gr.Column(scale=2): |
| label_output = gr.Label(label="Crime Risk Distribution") |
| map_output = gr.HTML(label="GIS Hotspot Map") |
|
|
| btn.click( |
| fn=predict_hotspot, |
| inputs=[lat_input, lon_input, hour_slider, day_slider, month_slider], |
| outputs=[label_output, map_output] |
| ) |
|
|
| if __name__ == "__main__": |
| demo.launch() |