< overcast.video

crime-board — the CSI lineup / crime board (multi-person)

What this proves. overcast can stand up a *persistent, fully local* face

database out of raw footage — no faces ever leave the machine — and have it

discover several distinct people on its own: one 160-second press-conference

clip goes in, and the DB separates the four Artemis II crew members into four

clean person clusters, re-identifies one of them across separated segments,

survives a held-out official-portrait probe, and renders the whole book as a

self-contained HTML contact sheet (every face crop embedded as a base64

data-URI). The lineup is the deepface-local face-cluster provider

(Facenet512 / retinaface via the uv-managed OC_VISUAL_DB_PY Python).

The story: book each speaking segment of one short NASA presser clip →

4 distinct people (Reid Wiseman, Victor Glover, Christina Koch, Jeremy

Hansen — the Artemis II crew, all public figures). Glover speaks in two

separated segments and the DB **matches his second appearance to his existing

person (0 new people)** — cross-segment re-identification, the CCTV-handoff

move. Then hand the book Christina Koch's official NASA portrait (never

ingested): it points at her cluster at 65.5/100 with the runner-up at

3.4/100.

Media provenance (staged under showcase/_media/faces/)

YouTube channel**: "Artemis II Crew News Conference (Sept. 24, 2025)",

video id 9mq_lb_SmKE (fetched with yt-dlp, the same engine behind the dl:

source). A NASA production = US-government work, public domain. Four 40 s

windows concatenated (ffmpeg) so each crew member gets a close-up segment in

one 160 s clip: source 228–268 s (Wiseman), 498–538 s (Glover), 782–822 s

(Koch), 1000–1040 s (Hansen); a wide panel shot sits inside the Glover

window at clip time 56–68 s.

"Christina Koch Artemis 2 Crew Portrait.jpg" (NASA / Josh Valcarcel, JSC),

public domain. Never ingested into the DB.

All four people are clearly identifiable public figures (the Artemis II crew);

identities were visually verified against the footage before labeling.

Reproduce

All commands run from the repo root so .env auto-loads (OC_VISUAL_DB_PY for

the deepface stack). Every command is isolated with --case showcase/crime-board.

No face provider binding is needed — the shared profile is untouched.


# 0. fresh start (the old single-person build was cleared)
overcast case clear --yes --case showcase/crime-board --json

# 1. stand up a persistent LOCAL face-cluster index (the mugshot book)
overcast index create people --type face-cluster --local --case showcase/crime-board --json
IDX=local_face_cluster_29587d28
V=showcase/_media/faces/artemis2-crew-presser-nasa-20250924.mp4

# 2. book each speaking segment — detect + embed + assign-or-create at 0.5 fps.
#    --min-similarity 52 was tuned on a scout pass (see Notes): >48 so Hansen
#    doesn't glue onto Wiseman, ≤55 so profile poses still join their person.
#    The wide-shot window 56–68s is deliberately skipped (junk signatures, Notes).
overcast cluster add $V --index $IDX --fps 0.5 --min-similarity 52 --start 0   --end 40  --case showcase/crime-board --json   # rec_00a86601891b5a32: 20 faces -> 1 NEW person (Wiseman)
overcast cluster add $V --index $IDX --fps 0.5 --min-similarity 52 --start 40  --end 56  --case showcase/crime-board --json   # rec_3817611d8ce720cc:  8 faces -> 1 NEW person (Glover)
overcast cluster add $V --index $IDX --fps 0.5 --min-similarity 52 --start 68  --end 80  --case showcase/crime-board --json   # rec_3d8c840976eb1f34:  6 faces -> 0 new, ALL matched Glover (re-identified at 87-96)
overcast cluster add $V --index $IDX --fps 0.5 --min-similarity 52 --start 80  --end 120 --case showcase/crime-board --json   # rec_9438364cc2a98de6: 20 faces -> 1 NEW person (Koch)
overcast cluster add $V --index $IDX --fps 0.5 --min-similarity 52 --start 120 --end 160 --case showcase/crime-board --json   # rec_c5f30fb8ec9f010e: 20 faces -> 1 NEW person (Hansen)
#   -> 74 faces, 4 people, zero junk detections; no recluster needed

