AbdullahImran commited on
Commit
d4e30d8
·
verified ·
1 Parent(s): 86306cc

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -34
app.py CHANGED
@@ -2,7 +2,7 @@ import os
2
  import requests
3
  import pandas as pd
4
  import numpy as np
5
- import pickle
6
  import google.generativeai as genai
7
  import gradio as gr
8
  from datetime import datetime, timedelta
@@ -39,6 +39,7 @@ def load_models():
39
  'vgg16_focal_unfreeze_more.keras',
40
  custom_objects={'BinaryFocalCrossentropy': BinaryFocalCrossentropy}
41
  )
 
42
  # Load Xception severity classifier
43
  def focal_loss_fixed(gamma=2., alpha=.25):
44
  import tensorflow.keras.backend as K
@@ -49,76 +50,77 @@ def load_models():
49
  weight = alpha * K.pow(1 - y_pred, gamma)
50
  return K.mean(weight * ce, axis=-1)
51
  return loss_fn
 
52
  xce_model = load_model(
53
  'severity_post_tta.keras',
54
  custom_objects={'focal_loss_fixed': focal_loss_fixed()}
55
  )
56
- # Load ensemble models
57
- with open('ensemble_rf_model.pkl', 'rb') as f:
58
- rf_model = pickle.load(f)
59
- with open('ensemble_xgb_model.pkl', 'rb') as f:
60
- xgb_model = pickle.load(f)
61
  # Load weather trend model
62
- with open('wildfire_logistic_model_synthetic.joblib', 'rb') as f:
63
- lr_model = pickle.load(f)
64
  return vgg_model, xce_model, rf_model, xgb_model, lr_model
65
 
 
66
  vgg_model, xception_model, rf_model, xgb_model, lr_model = load_models()
67
 
68
  # --- LABEL MAPS ---
69
  target_map = {0: 'mild', 1: 'moderate', 2: 'severe'}
70
  trend_map = {1: 'increase', 0: 'same', -1: 'decrease'}
71
- trend_rules = {
72
- 'mild': {'decrease':'mild','same':'mild','increase':'moderate'},
73
- 'moderate':{'decrease':'mild','same':'moderate','increase':'severe'},
74
- 'severe': {'decrease':'moderate','same':'severe','increase':'severe'}
75
- }
76
 
77
  # --- PIPELINE FUNCTIONS ---
78
 
79
  def detect_fire(img):
80
- x = keras_image.img_to_array(img.resize((128,128)))[None]
81
  x = vgg_preprocess(x)
82
  prob = float(vgg_model.predict(x)[0][0])
83
  return prob >= 0.5, prob
84
 
85
-
86
  def classify_severity(img):
87
- x = keras_image.img_to_array(img.resize((224,224)))[None]
88
  x = xce_preprocess(x)
89
  preds = xception_model.predict(x)
90
  rf_p = rf_model.predict(preds)[0]
91
  xgb_p = xgb_model.predict(preds)[0]
92
- ensemble = int(round((rf_p + xgb_p)/2))
93
  return target_map.get(ensemble, 'moderate')
94
 
95
-
96
  def fetch_weather_trend(lat, lon):
97
  end = datetime.utcnow()
98
  start = end - timedelta(days=1)
99
- url = API_URL.format(lat=lat, lon=lon,
100
- start=start.strftime('%Y-%m-%d'),
101
- end=end.strftime('%Y-%m-%d'))
 
 
102
  data = requests.get(url).json().get('daily', {})
103
  df = pd.DataFrame(data)
104
- for c in ['precipitation_sum','temperature_2m_max','temperature_2m_min',
105
- 'relative_humidity_2m_max','relative_humidity_2m_min','windspeed_10m_max']:
 
106
  df[c] = pd.to_numeric(df.get(c, []), errors='coerce')
 
107
  df['precipitation'] = df['precipitation_sum'].fillna(0)
108
- df['temperature'] = (df['temperature_2m_max'] + df['temperature_2m_min'])/2
109
- df['humidity'] = (df['relative_humidity_2m_max'] + df['relative_humidity_2m_min'])/2
110
- df['wind_speed'] = df['windspeed_10m_max']
 
111
  df['fire_risk_score'] = (
112
- 0.4*(df['temperature']/55) +
113
- 0.2*(1-df['humidity']/100) +
114
- 0.3*(df['wind_speed']/60) +
115
- 0.1*(1-df['precipitation']/50)
116
  )
117
- feats = df[['temperature','humidity','wind_speed','precipitation','fire_risk_score']]
118
- feat = feats.fillna(feats.mean()).iloc[-1].values.reshape(1,-1)
 
 
119
  trend_cl = lr_model.predict(feat)[0]
120
- return trend_map.get(trend_cl)
121
-
122
 
123
  def generate_recommendations(wildfire_present, severity, weather_trend):
