Demo · On-device inference

Volkus Scan
on-device demographic estimation

The same on-device model stack that powers volkus.net. Your camera feed never leaves this page — MediaPipe FaceMesh + ONNX models running in WebAssembly, in your browser.

WebAssembly getUserMedia 4 ONNX models · ~35 MB 0 uploads

Live scan

Camera permission is requested only when you press this.
Idle — models are not downloaded until you start.
camera off
Estimated age
rolling avg
bracket —
Gender estimate
confidence
Skin tone
Ethnicity estimate
confidence
Scan telemetry
readings 0 · stability — · elapsed 0.0s

Privacy

Third-party bytes: the MediaPipe FaceMesh runtime and the ONNX Runtime WASM binaries are fetched once from cdn.jsdelivr.net. Those are code downloads — no image or result data is ever sent anywhere.

How it works

1
MediaPipe FaceMesh tracks 468 landmarks per frame and gives a face bounding box (padded 12%).
2
The box is cropped to a 224×224 RGB patch. A slightly wider crop (+22%) is used for ethnicity, which benefits from hair and jaw context.
3
Pixels become float32 CHW tensors, ImageNet-normalised (mean .485 .456 .406, std .229 .224 .225).
4
Four ONNX models run per reading: race_fp32 (7-class), gender_fp32 (2-class), age_regr_fp32 (scalar regression), and age_fused_fp32 — a regressor conditioned on a 9-dim one-hot of the predicted race + gender.
5
Skin tone is sampled separately in plain JS: a 3×3 pixel average at four forehead landmarks (10, 67, 297, 9), classified into a Fitzpatrick-style zone via an ITA-weighted score.
6
Readings are collected at ~2/sec and rolling-averaged over the ~10-second scan window. Stability is 1 - σ/15 on the age series — a single frame is noisy, the average is not.

Model payload is roughly 35 MB total (10.2 MB fused-age, 8.9 MB age, 8.9 MB gender, 8.9 MB race). They are static same-origin files, so the browser caches them — the first scan pays the download cost, later scans start immediately.