Bali was chosen because the TRECVID DVU set ships character mugshots, but its reference crops are unusable at scale: median detected face 27 px against a 69 px maximum, so every reference was upscaled 4x or more past what the embedder was trained for (AR-011). A 66 px floor left 2 of 69 references; no threshold exists that both keeps the faces in distribution and leaves enough of them to calibrate. SuperHero is 69 px median and 241 px max. Its gallery builds at a 66 px floor with 14 references over 5 characters, and calibrates on its own (a=15.2867 b=-4.98633, 100% train accuracy) instead of borrowing constants. Measured on the fused 17-minute film, one stream rather than per-scene clips so presence windows cross real scene boundaries as SR-002 intends: precision 1.00, recall 0.65, F1 0.79 — 13 true positives, 0 false positives, 7 misses. Every out-of-gallery character was declined rather than forced onto a nearest match. The misses are the short scenes (14 s, 38 s, 27 s), consistent with per-track accumulation needing sightings. - build_gallery gains --min-face-px, filtering the *detected face* rather than the crop. The DVU images are scene crops, not mugshots, so crop dimensions say nothing about face scale. A poisoned reference is permanent in a way a bad frame is not: it corrupts every future match against that identity. - scripts/fetch_dvu.sh fetches mugshots, scene graphs and segmentation for any DVU film. NIST names the same film three different ways, so KG_DIR and KG_FILE are overridable rather than derived. This exists as a script because the first copy of this data was assembled ad hoc in /tmp and was lost with it, taking the working gallery along. - Replay fixtures move to the artifact registry: push/pull_artifacts.sh gain a replay-fixtures target, and tests/fixtures/dumps/.gitignore keeps them out of git. superhero.h5 is ~9 MB and regenerating it needs the film, the models and a GPU — none of which CI has. The gallery ships with the dumps, since a dump only replays against the gallery it was produced with. - AR-012 and AR-013 coverage is ported onto the new fixture rather than dropped with the Bali cases: 12369 assertions, up from 7991, since the film is an order of magnitude larger than the clips. Suite: 15679 assertions, 101 test cases. TRACES: AR-011, AR-012, AR-013 | VR-001, VR-005 | SR-002
61 lines
2.8 KiB
Bash
Executable File
61 lines
2.8 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# Regenerate superhero_offset_200s.flac — the real-audio fixture behind VR-014, the
|
|
# audio-signature offset-recovery validation.
|
|
#
|
|
# sh make_offset_fixture.sh /path/to/clips
|
|
#
|
|
# Why real audio and not a second synthetic tone: jray_audio_v1_tone.flac pins
|
|
# the *arithmetic* (IR-005) and is deliberately built so every band and every
|
|
# energy class appears. It cannot answer the question VR-014 asks — whether the
|
|
# peak-bin sequence of ordinary film audio is distinctive enough that sliding
|
|
# one signature against another finds the true alignment and only the true
|
|
# alignment. Tones are pathologically easy for that; dialogue and score are not.
|
|
#
|
|
# Source: scene clips from SuperHero (TRECVID DVU development set), the corpus
|
|
# this repo already uses for the replay fixtures — tests/fixtures/dumps/superhero.h5
|
|
# are dumps of these same clips. Each is under the 120 s window on its own
|
|
# (29-77 s), so they are concatenated in scene order to make a source long
|
|
# enough that a 120 s window can slide inside it.
|
|
#
|
|
# 200 s is chosen, not arbitrary: the window is 120 s and the match search is
|
|
# capped at +/-600 frames (~55.7 s), so a source of 120 + 56 s is the shortest
|
|
# one that can place two windows at the edge of the cap. The 200 s here leaves
|
|
# room to go past it as well, which is what lets the test check that an
|
|
# out-of-range offset is declined rather than guessed.
|
|
#
|
|
# Encoded mono at 11025 Hz, 16-bit, which is exactly what the signature decodes
|
|
# to anyway. That keeps a 200 s fixture at ~2.4 MB instead of ~20 MB, and makes
|
|
# every trim below sample-exact — the test measures offset recovery, not the
|
|
# resampler, which tests/test_audio_signature.cpp already covers (UT-103).
|
|
#
|
|
# FLAC because it is lossless: the decoded PCM is the same on every machine, so
|
|
# a signature computed from this file is reproducible. A lossy fixture would
|
|
# make the measurement depend on the decoder version.
|
|
#
|
|
# sha256 of the committed file:
|
|
# 4a952e46a090a9acd9eae56996250ec03e08e0d04ee139ac0a42f1690a536c83
|
|
# A regenerated file that hashes differently means the source clips or the
|
|
# encoder changed, and VR-014's recorded numbers should be re-measured — the
|
|
# offsets will still be exact, but the scores are this audio's.
|
|
|
|
set -eu
|
|
|
|
CLIPS="${1:-../../../../hero}"
|
|
OUT="$(dirname "$0")/superhero_offset_200s.flac"
|
|
LIST="$(mktemp)"
|
|
trap 'rm -f "$LIST"' EXIT
|
|
|
|
for scene in 13 27 28 31 46; do
|
|
clip="$CLIPS/SuperHero-$scene.webm"
|
|
[ -f "$clip" ] || { echo "missing clip: $clip" >&2; exit 1; }
|
|
echo "file '$(cd "$(dirname "$clip")" && pwd)/$(basename "$clip")'" >> "$LIST"
|
|
done
|
|
|
|
ffmpeg -nostdin -v error -y -f concat -safe 0 -i "$LIST" \
|
|
-vn -t 200 -ac 1 -ar 11025 -sample_fmt s16 \
|
|
-c:a flac -compression_level 12 "$OUT"
|
|
|
|
echo "wrote $OUT"
|
|
sha256sum "$OUT" 2>/dev/null || shasum -a 256 "$OUT"
|