feat(tooling): X-Ray threshold optimizer, gallery utilities, artifact registry, docs build
Optimizer (scripts/optimizer/): replay.py runs the real C++ tracker/matcher/ scene_tracker chain over a dumped-embeddings HDF5 via sae_kpn, so a threshold sweep never re-decodes video or re-embeds faces. optimize.py drives scipy's differential_evolution over the knob space, with DE-level parallelism (multiple population candidates evaluated concurrently via a ThreadPoolExecutor) on top of per-film replay parallelism. second_score.py is the per-second X-Ray scoring metric (TPI/FPI/FN, out-of-cast misID weighted 10x, fair recall masked to gallery-known cast) that superseded an earlier scene-union metric. dump_error_frames.py / dump_scene_montage.py extract annotated video frames (bounding boxes, TPI/FPI/FN captions, onscreen-vs-offscreen split) for visual review of a replay against ground truth. Gallery utilities: cast_restrict.py, gallery_membership.py, fetch_missing_actors.py, reembed_gallery.py. scripts/validation/: X-Ray ground-truth loading and provider-agnostic identity matching (identity.py's keys_for — an actor is the union of every id we can derive, since pipeline output and ground truth don't share one id space). scripts/artifacts/: push/pull scripts for the Gitea generic package registry — galleries, montage frames, and experiment data (manifests/trajectories/results) are pushed there instead of committed, since none are needed to run the app, only benchmarks. Versioned by git short-SHA. scripts/docs/: MkDocs site build (build_site.sh) and the calibration-curve comparison chart (calibration_chart.py, matplotlib, reads each gallery's embedded calibration). Gallery-building scripts (make_jellyfin_gallery.py, make_gallery.py, filter_gallery.py, run_from_jellyfin.py, movienet_eval.py, movienet_prep.py, sae_gallery.py) updated to read/write HDF5 galleries exclusively, matching the engine-side format switch. run_from_jellyfin.py and the optimizer no longer carry movie source paths in shared manifests (some source filenames include scene-release tags) — resolved locally via a gitignored file-lut.json instead.
This commit is contained in:
@@ -4,7 +4,7 @@ movienet_eval.py — embed probe crops and match against a gallery.
|
||||
|
||||
Usage:
|
||||
python scripts/movienet_eval.py \
|
||||
--gallery gallery_r50.json \
|
||||
--gallery gallery_r50.h5 \
|
||||
--arcface models/arcface_w600k_r50.onnx \
|
||||
--gt eval/gt.json \
|
||||
--output eval/predictions_r50.json \
|
||||
@@ -23,12 +23,12 @@ import numpy as np
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
||||
from sae_embed_loader import load_embedder
|
||||
from sae_gallery import load_gallery_hdf5
|
||||
|
||||
|
||||
def load_gallery(path: str) -> dict[str, dict]:
|
||||
"""Return {imdb_id: {"name": str, "refs": np.ndarray[n_refs, dim]}}."""
|
||||
with open(path) as f:
|
||||
data = json.load(f)
|
||||
data = load_gallery_hdf5(Path(path))
|
||||
return {a["imdb_id"]: {"name": a["name"],
|
||||
"refs": np.asarray(a["embeddings"], dtype=np.float32)}
|
||||
for a in data["actors"]}
|
||||
|
||||
Reference in New Issue
Block a user