PII anonymization
A privacy pipeline that finds faces and license plates where models usually fail
Find every face and license plate in an image, and blur them so they can't be read. I owned the whole model evaluation, developed the detection pipeline, and designed and built the tool people use to run it. It started as an experiment and became a finished tool.

At a glance
- Finds
- Faces and license plates
- Hard cases
- Motion blur, aerial views, low light
- Models tried
- Open source, and ones I trained
- Judged against
- Ground truth I curated myself
- Output
- Blurred past recovery
The problem
Detecting a face in a sharp, well-lit photo is easy. The real work is everything else.
Open-source detectors do well when the light is good and the subject stands out from the background. Real frames are rarely that kind. Most of my effort went into the gap between the demo image and the real one, because that gap is where privacy fails.
The frames don't come from one kind of camera either. Vehicle cameras, drones and handhelds, at different speeds, times of day and weather, all end up in the same dataset — and tuning a pipeline until it is excellent on one of them is a good way to make it quietly worse on the rest. The job was finding the setup that holds across all of them at once.
Hard frames
Motion blur
A fast-moving camera smears the frame and leaves only fragments of a plate or face. Those fragments still have to be found.
From above
Aerial imagery shows faces and plates nothing like the front, side and rear views of a vehicle camera, and needed its own handling.
Low light and noise
Dark, noisy frames are enhanced and denoised before detection, and directional sharpening recovers detail lost to motion.
Small in frame
A face at the end of the street or a plate a few dozen pixels wide carries almost no signal, and still has to be caught.
Evaluation
01
Build the ground truth
I curated ground-truth datasets to compare every model and every pipeline change against.
02
Try every candidate
Open-source models including RetinaFace and EgoBlur, models I trained myself, and separate experiments for license-plate detection.
03
Benchmark by condition
A benchmarking system showed exactly where each model did well and where it failed, across different kinds of data and conditions.
04
Build the pipeline
The result is a custom pipeline with its own preprocessing and post-processing, refined through many rounds of tuning.
05
Re-run the whole benchmark
Every change went back through all of it, so a gain on one kind of frame could never quietly cost accuracy on another.
The finished pipeline produces far fewer false positives and false negatives. In privacy work that's what counts: a miss leaks a face, and a false alarm ruins a frame.
The tool
The pipeline is the hard part, but people don't want to run a pipeline. They want to drop in a dataset and get it back clean.
A dataset at a time
Upload a set of images and leave it. Detection runs in the background across the whole thing.
Blur on your terms
Blur method and strength are configurable, from a deliberately heavy default.
Redaction that stays redacted
That default is chosen so what's under the blur can't be reconstructed from the image.
I designed and built the interface too, but it was the easier half. The pipeline underneath is where the real work went.