Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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 |
-
|
| 216 |
-
|
| 217 |
-
|
| 218 |
-
|
| 219 |
-
|
| 220 |
-
|
| 221 |
-
|
| 222 |
-
|
| 223 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|