SHEield / app.py
Kamala28's picture
Upload 7 files
3f63f6e verified
Raw History Blame Contribute Delete
2.42 kB
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)