Files
scene-actor-extraction/docs/index.md
T
dtourolle 4925443e56 docs: four focused findings pages (best model, gallery scope, expansion, deep dive)
Splits the rep4 write-up's key findings into their own linkable pages:
- best-model.md: calibration curves first (discriminative power, independent
  of any threshold), then F1 on the benchmark — LVFace-B Glint360K wins both.
- gallery-scope.md: whole vs. cast-restricted gallery, isolated from model and
  expansion choice — restriction wins on every axis, but isn't a shipped
  runtime feature yet.
- pose-expansion.md: the training-set expand_gallery effect, and the held-out
  replication attempt that found it doesn't reproduce (5 films, 2 models,
  after catching and fixing a replay-timeout truncation bug and a bbox
  first-match-instead-of-best-match bug in the comparison harness itself). An
  honest null result, with the methodology errors documented since they're
  exactly the kind that manufacture a false "it works!" finding.
- lvface-deep-dive.md: the winning model's held-out generalization gap, its
  two failure modes (frozen-bbox ghost tracks), and a verified case (cross-
  checked against Jellyfin's independent cast metadata) where LVFace
  correctly identified an actor that X-Ray's ground truth failed to credit.

Adds a "report-highlights" artifact-registry package (scripts/artifacts/
push_artifacts.sh, pull_artifacts.sh) for hand-picked illustrative frames that
aren't reproducible via the automated best/worst montage selection, and wires
pulling it into scripts/docs/build_site.sh.
2026-07-19 19:40:19 +02:00

52 lines
2.5 KiB
Markdown

# scene-actor-extraction
A face-recognition pipeline that finds when each actor appears on screen in a
film or TV episode — built on [KPN++](https://gitea.tourolle.paris/dtourolle/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.
## Start here — four questions this bake-off answers
- **[Which model is best?](best-model.md)** — 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](gallery-scope.md)** —
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?](pose-expansion.md)** — 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](lvface-deep-dive.md)** — 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
- **[Rep4 model bake-off + threshold re-tune](rep4-optimizer-results.md)** —
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)](optimizer-experiments.md)** — the
earlier scene-union-metric tuning pass, superseded by the per-second metric
used in rep4 but kept for the ground-truth/architecture background.
- **[Service conversion (proposal)](service-conversion.md)** — 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:
```bash
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).