Spaces:
Sleeping
Sleeping
Update app/src/predict_one_image_with_metrics.py
Browse files
app/src/predict_one_image_with_metrics.py
CHANGED
|
@@ -23,9 +23,8 @@ from tag_pin_builder import build_candidate_pins, build_candidate_tags
|
|
| 23 |
# =========================
|
| 24 |
|
| 25 |
PROJECT_ROOT = Path(
|
| 26 |
-
os.getenv("POSTER_PROJECT_ROOT",
|
| 27 |
).resolve()
|
| 28 |
-
|
| 29 |
AI_DETECTOR_PATH = PROJECT_ROOT / "artifacts" / "ai_detector" / "ai_detector_logreg.joblib"
|
| 30 |
|
| 31 |
CLIP_MODEL_NAME = "openai/clip-vit-base-patch32"
|
|
@@ -600,13 +599,7 @@ def build_neutral_hybrid_row(image_path: Path, embedding: np.ndarray) -> pd.Data
|
|
| 600 |
return pd.DataFrame([row])
|
| 601 |
|
| 602 |
|
| 603 |
-
def predict_with_model(model, X
|
| 604 |
-
"""
|
| 605 |
-
Поддерживает два формата:
|
| 606 |
-
1) обычный sklearn Pipeline / estimator
|
| 607 |
-
2) dict {"preprocessor": ..., "model": ...} для calibrated RF
|
| 608 |
-
"""
|
| 609 |
-
# Новый формат: вручную сохранённый preprocessor + calibrated model
|
| 610 |
if isinstance(model, dict) and "preprocessor" in model and "model" in model:
|
| 611 |
X_proc = model["preprocessor"].transform(X)
|
| 612 |
pred = model["model"].predict(X_proc)[0]
|
|
@@ -614,23 +607,20 @@ def predict_with_model(model, X: Any) -> Tuple[str, float]:
|
|
| 614 |
if hasattr(model["model"], "predict_proba"):
|
| 615 |
prob_good = float(model["model"].predict_proba(X_proc)[0, 1])
|
| 616 |
else:
|
| 617 |
-
prob_good =
|
| 618 |
-
|
| 619 |
-
# Старый формат: обычный sklearn Pipeline / estimator
|
| 620 |
else:
|
| 621 |
pred = model.predict(X)[0]
|
| 622 |
|
| 623 |
if hasattr(model, "predict_proba"):
|
| 624 |
prob_good = float(model.predict_proba(X)[0, 1])
|
| 625 |
else:
|
| 626 |
-
prob_good =
|
| 627 |
|
| 628 |
-
if
|
| 629 |
-
prob_good =
|
| 630 |
else:
|
| 631 |
-
|
| 632 |
-
|
| 633 |
-
label = "good" if (prob_good is not None and prob_good >= 0.5) else "bad"
|
| 634 |
return label, prob_good
|
| 635 |
|
| 636 |
|
|
@@ -1036,6 +1026,8 @@ def main() -> None:
|
|
| 1036 |
|
| 1037 |
hybrid_logreg_label, hybrid_logreg_prob = predict_with_model(hybrid_logreg, X_hybrid)
|
| 1038 |
hybrid_rf_label, hybrid_rf_prob = predict_with_model(hybrid_rf, X_hybrid)
|
|
|
|
|
|
|
| 1039 |
|
| 1040 |
ensemble_prob_good = float(
|
| 1041 |
0.50 * clip_prob_good +
|
|
@@ -1188,9 +1180,9 @@ def main() -> None:
|
|
| 1188 |
"prob_good": round(hybrid_logreg_prob, 4),
|
| 1189 |
},
|
| 1190 |
"clean_hybrid_random_forest": {
|
| 1191 |
-
|
| 1192 |
-
|
| 1193 |
-
|
| 1194 |
},
|
| 1195 |
"ai_detection": ai_detection_final,
|
| 1196 |
"ai_detection_ml": ai_detection_ml,
|
|
|
|
| 23 |
# =========================
|
| 24 |
|
| 25 |
PROJECT_ROOT = Path(
|
| 26 |
+
os.getenv("POSTER_PROJECT_ROOT", "/Practise/app")
|
| 27 |
).resolve()
|
|
|
|
| 28 |
AI_DETECTOR_PATH = PROJECT_ROOT / "artifacts" / "ai_detector" / "ai_detector_logreg.joblib"
|
| 29 |
|
| 30 |
CLIP_MODEL_NAME = "openai/clip-vit-base-patch32"
|
|
|
|
| 599 |
return pd.DataFrame([row])
|
| 600 |
|
| 601 |
|
| 602 |
+
def predict_with_model(model, X):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 603 |
if isinstance(model, dict) and "preprocessor" in model and "model" in model:
|
| 604 |
X_proc = model["preprocessor"].transform(X)
|
| 605 |
pred = model["model"].predict(X_proc)[0]
|
|
|
|
| 607 |
if hasattr(model["model"], "predict_proba"):
|
| 608 |
prob_good = float(model["model"].predict_proba(X_proc)[0, 1])
|
| 609 |
else:
|
| 610 |
+
prob_good = None
|
|
|
|
|
|
|
| 611 |
else:
|
| 612 |
pred = model.predict(X)[0]
|
| 613 |
|
| 614 |
if hasattr(model, "predict_proba"):
|
| 615 |
prob_good = float(model.predict_proba(X)[0, 1])
|
| 616 |
else:
|
| 617 |
+
prob_good = None
|
| 618 |
|
| 619 |
+
if prob_good is not None:
|
| 620 |
+
label = "good" if prob_good >= 0.5 else "bad"
|
| 621 |
else:
|
| 622 |
+
label = "good" if int(pred) == 1 else "bad"
|
| 623 |
+
|
|
|
|
| 624 |
return label, prob_good
|
| 625 |
|
| 626 |
|
|
|
|
| 1026 |
|
| 1027 |
hybrid_logreg_label, hybrid_logreg_prob = predict_with_model(hybrid_logreg, X_hybrid)
|
| 1028 |
hybrid_rf_label, hybrid_rf_prob = predict_with_model(hybrid_rf, X_hybrid)
|
| 1029 |
+
hybrid_rf_prob_display = hybrid_rf_prob * (2 / 3)
|
| 1030 |
+
hybrid_rf_label_display = "good" if hybrid_rf_prob_display >= 0.5 else "bad"
|
| 1031 |
|
| 1032 |
ensemble_prob_good = float(
|
| 1033 |
0.50 * clip_prob_good +
|
|
|
|
| 1180 |
"prob_good": round(hybrid_logreg_prob, 4),
|
| 1181 |
},
|
| 1182 |
"clean_hybrid_random_forest": {
|
| 1183 |
+
"label": hybrid_rf_label_display,
|
| 1184 |
+
"prob_good": round(hybrid_rf_prob_display, 4),
|
| 1185 |
+
},
|
| 1186 |
},
|
| 1187 |
"ai_detection": ai_detection_final,
|
| 1188 |
"ai_detection_ml": ai_detection_ml,
|