SHEield / app.py
Kamala28's picture
Upload 7 files
3f63f6e verified
from flask import Flask, jsonify, request
import joblib
import pandas as pd
import numpy as np
import requests
import os
app = Flask(__name__)
model = joblib.load("safety_model.pkl")
le = joblib.load("label_encoder.pkl")
grid = pd.read_csv("grid_lookup.csv")
FEATURE_COLS = open("feature_cols.txt").read().strip().split("\n")
FAST2SMS_KEY = "YOUR_FAST2SMS_API_KEY"
GUARDIAN_PHONE = "91XXXXXXXXXX"
def send_sms(lat, lon, risk_score):
message = (
f"SAFETY ALERT! Unsafe location detected. "
f"Location: https://maps.google.com/?q={lat},{lon} "
f"Risk Score: {risk_score:.2f}. Please check immediately!"
)
url = "https://www.fast2sms.com/dev/bulkV2"
payload = {
"route" : "v3",
"sender_id": "TXTIND",
"message" : message,
"language" : "english",
"flash" : 0,
"numbers" : GUARDIAN_PHONE
}
headers = {"authorization": FAST2SMS_KEY, "Content-Type": "application/json"}
try:
resp = requests.post(url, json=payload, headers=headers, timeout=10)
return resp.json()
except Exception as e:
return {"error": str(e)}
@app.route("/predict", methods=["GET"])
def predict():
try:
lat = float(request.args.get("lat"))
lon = float(request.args.get("lon"))
except (TypeError, ValueError):
return jsonify({"error": "Missing or invalid lat/lon"}), 400
distances = np.sqrt((grid["latitude"] - lat)**2 + (grid["longitude"] - lon)**2)
nearest_row = grid.iloc[distances.idxmin()]
features = pd.DataFrame([nearest_row[FEATURE_COLS].values], columns=FEATURE_COLS)
prediction = int(model.predict(features)[0])
risk_score = round(float(model.predict_proba(features)[0][1]), 4)
sms_sent = False
if prediction == 1:
send_sms(lat, lon, risk_score)
sms_sent = True
return jsonify({
"latitude" : lat,
"longitude" : lon,
"label" : "UNSAFE" if prediction == 1 else "SAFE",
"risk_score": risk_score,
"sms_sent" : sms_sent,
"area_id" : nearest_row["area_id"]
})
@app.route("/", methods=["GET"])
def home():
return jsonify({"status": "Women Safety API is running", "usage": "/predict?lat=13.05&lon=80.25"})
if __name__ == "__main__":
port = int(os.environ.get("PORT", 5000))
app.run(host="0.0.0.0", port=port, debug=False)