AI Wedding Culling System
Summary: An automated REST pipeline that evaluates massive bursts of wedding photos to filter out bad shots and group duplicates.
- Problem: Wedding photographers spend countless hours manually culling thousands of burst shots, wasting time identifying blurry images, closed eyes, and redundant frames.
- Solution: Deployed an automated pipeline that evaluates images using facial landmark detection to reject poor photos (motion blur, closed eyes). It also utilizes embedding clustering to group near-duplicate burst shots and specialized models to preserve images of enrolled VIPs.
- Tech Stack: Python, FastAPI, YOLOv8n, MediaPipe FaceMesh, CLIP ViT-L/14, OpenCV, MTCNN.
- Outcome: Drastically reduced manual review time for photographers by reliably automating the rejection of low-quality images and intelligently organizing vast datasets.
Pipeline Architecture
flowchart TD
A["📂 Raw Photo Folder\n(1000+ images)"] --> B["FastAPI Endpoint\n/api/v1/cull"]
B --> C["Stage 1: Face Detection\n(YOLOv8n)"]
C --> D{"Faces\nDetected?"}
D -->|No| E["Flag: No Subject"]
D -->|Yes| F["Stage 2: Quality Check\n(MediaPipe FaceMesh)"]
F --> G{"Eyes Open?\nNo Blur?\nGood Exposure?"}
G -->|Fail| H["🗑️ Reject Bin"]
G -->|Pass| I["Stage 3: Embedding\n(CLIP ViT-L/14)"]
I --> J["L2 Distance\nClustering"]
J --> K["Duplicate Groups\n(Near-identical bursts)"]
K --> L["Select Best\nper Group"]
I --> M["Stage 4: VIP Match\n(FaceNet + MTCNN)"]
M --> N{"Match with\nEnrolled VIP?"}
N -->|Yes| O["⭐ VIP Priority\n(Always Keep)"]
N -->|No| L
L --> P["✅ Final Curated Set"]
O --> P
- What I learned: Mastered chaining multiple heavy computer vision models in a FastAPI backend and handling complex vector mathematics (L2 distance) for accurate image clustering.
