Files
scene-actor-extraction/docs/index.md
T
dtourolle b1efefac6f docs: richer report — data figures, success/failure frames, commit-pinned repo links
- experiment_charts.py generates 4 figures from experiments/ artifacts:
  held-out per-film F1, 16-combo ranking, DE search landscape, and the
  Downton detector-vs-tracker ghost timeline (replaces the blank
  title-card screenshot)
- new frames: 19-correct wedding shot (success case), Many Saints
  ghost-vs-unknown frame (three error classes in one image)
- rename rep4-optimizer-results.md -> model-bakeoff.md; rep4 kept only
  as the on-disk artifact prefix, explained once
- repo file references are now links via https://REPOLINK/<path>
  placeholders; build_site.sh pins them to the HEAD commit's raw URLs
  and fails the build if a linked path doesn't exist at HEAD
- drop references to removed scripts (scene_score.py, score_config.py)
  and to session-memory names; mark artifact-registry paths with their
  pull commands
- commit readme_example.jpg + pipeline_topology.svg so README renders
  on the plain Gitea repo view
- deploy_pages.sh: push built site/ to the gitea-pages branch
2026-07-19 22:06:56 +02:00

3.2 KiB

scene-actor-extraction

A face-recognition pipeline that finds when each actor appears on screen in a film or TV episode — built on KPN++ (a C++20 Kahn Process Network library) for the detect → track → match → scene pipeline, with a Jellyfin-integrated gallery and an X-Ray-validated optimizer.

This is what a good second looks like — one sampled frame from a held-out film, 19 faces named, all 19 correct, the rest honestly declared unknown:

19 correct identifications in one wedding shot, Downton Abbey: A New Era

And this is why the work isn't done: on this same film the same config misses 6 in 10 of the actor-seconds X-Ray says are present, and on the worst held-out film it reports ghost actors over empty walls — at 100% confidence. Both stories, with the evidence, are in the pages below.

Start here — four questions this bake-off answers

  • Which model is best? — calibration curves first (discriminative power, independent of any threshold), then F1 on the actual benchmark. LVFace-B Glint360K wins both.
  • Whole gallery vs. limited (cast-restricted) gallery — restricting the matcher to a film's credited cast is a clean win on every axis (+3.3pp F1, less than a third the misIDs), but isn't a shipped runtime feature yet.
  • Does pose expansion help? — a real training-set effect that didn't reproduce on 5 held-out films once two methodology bugs were caught and fixed. An honest null result, not a forced narrative.
  • Deep dive: LVFace-B Glint360K — the winning model's held-out generalization gap, its two real failure modes (frozen-bbox "ghost tracks"), and one case where it correctly identified an actor that the X-Ray ground truth itself failed to credit.

The full technical log

  • Model bake-off + threshold re-tune — the complete experiment log behind the four pages above: the ROCm teardown deadlock root cause and fix, DE concurrency tuning, the full 16-combo results table, and every caveat. This is where the shipped src/config.hpp defaults come from.
  • Optimizer experiments (prior round) — the earlier scene-union-metric tuning pass, superseded by the per-second metric used in the bake-off but kept for the ground-truth/architecture background.
  • Service conversion (proposal) — design sketch for an idle-GPU Docker worker, not yet built.

Reproducing the benchmarks

Gallery .h5 files, embedding dumps, the X-Ray corpus, montage frame images, and DE trajectories are not committed to this repository — they're pushed to the Gitea package registry and pulled on demand:

scripts/artifacts/pull_artifacts.sh galleries
scripts/artifacts/pull_artifacts.sh experiment-data
scripts/artifacts/pull_artifacts.sh montage-frames <film-slug>

See scripts/artifacts/push_artifacts.sh for the upload side (requires a GITEA_TOKEN with package write scope).