Back to floatbird
Live · browser · on-device

faceprint

A face recognizer never stores your photo. It stores a vector of about 512 numbers, your faceprint. Drop in a face and watch a generic one get rebuilt from that vector alone, side by side with yours, with a similarity meter showing how close the rebuild still lands. Then grab the numbers and scrub them by hand and watch the face change live. Everything runs in the tab; the photo never leaves your device.

Why it exists

“It’s just an embedding, so it’s anonymous” is one of the most common things said about face recognition. And it is false. The 512-number faceprint that systems store and match against is enough to walk back into a recognizable face. faceprint makes that reversibility something you can feel: it is the inverse of recognition rather than recognition itself. It matches you against no database and names no one. It only ever touches the face you bring, entirely on your device, which is exactly the capability the cloud face services exist to refuse.

How it works

Your photo is detected and aligned with SCRFD and run through ArcFace (a MobileFaceNet recognizer), which outputs the 512-number embedding, the same kind of vector a real recognition system stores. A small decoder, trained for this page, reads only that vector and rebuilds a generic face that lands on almost the same embedding. It never sees your pixels.

The trick is how the decoder was trained. A face embedding carries identity but almost none of a photo’s lighting, pose, or background, so a decoder trained to reconstruct pixels tops out at a weak match. This one was trained against the round-trip objective directly: the rebuilt face is re-run through the recognizer and pushed until its embedding matches the input faceprint. The result re-identifies as the original well above a recognizer’s “same person” line, while looking like a recognizable, slightly dreamlike stranger, which is the point made visible.

The similarity meter re-runs the recognizer on the rebuild and shows the cosine of its faceprint against yours. Then you scrub. The Raw tab gives you all 512 numbers as sliders that re-render the face as you drag; the Guided tab gives labelled directions (age, smile, glasses…) learned from face attributes: curated views of the vector, not single dimensions. Detection, alignment, the recognizer, and the decoder all run in the tab via ONNX Runtime Web, with a WebGPU fast path and a WebAssembly fallback. No photo, embedding, or pixel is ever uploaded; reload and it is gone.