pulp  /pʌlp/  ·  noun

1. A soft, moist, shapeless matter. The inner moist part of fruit. Something cheap but lurid — designed for maximum impact.

2. (adj.) Of or denoting popular entertainment in a simplified or sensationalized form. See: Tarantino. See: this portfolio.

— Merriam-Webster, abridged for dramatic effect

← Back

Case Study · AI / Computer Vision

RCAF FACIAL
RECOGNITION
SYSTEM

Applied research for the Canadian Air Force Museum. A two-stage AI pipeline — Real-ESRGAN super-resolution into ArcFace recognition — built to identify personnel in a 1,000-image archival photograph collection.

PythonReal-ESRGANArcFacePostgreSQLPowerShellCUDA
94.7%
Face match accuracy
1,000+
Archival images processed
2-stage
AI pipeline (upscale → match)
0
Prior art — client said it was impossible

Architecture

THE PIPELINE

01

Image Ingestion

PowerShell script walks the archival directory, normalises filenames, extracts EXIF metadata, and loads records into PostgreSQL. Handles duplicates and corrupt files gracefully.

PowerShellPostgreSQLNpgsql
02

Super-Resolution

Real-ESRGAN (4× upscale) runs on each image. Historical photos averaged 240×180px — far below the minimum face detection threshold. Upscaling brings them to 960×720px before recognition.

Real-ESRGANPythonCUDA
03

Face Detection

MTCNN detects and aligns faces in the upscaled images. Alignment is critical — ArcFace embeddings are sensitive to pose. Only confident detections (>0.92 confidence) pass through.

MTCNNPythonfacenet-pytorch
04

Embedding + Matching

InceptionResNet (ArcFace-trained) generates 512-dim embeddings per face. Cosine similarity search across the database returns ranked candidates. Threshold tuned to minimise false positives.

ArcFaceInceptionResNetcosine similarity
05

Result Storage

Match results, confidence scores, and bounding box metadata stored in PostgreSQL. Reviewers access results via a simple query interface — no frontend needed for the client's workflow.

PostgreSQLpsycopg2

Challenges

WHAT MADE IT HARD

Problem

Photo quality

Archival photos from the 1940s–80s. Low resolution, film grain, sepia tone, physical damage. Standard recognition pipelines fail completely below 100px face width.

How we fixed it

Real-ESRGAN pre-processing before any recognition step. Custom CUDA pipeline to batch-process 1,000 images overnight.

Problem

No ground truth

The museum had no labelled dataset. We couldn't train or fine-tune — we had to use a pre-trained ArcFace model and tune the matching threshold manually.

How we fixed it

Built a small validation set from photos with known subjects. Iterated on the similarity threshold until false positive rate was acceptable for archival review.

Problem

Client expectations

The client was told by two other vendors this was "not feasible." Starting from a baseline of zero trust means every demo has to work.

How we fixed it

Delivered a live demo on real museum photos in week 2. 94.7% accuracy on the final validation set. The client called it impossible before we delivered it.

Next case study

MedicHelper Platform →
All Projects