Jaipur--°C
Back to Projects
In-progressReactNode.jsExpress+6 more

Fyndr — AI-Powered Event Photo Sharing

Production-grade event photo-sharing platform for photographers and guests: SCRFD face detection, ArcFace 512-d embeddings, per-event FAISS indexing, multi-stage image processing pipeline, and privacy-first ephemeral search.

Timeline

2025 — 2026

Role

Solo — full stack architecture, ML inference pipeline, frontend, vector search

Status
In-progress

Technology Stack

React
Node.js
Express
Python
Flask
InsightFace
FAISS
MongoDB
Docker

Key Challenges

  • Balancing face recognition accuracy with low-latency inference on cost-effective CPU infrastructure
  • Filtering false positives (crowd backgrounds, motion blur, extreme angles) before computing vector embeddings
  • Designing high-throughput bulk uploads and multi-resolution image derivatives without blocking web workers
  • Preserving guest privacy with ephemeral selfie processing and automated event lifecycle expiration

Key Learnings

  • Pre-filtering by Laplacian blur variance (>80) and face bounding box size (>45px) cuts 25% false positives and saves 30% embedding computation
  • Downsampling high-resolution 45MP event photos to 640px analysis derivatives via libvips cuts pixel processing by 50× while staying in SCRFD detection sweet spot
  • Per-event FAISS IndexFlatIP vector indexes provide sub-20ms exact cosine similarity searches across thousands of face vectors with zero cross-event index pollution
  • A composite re-ranking score (0.7 cosine similarity + 0.2 detection confidence + 0.1 normalized face size) significantly improves guest photo recall in variable event lighting

Overview

Weddings and corporate events regularly generate 5,000 to 50,000 high-resolution photos (often 10 GB to 50 GB+). Traditional delivery forces guests to wait weeks for a massive ZIP archive or endlessly scroll through tens of thousands of candid shots to find themselves.

Fyndr solves this for photographers and guests through instant facial recognition:

  1. The photographer creates an event and uploads raw photos.
  2. Guests scan an event QR code and snap a single 3-second selfie on their phone (no app download or account creation required).
  3. The platform detects faces, generates 512-dimensional ArcFace vector embeddings, queries a per-event FAISS vector index, and immediately displays a personalized masonry gallery containing only photos that feature that guest.

Recognition & Search Pipeline

The image pipeline balances high recognition accuracy against compute cost by executing four specialized stages:

Photographer Upload (45MP RAW/JPEG)

libvips / Sharp (640px RGB Preview)

SCRFD Face Detector (320x320 Input)

Quality Filter (Blur, Size, Confidence)

ResNet-50 ArcFace (512-d L2-Normed)

FAISS Per-Event Index (IndexFlatIP)

Guest Selfie (Mobile Camera)

SCRFD Detect + ArcFace Embed

Query Vector (512-d)

FAISS Cosine Similarity Search

Re-Ranking Composite Scorer

Personalized Guest Gallery

Pipeline Stages Breakdown

StepEngineInput → OutputTechnical Purpose
1. Previewlibvips / sharp45MP (8 MB+) → 640px (300 KB RGB)Eliminates 50× raw pixel processing; targets SCRFD optimal detection scale
2. DetectionSCRFD-320 (buffalo_s)640×640 → Bounding boxes + 5 landmarksHigh-speed multi-scale face localization with Non-Maximum Suppression (NMS)
3. Quality GateOpenCV / NumPyCrop evaluationDiscards boxes with confidence < 0.6, dimensions < 45px, or Laplacian blur variance < 80
4. Alignment & EmbeddingResNet-50 ArcFace112×112 aligned crop → 512-d vectorPre-trained on WebFace600K; outputs L2-normalized vector embedding
5. Vector SearchFAISS (IndexFlatIP)512-d query → Top-48 matchesSub-20ms exact inner product search (O(N) dot products) over per-event vector space

Key Technical Decisions

1. 512-d ArcFace vs. 128-d Legacy Embeddings

Traditional web solutions rely on client-side 128-dimensional models (face-api.js or dlib), which suffer high false-positive rates in dimly lit banquet halls, profile angles, and crowded backgrounds. Switching to 512-dimensional ArcFace embeddings increased verification accuracy to 89.8% MR-ALL at FAR 1e-6, drastically minimizing false accepts.

2. Quality Gates Before Neural Embedding

Computing ArcFace embeddings on distant crowd background blur wastes valuable CPU/GPU cycles. Implementing three deterministic quality checks prior to feature extraction—detection confidence (>= 0.6), minimum face size (>= 45px), and Laplacian blur variance (>= 80)—eliminates 25% of background noise and saves 30% of embedding computation time.

3. Per-Event FAISS Vector Isolation

Rather than pooling face vectors from all events into a monolithic vector database, Fyndr maintains dedicated IndexFlatIP instances partitioned by event_id in /tmp/fyndr_faiss/event.index. This guarantees zero cross-event data leakage, simplifies cache invalidation, and keeps search queries sub-20ms.

4. Re-Ranking Composite Score

Raw cosine similarity can favor well-lit incidental background faces over slightly rotated foreground subjects. A composite ranking heuristic weights the match:

Score = 0.7 * CosineSimilarity + 0.2 * DetectionScore + 0.1 * (FaceSize / 2048)

Results are deduplicated per photo, retaining only the highest-scoring face match.

Privacy & Data Protection

  • No Guest Accounts: Guests access events via transient PIN/token sessions; no personal data or email is collected.
  • Ephemeral Selfies: Guest verification selfies are processed entirely in memory or temporary storage and deleted within 60 seconds of vector generation.
  • Automated Expiration: Event catalogs, vectors, and image caches automatically expire and are purged 90 days post-event.

Tech Stack Summary

  • Frontend: React 18, React Router, Tailwind CSS, Masonry Layout
  • API Backend: Node.js 20, Express, Mongoose, JWT, Multer
  • Machine Learning: Python 3.10, Flask, InsightFace (buffalo_s), ONNX Runtime, FAISS
  • Database & Storage: MongoDB 8.0, local filesystem / S3-compatible object storage

built by shiv ratan
© 2026. All rights reserved.