Automated Blur Video Pipeline
Detects, tracks, and blurs faces in video automatically. Built for media teams that need privacy compliance without frame-by-frame manual tracking. Pose estimation and a Kalman filter tighten the face tracking that InsightFace provides.

Why it exists
Most face blurring is a confidence slider. Turn it down and it smears over knees, socks, and shoulders. Turn it up and it walks straight past a face in profile. Neither is much use when the whole point is to hand the file to someone else. So this one does not trust a score on its own, it makes the detector prove itself before a single pixel moves.
The evidence gate
A face claim only becomes a blur candidate when all three conditions hold at once.
- Anchored to anatomy The claim has to sit inside a detected head box, or on the head side of the torso axis the pose model draws. A patch of skin floating in the middle of a frame never qualifies.
- Corroborated by a second cue Something else has to agree, an eye, nose, or mouth detection, SCRFD landmarks, or pose keypoints. One model saying face on its own is not enough to earn a blur.
- Not vetoed A contradicting hand or foot detection covering the same region kills the claim. This is what keeps knees, shoulders, and socks unblurred.
How it runs
Two passes, and nothing is painted until the second one.
- Pass one, analysis Detection, then pose estimation, then tracking. Kalman filtering with BYTE-style association follows each face across frames, so a head that turns away and comes back is still the same track.
- Pass two, render Tracklet pruning against the evidence ledger drops the false positives, gaps get bridged and interpolated, zero-phase smoothing settles the positions, and only then does anything get painted.
- Review before render A dialog lists every track it found. Enable or disable them one by one, or draw a manual blur region for something the models never had a chance of catching.
- Destructive by design A flat-colour mosaic over a Gaussian pass, painted into the pixels. There is no reversible transform and no key, because a blur you can undo is not a privacy tool.
What is doing the looking
Four small models, around 82 MB in total, fetched the first time you run it.
- YOLOv9-Wholebody17 Primary detector, around 28 MB. Bodies, heads, faces, facial parts, hands, and feet in one pass.
- SCRFD Around 17 MB. A second, independent face witness with landmarks, used for corroboration rather than as a primary source.
- RTMPose Around 25 MB. Body keypoints, which give the anatomical anchor the evidence gate checks against.
- NudeNet Around 12 MB. An offline cross-model witness for verification.
Running it
Python 3.12+ with PyQt6 for the interface and ONNX Runtime for inference. The execution provider is picked automatically, DirectML first, then CUDA, then ROCm, then CPU, and blur rendering uses OpenCV OpenCL/UMat or PyTorch CUDA depending on the card. Export runs through streaming ffmpeg, so files over 4 GiB are safe, with the source audio stream-copied across untouched.
All inference and rendering happen locally. The network is touched once, to fetch the four small models, and never again.