mastefan commited on
Commit
1b040c9
·
verified ·
1 Parent(s): c405c2d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +31 -9
app.py CHANGED
@@ -208,19 +208,41 @@ def extract_feature_timeseries(video_path:str, frame_skip:int=FRAME_SKIP, debug:
208
  # Predictor & event logic
209
  # =====================================================
210
  def predict_scores(df):
 
211
  feats = ["red_ratio", "green_ratio", "red_diff", "green_diff", "z_red", "z_green"]
212
  X = df[feats].copy()
213
  ag = ag_predictor()
 
 
214
  try:
215
- proba = ag.predict_proba(X)
216
- if isinstance(proba, pd.DataFrame) and (1 in proba.columns):
217
- return proba[1]
218
- except Exception as e:
219
- print("[WARN] Predictor .predict_proba() failed, falling back:", e)
220
- preds = ag.predict(X)
221
- s = pd.Series(preds).astype(float)
222
- rng = (s.quantile(0.95) - s.quantile(0.05)) or 1.0
223
- return ((s - s.quantile(0.05)) / rng).clip(0, 1)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
224
 
225
  def pick_events(df,score,fps):
226
  z=rolling_z(score,45); strong=(z>4.0); keep=strong.rolling(3,min_periods=1).sum()>=2
 
208
  # Predictor & event logic
209
  # =====================================================
210
  def predict_scores(df):
211
+ """Predict illumination likelihoods using AutoGluon regression ensemble."""
212
  feats = ["red_ratio", "green_ratio", "red_diff", "green_diff", "z_red", "z_green"]
213
  X = df[feats].copy()
214
  ag = ag_predictor()
215
+
216
+ # Get model list (older AG versions have .model_names(), newer have .model_names)
217
  try:
218
+ models_all = ag.model_names()
219
+ except Exception:
220
+ models_all = ag.model_names
221
+ print(f"[INFO] Evaluating models: {models_all}")
222
+
223
+ preds_total = []
224
+ for m in models_all:
225
+ try:
226
+ print(f"[INFO] Predicting with {m}")
227
+ y_pred = ag._learner.predict(X, model=m)
228
+ preds_total.append(pd.Series(y_pred, name=m))
229
+ except Exception as e:
230
+ print(f"[WARN] Skipping model {m}: {e}")
231
+
232
+ if not preds_total:
233
+ print("[ERROR] No usable models, returning zeros.")
234
+ return pd.Series(np.zeros(len(df)))
235
+
236
+ # Average predictions from working models
237
+ y_mean = pd.concat(preds_total, axis=1).mean(axis=1)
238
+
239
+ # Normalize 0–1 for consistency
240
+ rng = (y_mean.quantile(0.95) - y_mean.quantile(0.05)) or 1.0
241
+ score = ((y_mean - y_mean.quantile(0.05)) / rng).clip(0, 1)
242
+
243
+ print(f"[INFO] Used {len(preds_total)} valid submodels for regression scoring.")
244
+ return score
245
+
246
 
247
  def pick_events(df,score,fps):
248
  z=rolling_z(score,45); strong=(z>4.0); keep=strong.rolling(3,min_periods=1).sum()>=2