AbdullahImran commited on
Commit
f1ea272
·
verified ·
1 Parent(s): 8c9a116

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +20 -22
app.py CHANGED
@@ -2,7 +2,7 @@ import os
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 google.colab import drive
@@ -15,7 +15,6 @@ from tensorflow.keras.losses import BinaryFocalCrossentropy
15
  from PIL import Image
16
 
17
  # --- CONFIGURATION ---
18
- # Coordinates for a representative forest area in Pakistan
19
  FOREST_COORDS = {'Pakistan Forest': (34.0, 73.0)}
20
  API_URL = (
21
  "https://archive-api.open-meteo.com/v1/archive"
@@ -28,7 +27,6 @@ API_URL = (
28
  )
29
 
30
  # --- GEMINI SETUP ---
31
- # Retrieve API key from environment variable (set in Hugging Face Secrets)
32
  GOOGLE_API_KEY = os.environ.get('GOOGLE_API_KEY')
33
  if not GOOGLE_API_KEY:
34
  raise ValueError("Missing GOOGLE_API_KEY environment variable")
@@ -38,28 +36,28 @@ flash = genai.GenerativeModel('gemini-1.5-flash')
38
  # --- LOAD MODELS ---
39
  def load_models():
40
  drive.mount('/content/drive', force_remount=False)
41
- # Fire detection (VGG16 binary classifier)
42
  vgg_model = load_model(
43
  '/content/drive/MyDrive/vgg16_focal_unfreeze_more.keras',
44
  custom_objects={'BinaryFocalCrossentropy': BinaryFocalCrossentropy}
45
  )
46
- # Severity classification (Xception + RF/XGB ensemble)
47
  def focal_loss_fixed(gamma=2., alpha=.25):
48
  import tensorflow.keras.backend as K
49
  def loss_fn(y_true, y_pred):
50
  eps = K.epsilon(); y_pred = K.clip(y_pred, eps, 1.-eps)
51
  ce = -y_true * K.log(y_pred)
52
  w = alpha * K.pow(1-y_pred, gamma)
53
- return K.mean(w*ce, axis=-1)
54
  return loss_fn
55
  xce_model = load_model(
56
  '/content/drive/My Drive/severity_post_tta.keras',
57
  custom_objects={'focal_loss_fixed': focal_loss_fixed()}
58
  )
59
- rf_model = joblib.load('/content/drive/My Drive/ensemble_rf_model.pkl')
60
- xgb_model = joblib.load('/content/drive/My Drive/ensemble_xgb_model.pkl')
61
- # Weather trend (Logistic Regression)
62
- lr_model = joblib.load('/content/drive/MyDrive/wildfire_logistic_model_synthetic.joblib')
 
 
63
  return vgg_model, xce_model, rf_model, xgb_model, lr_model
64
 
65
  vgg_model, xception_model, rf_model, xgb_model, lr_model = load_models()
@@ -78,7 +76,7 @@ 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
 
84
  def classify_severity(img):
@@ -99,23 +97,22 @@ def fetch_weather_trend(lat, lon):
99
  end=end.strftime('%Y-%m-%d'))
100
  data = requests.get(url).json().get('daily', {})
101
  df = pd.DataFrame(data)
102
- # convert to numeric
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
  df['precipitation'] = df['precipitation_sum'].fillna(0)
107
- df['temperature'] = (df['temperature_2m_max'] + df['temperature_2m_min'])/2
108
- df['humidity'] = (df['relative_humidity_2m_max'] + df['relative_humidity_2m_min'])/2
109
  df['wind_speed'] = df['windspeed_10m_max']
110
  df['fire_risk_score'] = (
111
- 0.4*(df['temperature']/55) +
112
- 0.2*(1-df['humidity']/100) +
113
- 0.3*(df['wind_speed']/60) +
114
  0.1*(1-df['precipitation']/50)
115
  )
116
  feats = df[['temperature','humidity','wind_speed','precipitation','fire_risk_score']]
117
- v = feats.fillna(feats.mean()).iloc[-1].values.reshape(1,-1)
118
- trend_cl = lr_model.predict(v)[0]
119
  return trend_map.get(trend_cl)
120
 
121
 
@@ -139,11 +136,11 @@ def pipeline(image):
139
  img = Image.fromarray(image).convert('RGB')
140
  fire, prob = detect_fire(img)
141
  if not fire:
142
- return f"No wildfire detected (prob={prob:.2f})", "N/A", "**No wildfire detected. Stay alert.**"
143
  severity = classify_severity(img)
144
  trend = fetch_weather_trend(*FOREST_COORDS['Pakistan Forest'])
145
  recs = generate_recommendations(True, severity, trend)
146
- return f"Fire Detected (prob={prob:.2f})", severity.title(), recs
147
 
