What it is

VIGIL-5 is not a fixed detector with a UI. It runs a closed loop — SEE → REASON → ACT → VERIFY — and spends compute only when the current view is not good enough: a resolution ladder, ROI zoom, forensic re-scan, rollback when verification fails, and human escalation after persistent ambiguity. Every frame emits one Pydantic-validated JSON record.

On the same 288-frame clip, a static 320 px detector runs at 216 FPS and catches 0% of the scripted events. VIGIL-5 runs at 24.8 FPS and catches 100%, with identity accuracy 0.999–1.000 and 36 ms CPU p50 per frame on four pinned x86 cores. That trade is the whole point: throughput is not the product metric.

Inspiration

Every face-pipeline demo looks perfect because it never shows the failure: the subject walks behind a pillar, the face is 40 px wide, the match is ambiguous — and the system silently returns a confident wrong answer. We had OpenCV 5, a synthetic concourse with occlusion, distance changes and one unknown visitor, and one question: what does a vision agent look like if "I am not sure" is a legal output?

What it does

Per frame, the agent emits detections, identity matches, quality metrics, the decision taken and the reason for it.

  • SEE — YuNet detection at the base resolution, Farneback motion ROI, face quality and a liveness proxy.
  • REASON — reason codes, not scores: low_resolution, low_quality, low_confidence, spoof_suspect, motion_anomaly, no_face_with_motion, unknown_identity, plus a CPU-budget check.
  • ACT — exactly one reversible action: step the resolution ladder (320→768), zoom an ROI, run a forensic scan (lower threshold + upscale + flip-TTA), or escalate to a human.
  • VERIFY — compare confidence, detection count, IoU and forensic consistency. If the action did not improve the frame, roll it back.
  • EMIT — validated telemetry and an annotated frame; incident records carry a digest, never a raw embedding.

Frame 166 is the clearest trace: motion reports z = 40.27 while YuNet returns zero faces at 640 px. Those two perception results select a forensic recovery scan, then an ROI zoom. Verification rejects the zoom (0 new detections), so the agent rolls back instead of hallucinating a face.

Built With

  • and
  • arm64/x86-dockerfiles
  • cloudformation
  • ecs-fargate-task-definitions
  • interleaved-and-repeated-(9+-reps/operator
  • terraform
Share this project:

Updates

Submission history