LibrariesRustONNX RuntimeortcrossbeamArcSwap
vigilo-core
The Rust proctoring engine underneath Vigilo: camera frames in, fused violation events out. No UI, no webview.
vigilo-core (formerly deepscreen-detect) is the detection engine extracted out of Vigilo and published as a standalone crate. It has zero UI, browser, webview, or Tauri dependencies — frames go in, proctoring decisions come out.
The pipeline
Five models on independent worker threads, each at its own cadence, feeding one fusion layer:
- Face — YuNet 2023mar at 15 Hz → bounding box + 5 landmarks.
- Head pose — MobileNetV3-Small at 15 Hz → yaw, pitch, roll.
- Gaze — MobileGaze (MobileOne-S0) at 15 Hz → gaze angles + the eye-in-head vector.
- Objects — YOLOX-Nano at 1 Hz → phone, book, laptop.
- Identity — ArcFace
w600k_mbfat 0.2 Hz → 512-d embedding check. - Fusion — the temporal decision engine, every tick → debounced violations.
Why it's built this way
- Eye-in-head gaze. Subtracting head pose from raw gaze isolates where the eyes are pointing independently of where the head is. Someone glancing down at a phone on the desk without turning their head still registers.
- Pure fusion.
FusionEngine::stepis a pure function of its inputs and a discrete timestamp, so replaying a recording produces bit-identical violations. Threshold tuning became a replay loop instead of a re-inference loop. - Triple-buffered frame bus.
ArcSwappluscrossbeam-channellets slow inference workers drop stale frames rather than block the camera or the render loop. - Hot-reloadable config. Thresholds and cadences change without restarting workers or recompiling.
detect-cli, the bundled harness, benchmarks models (p50/p95), runs live camera evaluation, records signals to JSONL, and replays them through fusion with no model execution at all.