Same schedule as feat/igpu-ov: decode stays frame-perfect; when a scene
still needs a face, inference runs every stride-th frame up to
probe_max probes, then waits for the next scene start. Default stride 1
reproduces the original every-frame loop exactly (no-op on CUDA).
Measured on verified same/different pairs: dHash alone has a false-
positive floor for same-style anime frames (distinct shots at distance
<=10 and even <=6 with different color content). Same-shot broadcast
replays are pixel-twins: near-zero color-hist distance and low aHash
distance too. Requires ALL three gates, no transitive chaining.
Verified failure with 10/64 threshold + transitive chaining: a 90-image
'group' contained six different scenes (blonde outdoors, storm school,
night bedroom, manic grin, cat street, dining room) — chains of
similar-but-distinct frames glue unrelated shots together. Strict
linkage requires every member within threshold of every other.
Default quarantine dir renamed duplicates/.
Recurring OP/ED animation shots and eyecatch cards reappear in every
episode, so scene-gated extraction saves one copy per broadcast.
Reports groups with a keepsake suggestion; --move quarantines
redundant members to dupes/ (reversible). CPU-only perceptual hashing,
paranoid default threshold 10/64 bits.
Dry-run default with CSV report; --move relocates to has-text dir
(reversible). Flags on >=3 confident lines or one box >=3% frame area;
1280px downscale so big overlay cards hit and incidental small detail
doesn't.
Real-run evidence: the transformation-emblem false positive (frame 1583
of the OP, 717x857, aspect 0.84) is geometrically face-shaped and
passes every box gate; OP/ED music videos are dominated by exactly that
kind of stylized graphics. Episodes carry the character close-ups a
grounding dataset needs. Verified on the second run: feather storm
(frame 29, area .64) now correctly rejected by the area cap.
Tested against real failure samples from the v2 run: full-frame feather
storm (area .64) and wide effect blob (area .70) now rejected; normal
and close-up faces pass. Note: stylized OP/ED emblems are geometrically
face-shaped and NOT catchable this way — documented, CCIP gate is the
answer for those.
Ultralytics select_device() rewrites CUDA_VISIBLE_DEVICES on first
predict() when the CUDA context is uninitialized: --gpu 1 silently
became a two-GPU cuda:0,1 context that OOMed on GPU0 (Strata's card).
Initializing torch and touching cuda once after setting CVD locks the
pin; both scripts now use device cuda:0 within the pin.
Original saved any frame with a big COCO person box (heads, hands,
shoes). Switches to yolov8x6_animeface (HF: Fuyucchi), keeps the
scene-change gate, adds --gpu pinning via CUDA_VISIBLE_DEVICES before
torch init, --download-model, --preview-dir QC mode, optional edge
margin and min face-area fraction.