feat(presence): flood-fill presence mode
Add PresenceMode::flood alongside the default track_extent. In flood mode the result sink snaps each presence claim to the shot it sits in, so an actor seen once anywhere in a shot is reported for the whole shot [prev_boundary, next_boundary]. This trades precision for recall against X-Ray's per-scene cast granularity and is a toggleable knob for the optimizer to weigh rather than a default. Boundaries come from the frame stream, now carried through SceneAnnotation (is_cut and is_scene_boundary). Flood prefers TransNetV2 shot boundaries when a scene detector populated them, otherwise falls back to the always-on histogram cuts (camera_position_change_detector); with no boundaries it degrades to track_extent per claim. The is_scene_boundary path stays dormant so an out-of-process scene detector can be revived later without re-wiring. Selected with --presence-mode flood|track_extent (default track_extent), so existing output is byte-for-byte unchanged. The dump_embeddings header note records why TransNetV2 scene detection is not run in that process.
This commit is contained in:
@@ -11,6 +11,20 @@ enum class Verbosity {
|
||||
standard, // per-frame detail: bbox, similarity, unknowns logged
|
||||
xray, // Jellyfin-Xray format: {"second": ["Actor", ...], ...}
|
||||
};
|
||||
|
||||
// How a track's accepted frames become a reported presence window.
|
||||
enum class PresenceMode {
|
||||
// A claim IS its track's [first_seen, last_seen] (AR-012/AR-013). The
|
||||
// default and the only mode whose semantics the register validated.
|
||||
track_extent,
|
||||
// Flood-fill: snap each claim to the shot it sits in, so an actor seen once
|
||||
// anywhere in a scene is reported for the whole scene [prev_boundary,
|
||||
// next_boundary]. Trades precision for recall against X-Ray's per-scene cast
|
||||
// granularity. Snaps to TransNetV2 shot boundaries (is_scene_boundary) when a
|
||||
// scene detector populated them, else to the always-on histogram cuts
|
||||
// (is_cut). With no boundaries at all it degrades to track_extent per claim.
|
||||
flood,
|
||||
};
|
||||
// debug verbosity = compile with -DSAE_DEBUG → scene_analyze_debug binary
|
||||
|
||||
struct Config {
|
||||
@@ -115,6 +129,10 @@ struct Config {
|
||||
// fallback everywhere, which is at least the same wrong number in every
|
||||
// stage. See identity_matcher_node.hpp.
|
||||
|
||||
// ── Presence derivation ──────────────────────────────────────────────────
|
||||
// How accepted frames become a reported window. flood requires scene_detect.
|
||||
PresenceMode presence_mode{PresenceMode::track_extent};
|
||||
|
||||
// ── Cut detection ────────────────────────────────────────────────────────
|
||||
float cut_threshold{0.70f}; // grayscale histogram correlation below this → hard cut
|
||||
|
||||
|
||||
Reference in New Issue
Block a user