bert_simpson / forgebench /code /eval /aggregate_results.py
Ronaldo-GOAT's picture
forgebench: final scorer tree (shard support), aggregate_results.py, latest Omni VGGT drivers (v2/v3), README updates; no seeds
a3752bd verified
Raw History Blame Contribute Delete
1.22 kB
#!/usr/bin/env python
"""Aggregate evaluate_appforce results into the paper-table row.
usage: python aggregate_results.py DIR [DIR ...] (each DIR holds results.json or shards/subdirs with results.json)
Prints n, IV LPIPS/PSNR/SSIM, NV LPIPS/PSNR/SSIM, CD-L1, F@0.01 (means over objects that have all parts;
an object appearing in several shards/retries is counted once, preferring a complete record)."""
import glob, json, sys, numpy as np
rows = {}
for d in sys.argv[1:]:
for f in glob.glob(d + "/**/results.json", recursive=True):
for r in json.load(open(f)):
if not isinstance(r, dict) or "object" not in r: continue
ok = r.get("geometry") and r.get("input_view") and r.get("novel_view")
if ok: rows[r["object"]] = r
R = list(rows.values())
if not R: sys.exit("no complete records")
m = lambda k, s: np.mean([x[k][s] for x in R])
print(f"n={len(R)} IV {m('input_view','lpips'):.4f}/{m('input_view','psnr'):.2f}/{m('input_view','ssim'):.3f}"
f" NV {m('novel_view','lpips'):.4f}/{m('novel_view','psnr'):.2f}/{m('novel_view','ssim'):.3f}"
f" CD {np.mean([x['geometry']['cd_l1'] for x in R]):.4f} F@.01 {np.mean([x['geometry']['f01'] for x in R]):.3f}")