124
  prompt = f"""
@@ -142,9 +144,11 @@ def pipeline(image):
142
  fire, prob = detect_fire(img)
143
  if not fire:
144
  return f"No wildfire detected (prob={prob:.2f})", "N/A", "N/A", "**No wildfire detected. Stay alert.**"
 
145
  severity = classify_severity(img)
146
  trend = fetch_weather_trend(*FOREST_COORDS['Pakistan Forest'])
147
  recs = generate_recommendations(True, severity, trend)
 
148
  return f"Fire Detected (prob={prob:.2f})", severity.title(), trend, recs
149
 
150
  interface = gr.Interface(
 
2
  import requests
3
  import pandas as pd
4
  import numpy as np
5
+ import joblib
6
  import google.generativeai as genai
7
  import gradio as gr
8
  from datetime import datetime, timedelta
 
39
  'vgg16_focal_unfreeze_more.keras',
40
  custom_objects={'BinaryFocalCrossentropy': BinaryFocalCrossentropy}
41
  )
42
+
43
  # Load Xception severity classifier
44
  def focal_loss_fixed(gamma=2., alpha=.25):
45
  import tensorflow.keras.backend as K
 
50
  weight = alpha * K.pow(1 - y_pred, gamma)
51
  return K.mean(weight * ce, axis=-1)
52
  return loss_fn
53
+
54
  xce_model = load_model(
55
  'severity_post_tta.keras',
56
  custom_objects={'focal_loss_fixed': focal_loss_fixed()}
57
  )
58
+
59
+ # Load ensemble models correctly with joblib
60
+ rf_model = joblib.load('ensemble_rf_model.pkl')
61
+ xgb_model = joblib.load('ensemble_xgb_model.pkl')
62
+
63
  # Load weather trend model
64
+ lr_model = joblib.load('wildfire_logistic_model_synthetic.joblib')
65
+
66
  return vgg_model, xce_model, rf_model, xgb_model, lr_model
67
 
68
+ # Load all models
69
  vgg_model, xception_model, rf_model, xgb_model, lr_model = load_models()
70
 
71
  # --- LABEL MAPS ---
72
  target_map = {0: 'mild', 1: 'moderate', 2: 'severe'}
73
  trend_map = {1: 'increase', 0: 'same', -1: 'decrease'}
 
 
 
 
 
74
 
75
  # --- PIPELINE FUNCTIONS ---
76
 
77
  def detect_fire(img):
78
+ x = keras_image.img_to_array(img.resize((128, 128)))[None]
79
  x = vgg_preprocess(x)
80
  prob = float(vgg_model.predict(x)[0][0])
81
  return prob >= 0.5, prob
82
 
 
83
  def classify_severity(img):
84
+ x = keras_image.img_to_array(img.resize((224, 224)))[None]
85
  x = xce_preprocess(x)
86
  preds = xception_model.predict(x)
87
  rf_p = rf_model.predict(preds)[0]
88
  xgb_p = xgb_model.predict(preds)[0]
89
+ ensemble = int(round((rf_p + xgb_p) / 2))
90
  return target_map.get(ensemble, 'moderate')
91
 
 
92
  def fetch_weather_trend(lat, lon):
93
  end = datetime.utcnow()
94
  start = end - timedelta(days=1)
95
+ url = API_URL.format(
96
+ lat=lat, lon=lon,
97
+ start=start.strftime('%Y-%m-%d'),
98
+ end=end.strftime('%Y-%m-%d')
99
+ )
100
  data = requests.get(url).json().get('daily', {})
101
  df = pd.DataFrame(data)
102
+
103
+ for c in ['precipitation_sum', 'temperature_2m_max', 'temperature_2m_min',
104
+ 'relative_humidity_2m_max', 'relative_humidity_2m_min', 'windspeed_10m_max']:
105
  df[c] = pd.to_numeric(df.get(c, []), errors='coerce')
106
+
107
  df['precipitation'] = df['precipitation_sum'].fillna(0)
108
+ df['temperature'] = (df['temperature_2m_max'] + df['temperature_2m_min']) / 2
109
+ df['humidity'] = (df['relative_humidity_2m_max'] + df['relative_humidity_2m_min']) / 2
110
+ df['wind_speed'] = df['windspeed_10m_max']
111
+
112
  df['fire_risk_score'] = (
113
+ 0.4 * (df['temperature'] / 55) +
114
+ 0.2 * (1 - df['humidity'] / 100) +
115
+ 0.3 * (df['wind_speed'] / 60) +
116
+ 0.1 * (1 - df['precipitation'] / 50)
117
  )
118
+
119
+ feats = df[['temperature', 'humidity', 'wind_speed', 'precipitation', 'fire_risk_score']]
120
+ feat = feats.fillna(feats.mean()).iloc[-1].values.reshape(1, -1)
121
+
122
  trend_cl = lr_model.predict(feat)[0]
123
+ return trend_map.get(trend_cl, 'same')
 
124
 
125
  def generate_recommendations(wildfire_present, severity, weather_trend):
126
  prompt = f"""
 
144
  fire, prob = detect_fire(img)
145
  if not fire:
146
  return f"No wildfire detected (prob={prob:.2f})", "N/A", "N/A", "**No wildfire detected. Stay alert.**"
147
+
148
  severity = classify_severity(img)
149
  trend = fetch_weather_trend(*FOREST_COORDS['Pakistan Forest'])
150
  recs = generate_recommendations(True, severity, trend)
151
+
152
  return f"Fire Detected (prob={prob:.2f})", severity.title(), trend, recs
153
 
154
  interface = gr.Interface(