How the score is built: each tracked person gets a short personal baseline (their own normal movement, not a fixed global threshold). Risk is then scored against two distinct signatures, and the higher one wins: passive/instinctive — sustained stillness, in-place vertical bobbing, arms not breaking the surface — and active struggle — vigorous movement that isn't going anywhere (high motion, low net displacement), an upright rather than streamlined body position, and erratic arm agitation. An alert only fires after either pattern holds for ~1.5 seconds at high confidence, and every alert ships with the exact signal weights that triggered it.
A real limitation, stated plainly: the pose model (BlazePose/MediaPipe) was trained overwhelmingly on above-water, dry-land human imagery. Underwater footage — refraction at the surface, bubbles, partial submersion — is a genuine domain gap, and pose keypoints degrade on that kind of footage. Distinguishing genuine panic-driven struggle from vigorous but normal strokes (like butterfly) is also still an open problem here — the path-efficiency signal helps, but a production system would need a model fine-tuned on labeled real and simulated distress footage, which is exactly what the pilot-data feedback loop above (Confirm real / False positive) is for.