148
  interface = gr.Interface(
149
  fn=pipeline,
@@ -151,6 +148,7 @@ interface = gr.Interface(
151
  outputs=[
152
  gr.Textbox(label='Fire Status'),
153
  gr.Textbox(label='Severity Level'),
 
154
  gr.Markdown(label='Recommendations')
155
  ],
156
  title='Wildfire Detection & Management Assistant',
 
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 google.colab import drive
 
15
  from PIL import Image
16
 
17
  # --- CONFIGURATION ---
 
18
  FOREST_COORDS = {'Pakistan Forest': (34.0, 73.0)}
19
  API_URL = (
20
  "https://archive-api.open-meteo.com/v1/archive"
 
27
  )
28
 
29
  # --- GEMINI SETUP ---
 
30
  GOOGLE_API_KEY = os.environ.get('GOOGLE_API_KEY')
31
  if not GOOGLE_API_KEY:
32
  raise ValueError("Missing GOOGLE_API_KEY environment variable")
 
36
  # --- LOAD MODELS ---
37
  def load_models():
38
  drive.mount('/content/drive', force_remount=False)
 
39
  vgg_model = load_model(
40
  '/content/drive/MyDrive/vgg16_focal_unfreeze_more.keras',
41
  custom_objects={'BinaryFocalCrossentropy': BinaryFocalCrossentropy}
42
  )
 
43
  def focal_loss_fixed(gamma=2., alpha=.25):
44
  import tensorflow.keras.backend as K
45
  def loss_fn(y_true, y_pred):
46
  eps = K.epsilon(); y_pred = K.clip(y_pred, eps, 1.-eps)
47
  ce = -y_true * K.log(y_pred)
48
  w = alpha * K.pow(1-y_pred, gamma)
49
+ return K.mean(w * ce, axis=-1)
50
  return loss_fn
51
  xce_model = load_model(
52
  '/content/drive/My Drive/severity_post_tta.keras',
53
  custom_objects={'focal_loss_fixed': focal_loss_fixed()}
54
  )
55
+ with open('/content/drive/My Drive/ensemble_rf_model.pkl', 'rb') as f:
56
+ rf_model = pickle.load(f)
57
+ with open('/content/drive/My Drive/ensemble_xgb_model.pkl', 'rb') as f:
58
+ xgb_model = pickle.load(f)
59
+ with open('/content/drive/MyDrive/wildfire_logistic_model_synthetic.joblib', 'rb') as f:
60
+ lr_model = pickle.load(f)
61
  return vgg_model, xce_model, rf_model, xgb_model, lr_model
62
 
63
  vgg_model, xception_model, rf_model, xgb_model, lr_model = load_models()
 
76
  x = keras_image.img_to_array(img.resize((128,128)))[None]
77
  x = vgg_preprocess(x)
78
  prob = float(vgg_model.predict(x)[0][0])
79
+ return prob >= 0.5, prob
80
 
81
 
82
  def classify_severity(img):
 
97
  end=end.strftime('%Y-%m-%d'))
98
  data = requests.get(url).json().get('daily', {})
99
  df = pd.DataFrame(data)
 
100
  for c in ['precipitation_sum','temperature_2m_max','temperature_2m_min',
101
  'relative_humidity_2m_max','relative_humidity_2m_min','windspeed_10m_max']:
102
+ df[c] = pd.to_numeric(df.get(c,[]), errors='coerce')
103
  df['precipitation'] = df['precipitation_sum'].fillna(0)
104
+ df['temperature'] = (df['temperature_2m_max']+df['temperature_2m_min'])/2
105
+ df['humidity'] = (df['relative_humidity_2m_max']+df['relative_humidity_2m_min'])/2
106
  df['wind_speed'] = df['windspeed_10m_max']
107
  df['fire_risk_score'] = (
108
+ 0.4*(df['temperature']/55)+
109
+ 0.2*(1-df['humidity']/100)+
110
+ 0.3*(df['wind_speed']/60)+
111
  0.1*(1-df['precipitation']/50)
112
  )
113
  feats = df[['temperature','humidity','wind_speed','precipitation','fire_risk_score']]
114
+ feat = feats.fillna(feats.mean()).iloc[-1].values.reshape(1,-1)
115
+ trend_cl = lr_model.predict(feat)[0]
116
  return trend_map.get(trend_cl)
117
 
118
 
 
136
  img = Image.fromarray(image).convert('RGB')
137
  fire, prob = detect_fire(img)
138
  if not fire:
139
+ return f"No wildfire detected (prob={prob:.2f})", "N/A", "N/A", "**No wildfire detected. Stay alert.**"
140
  severity = classify_severity(img)
141
  trend = fetch_weather_trend(*FOREST_COORDS['Pakistan Forest'])
142
  recs = generate_recommendations(True, severity, trend)
143
+ return f"Fire Detected (prob={prob:.2f})", severity.title(), trend, recs
144
 
145
  interface = gr.Interface(
146
  fn=pipeline,
 
148
  outputs=[
149
  gr.Textbox(label='Fire Status'),
150
  gr.Textbox(label='Severity Level'),
151
+ gr.Textbox(label='Weather Trend'),
152
  gr.Markdown(label='Recommendations')
153
  ],
154
  title='Wildfire Detection & Management Assistant',