fix
This commit is contained in:
@@ -42,19 +42,33 @@ def load_experiment(exp_dir: Path) -> dict | None:
|
||||
if not history:
|
||||
return None
|
||||
|
||||
# primary метрика — q2g R@1 (drone→satellite), см. протокол §6.2;
|
||||
# eval_recall@* дублируют q2g, eval_mAP дублирует q2g_mAP.
|
||||
best = max(history, key=lambda r: r.get("eval_recall@1", 0))
|
||||
latest = history[-1]
|
||||
|
||||
return {
|
||||
"dir": exp_dir.name,
|
||||
"seed": config.get("seed", "?"),
|
||||
"text_levels": " + ".join(config.get("text_levels", ["?"])),
|
||||
"epochs_done": latest["epoch"],
|
||||
"epochs_total": config.get("epochs", "?"),
|
||||
"best_epoch": best["epoch"],
|
||||
# q2g (primary); split — только official cross-area (§5.3),
|
||||
# same-area прогонов нет, поэтому cross−same gap не считается.
|
||||
"best_R@1": best.get("eval_recall@1", 0),
|
||||
"best_R@5": best.get("eval_recall@5", 0),
|
||||
"best_R@10": best.get("eval_recall@10", 0),
|
||||
"best_AP": best.get("eval_AP", 0),
|
||||
"best_R@1%": best.get("eval_q2g_recall@1%", 0),
|
||||
"best_mAP": best.get("eval_mAP", 0), # настоящий AP, не MRR
|
||||
"best_median_rank": best.get("eval_q2g_median_rank", 0),
|
||||
"best_mean_rank": best.get("eval_q2g_mean_rank", 0),
|
||||
# g2q (satellite→drone), та же best-эпоха
|
||||
"best_g2q_R@1": best.get("eval_g2q_recall@1", 0),
|
||||
"best_g2q_R@5": best.get("eval_g2q_recall@5", 0),
|
||||
"best_g2q_R@10": best.get("eval_g2q_recall@10", 0),
|
||||
"best_g2q_R@1%": best.get("eval_g2q_recall@1%", 0),
|
||||
"best_g2q_mAP": best.get("eval_g2q_mAP", 0),
|
||||
"latest_loss": latest.get("train_loss", 0),
|
||||
"latest_R@1": latest.get("eval_recall@1", 0),
|
||||
"avg_epoch_time": sum(r.get("elapsed_s", 0) for r in history) / len(history),
|
||||
@@ -63,14 +77,17 @@ def load_experiment(exp_dir: Path) -> dict | None:
|
||||
|
||||
|
||||
def collect_version(version: str) -> list[dict]:
|
||||
"""Собрать результаты одной версии (v1 или v2)."""
|
||||
"""Собрать результаты одной версии (v1 или v2).
|
||||
|
||||
Структура: outputs/<version>/<seed>/<exp_dir>/history.json.
|
||||
"""
|
||||
version_dir = OUTPUTS_DIR / version
|
||||
if not version_dir.exists():
|
||||
print(f"⚠️ Папка не найдена: {version_dir}")
|
||||
return []
|
||||
|
||||
results = []
|
||||
for exp_dir in sorted(version_dir.iterdir()):
|
||||
for exp_dir in sorted(version_dir.glob("*/*")):
|
||||
if exp_dir.is_dir() and (exp_dir / "history.json").exists():
|
||||
data = load_experiment(exp_dir)
|
||||
if data:
|
||||
@@ -91,14 +108,14 @@ def print_table(results: list[dict], version: str) -> None:
|
||||
results.sort(key=lambda r: -r["best_R@1"])
|
||||
|
||||
header = (
|
||||
f"{'Levels':<24} {'Prog':<8} "
|
||||
f"{'BestEp':>6} {'R@1':>7} {'R@5':>7} {'R@10':>7} "
|
||||
f"{'AP':>7} {'Loss':>8} {'Time':>6}"
|
||||
f"{'Levels':<24} {'Seed':>5} {'Prog':<8} {'BestEp':>6} "
|
||||
f"{'R@1':>7} {'R@5':>7} {'R@10':>7} {'R@1%':>7} {'mAP':>7} "
|
||||
f"{'medR':>6} {'g2q@1':>7} {'Loss':>8} {'Time':>6}"
|
||||
)
|
||||
sep = "─" * len(header)
|
||||
|
||||
print(sep)
|
||||
print(f" {version.upper()} Results")
|
||||
print(f" {version.upper()} Results (q2g = primary; g2q@1 = satellite→drone)")
|
||||
print(sep)
|
||||
print(header)
|
||||
print(sep)
|
||||
@@ -106,9 +123,10 @@ def print_table(results: list[dict], version: str) -> None:
|
||||
for r in results:
|
||||
prog = f"{r['epochs_done']}/{r['epochs_total']}"
|
||||
print(
|
||||
f"{r['text_levels']:<24} {prog:<8} "
|
||||
f"{r['best_epoch']:>6} {r['best_R@1']:>7.4f} {r['best_R@5']:>7.4f} "
|
||||
f"{r['best_R@10']:>7.4f} {r['best_AP']:>7.4f} "
|
||||
f"{r['text_levels']:<24} {str(r['seed']):>5} {prog:<8} {r['best_epoch']:>6} "
|
||||
f"{r['best_R@1']:>7.4f} {r['best_R@5']:>7.4f} {r['best_R@10']:>7.4f} "
|
||||
f"{r['best_R@1%']:>7.4f} {r['best_mAP']:>7.4f} {r['best_median_rank']:>6.0f} "
|
||||
f"{r['best_g2q_R@1']:>7.4f} "
|
||||
f"{r['latest_loss']:>8.4f} {r['avg_epoch_time']:>5.0f}s"
|
||||
)
|
||||
|
||||
@@ -123,8 +141,11 @@ def print_table(results: list[dict], version: str) -> None:
|
||||
|
||||
def save_csv(results: list[dict], version: str) -> None:
|
||||
fields = [
|
||||
"version", "text_levels", "epochs_done", "epochs_total",
|
||||
"best_epoch", "best_R@1", "best_R@5", "best_R@10", "best_AP",
|
||||
"version", "seed", "text_levels", "epochs_done", "epochs_total",
|
||||
"best_epoch",
|
||||
"best_R@1", "best_R@5", "best_R@10", "best_R@1%", "best_mAP",
|
||||
"best_median_rank", "best_mean_rank",
|
||||
"best_g2q_R@1", "best_g2q_R@5", "best_g2q_R@10", "best_g2q_R@1%", "best_g2q_mAP",
|
||||
"latest_loss", "latest_R@1", "avg_epoch_time", "dir",
|
||||
]
|
||||
path = RESULTS_DIR / f"results_{version}.csv"
|
||||
|
||||
Reference in New Issue
Block a user