← Back to projects

Codex Creator Challenge · Solo prototype

MemoryLens

MemoryLens takes a live camera feed, compares detected faces with enrolled profiles, and uses quiet-mode rules to decide when to play a spoken reminder.

Python · ONNX Runtime · SCRFD · MobileFaceNet · SQLite · Raspberry Pi GitHub repo Challenge
Local matching, profiles, and speech run without a cloud API
12 centered, high-confidence samples in the default enrollment flow
48 unit tests for the core data and control logic
Once a familiar face is announced per session, then quiet

Built with Codex, then tested by hand

I made MemoryLens for the Handshake x OpenAI Codex Creator Challenge and used Codex throughout development. I kept the repository public as an example of building and narrowing an AI-assisted prototype, not as a production-ready face-recognition claim.

The camera, model, database, and speech paths were exercised on a computer. I also configured and ran the project on a Raspberry Pi; the deployment helper remains experimental rather than a supported installation path.

How a frame becomes a reminder

  1. 01 Capture

    A webcam or Pi camera provides a frame.

  2. 02 Detect + align

    SCRFD finds a face and five landmarks line it up.

  3. 03 Encode + match

    MobileFaceNet creates an embedding and compares it with enrolled records.

  4. 04 Speak

    A local TTS backend can read the matched name and relationship.

The software

The project is a Python command-line application with separate flows for detection, embedding, enrollment, profile editing, and live recognition. During enrollment, the camera automatically captures centered, high-confidence samples at set intervals. Matching compares each new embedding with the local database using cosine similarity.

The default quiet mode announces each known person once per session and then stops. A manual input can repeat the visible matches. I also added editable text profiles so a name, relationship, or note can change without enrolling the face again. Unit tests cover the database, synthetic matching logic, enrollment rules, profile sync, and announcement control. The live model, camera, TTS, and Pi paths were checked manually rather than covered by those tests.

What I took away

Most of my work went into keeping profile data local and splitting the recognition flow into pieces I could test. The final setup pairs small ONNX models with SQLite, plus separate commands for enrollment, recognition, and profile editing.

The quiet-mode logic ended up being one of my favorite parts. Known matches speak once, unknown faces stay silent, and a manual input can repeat what is currently on screen. The cue stays brief instead of narrating continuously.