# 3. verify identities against the footage crops, then name the people
overcast cluster label p_1 "Reid Wiseman (NASA astronaut, Artemis II commander)" --index $IDX --case showcase/crime-board --json
overcast cluster label p_2 "Victor Glover (NASA astronaut, Artemis II pilot)"    --index $IDX --case showcase/crime-board --json
overcast cluster label p_3 "Christina Koch (NASA astronaut, Artemis II)"         --index $IDX --case showcase/crime-board --json
overcast cluster label p_4 "Jeremy Hansen (CSA astronaut, Artemis II)"           --index $IDX --case showcase/crime-board --json

# 4. the lineup probe — run the held-out official portrait through the book
overcast cluster identify showcase/_media/faces/koch-portrait-nasa.jpg \
  --index $IDX --case showcase/crime-board --json
#   -> rec_5e62a6f8a7799765: closest person p_3 "Christina Koch" at 65.5/100,
#      confident, NOT a new person; runner-up (Wiseman) 3.4/100

# 5. promote to evidence + narrate the verdict
overcast finding create "Held-out official NASA portrait ... identified as p_3 'Christina Koch' at 65.5/100 ..." \
  --ref rec_5e62a6f8a7799765 --confidence high --case showcase/crime-board --json   # rec_872aaaf40a072dba
overcast note "Booked the four speaking segments ... 74 faces -> 4 distinct people ..." \
  --tag tldr --case showcase/crime-board --json                                     # rec_47892ee6f05ed4a7

# 6. HERO artifact — the multi-person contact-sheet gallery (one card per person,
#    24 face crops embedded as data-URIs; fully self-contained)
overcast cluster view --index $IDX --out showcase/crime-board/gallery.html --no-open \
  --case showcase/crime-board --json

# 7. second artifact — the relational crime board ("connect the dots"):
#    the media hub fanning out to 5 booking records -> exactly 4 person nodes,
#    plus the identify record, finding, and tldr note
overcast graph --theme csi --export showcase/crime-board/graph.html --no-open \
  --case showcase/crime-board --json          # 14 nodes / 13 edges

Publish


node ~/dev/github/overcast.video/scripts/publish-case.mjs \
  --slug crime-board \
  --src  case:crime-board/showcase/crime-board \
  --scrub case:crime-board \
  --thumb gallery.html
# -> public/cases/crime-board/{gallery.html, graph.html, runbook.html, thumb.png}
# scrub grep file://|/Users/ : all 0

Results

- p_1 Reid Wiseman (NASA astronaut, Artemis II commander) — 20 faces, 1–39 s

- p_2 Victor Glover (NASA astronaut, Artemis II pilot) — 14 faces, 41–79 s

(two separated segments; the second matched his existing person at 87–96)

- p_3 Christina Koch (NASA astronaut, Artemis II) — 20 faces, 81–119 s

- p_4 Jeremy Hansen (CSA astronaut, Artemis II) — 20 faces, 121–159 s

(confident, not flagged new); runner-up 3.4/100, then 2.2, 0.7.

embedded as base64 data-URIs, 0 external refs. Fully hostable.

the presser-clip media hub fanning out to the 5 booking records → exactly the

4 cluster-person nodes, plus the probe image → identify record → finding.

grep file://|/Users/: all 0.

Notes / caveats

scout pass first produced 89 faces → 8 raw clusters, including two junk

"people" with the classic detector-false-positive signatures — retinaface

fallback boxes with left_eye == null (no landmarks → no alignment → noisy

embeddings) and sub-40 px motion-blur slivers, all inside the wide-shot

window at clip 56–68 s. Rather than booking them and pruning faces.jsonl

afterwards (the previous build's approach — it leaves dead cluster ids in the

booking records), the final booking skips that window with --start/--end,

so no junk ever enters the DB and every gallery card is a real face. The

signature test to find such clusters in any build:

box.left_eye == null || box.w < 40 over the index's faces.jsonl.

Hansen's first face glued onto Wiseman's person at 48 similarity; Wiseman's

own profile-pose faces join as low as 55. 52 sits in the gap — all four stay

separate, poses still merge. Similarities are 0–100 (percent), not 0–1.

crew) were booked, from public-domain US-government footage; identities were

visually verified before labeling/publishing. The audience/moderator portions

of the presser were deliberately not used.

no provider binding was touched.