AnonVision

A desktop privacy protection system that uses YuNet deep learning to detect and selectively anonymize faces in real-time—giving journalists, researchers, and educators granular control over who remains visible and who is protected.

"I need to protect confidential sources in protest photos but keep the journalist visible."

— User Research Participant

This project represents a complete systems design journey: from understanding real-world privacy requirements through independent ML research, architectural iteration, and the development of a production-ready Tkinter application with CPU-deterministic inference.

  • Role Systems Designer & ML Engineer
  • Timeline Sep 2025 – Present
  • Tech Stack Python, OpenCV, YuNet DNN, Tkinter, face_recognition
  • Performance CPU Real-Time, 99%+ Detection Accuracy
  • GitHub View Repository →

Overview

AnonVision is a privacy protection system for images that provides real-time ability to detect and obscure faces while offering selective control over which individuals remain visible.

99%+

Detection Accuracy

CPU

Real-Time Processing

3

Panel Interface

0

Cloud Dependencies

Application Workflow

Left panel displays detected faces as selectable thumbnails → Center canvas shows live preview with bounding boxes → Right panel contains protection controls and anonymization settings. Users detect faces, preview results, toggle protection on specific individuals, adjust blur parameters, and export publication-ready imagery.

Problem Landscape

The need for privacy-preserving media processing has never been more urgent. Billions of images are shared online daily, and the tension between transparency and privacy creates real ethical dilemmas.

Journalism

Reporters covering protests, conflict zones, or sensitive investigations need to share visual evidence while protecting sources from identification and potential retaliation. All-or-nothing anonymization doesn't work.

Academic Research

IRB protocols increasingly require face anonymization in published research imagery. Researchers need tools that are reliable, reproducible, and don't require manual pixel-by-pixel editing.

Corporate & Legal

GDPR and similar privacy regulations create compliance requirements. Manual anonymization doesn't scale; automated solutions with audit trails do.

Surveillance & Public Safety

Organizations reviewing security footage face the challenge of protecting innocent bystanders while preserving relevant subjects for investigation.

Common Thread

Users need automation for efficiency combined with granular control for accuracy. They need to trust the detection system while maintaining override capability. Professional-grade output without professional-grade complexity.

Research & Discovery

This project began as a collaborative exploration with my professor, but evolved into an independent deep-dive into computer vision, face detection architectures, and desktop application development.

Independent Learning Path

  • • OpenCV documentation deep-dive
  • • DNN detector implementation research
  • • Academic papers on YuNet architecture
  • • Tkinter constraint systems mastery

V1 → V2 Transition

V1 (Haar Cascade): ~70% accuracy. Profile faces, partial occlusions, and challenging lighting produced unacceptable miss rates.

V2 (YuNet): 99%+ accuracy. Handles angled faces, variable lighting, partial occlusions. Runs efficiently on CPU.

Technical Architecture

Detection Pipeline

YuNet DNN as primary detector—high accuracy, fast CPU runtime, robust handling of angled faces.

  • • Standardized preprocessing
  • • OpenCV DNN module inference
  • • Confidence threshold filtering
  • • Structured bounding box output
  • • Haar Cascade fallback available

Whitelist System

Protecting specific individuals from anonymization via face matching.

  • • JSON persistence for protected face data
  • • 96×96 thumbnail generation for UI
  • • face_recognition embeddings (high accuracy)
  • • ORB-based feature matching (fallback)
  • • Threshold-based matching logic

Anonymization Engine

  • • Blur intensity (kernel size)
  • • Blur passes (repeated application)
  • • Expansion percentage (beyond bounding box)
  • • Gaussian blurring for natural results
  • • Per-face protection toggles

System Reliability

  • • CPU-only deterministic mode
  • • OpenCL disabled for consistency
  • • Dependency validation before launch
  • • Clear error messaging
  • • Graceful degradation

UI/UX Design Rationale

Dark Mode

Privacy tools process sensitive imagery. Dark mode reduces visual fatigue during extended sessions and creates professional aesthetic.

Three-Panel Layout

Left: "What faces?" Center: "What result?" Right: "How to control?" Left-to-right workflow mirrors natural reading patterns.

Accessibility

High contrast ratios, keyboard navigation, text-based status feedback, appropriate touch-target sizing.

Tkinter Decision

Chose Tkinter over PyQt deliberately. While PyQt offers richer widgets, Tkinter provides zero-dependency deployment—critical for a tool that needs to work without complex environment setup. Built ProDesign class for modern dark mode aesthetics.

What Worked & What Failed

What Worked

  • ✓ YuNet accuracy: 70% → 99%+ transformation
  • ✓ Tkinter layout scales across screen sizes
  • ✓ Thumbnails dramatically improved UX
  • ✓ Per-face toggle system works intuitively
  • ✓ CPU deterministic behavior ensures reproducibility

Challenges

  • ✗ MediaPipe reliability → removed for YuNet-only
  • ✗ face_recognition dlib compilation issues
  • ✗ Tkinter canvas resize behavior
  • ✗ Blur bleeding into protected regions
  • ✗ Small screen layout cramping

Lessons Learned

Keep Detectors Modular

Ability to swap detection backends (Haar → YuNet) without rewriting the app saved the project. Abstraction enables future upgrades.

Build UI Before Features

Building detection first then wrapping UI created friction. Building UI shell first and plugging in functionality would be cleaner.

Single Well-Tuned Detector

Combining Haar, MediaPipe, and YuNet created debugging nightmares. A single, well-tuned detector outperforms a committee of mediocre ones.

Clear Error Handling

Users encountering cryptic Python exceptions abandon software immediately. Human-readable messages and graceful degradation transformed UX.

Final System

The final AnonVision application delivers a complete privacy protection workflow: load any standard image format, YuNet identifies all faces with 99%+ accuracy, detected faces appear as selectable thumbnails, adjustable Gaussian blur with configurable intensity, and export produces publication-ready imagery.

AnonVision Application Screenshot

Future Roadmap

Near-Term

  • • User testing with journalists/researchers
  • • Mask-based anonymization
  • • Video pipeline extension
  • • Batch mode for high-volume

Medium-Term

  • • Distributable installer packaging
  • • Optional GPU acceleration
  • • Streamlined onboarding

Long-Term Vision

  • • Comprehensive media privacy toolkit
  • • License plates, documents handling
  • • Journalism workflow integration

Reflections

AnonVision represents the intersection of systems design, machine learning engineering, and human-computer interaction that defines my approach to building technology.

The most valuable lesson was the importance of modular architecture. When Haar Cascade proved inadequate, clean separation between detection and UI layers allowed me to swap in YuNet without rebuilding everything. Good architecture isn't about predicting the future—it's about making the future changeable.

User research fundamentally shaped the product. The whitelist feature—now central to AnonVision's value proposition—came directly from interviews with journalists who needed selective protection.

Core Capability

I can take a complex, cross-domain challenge—privacy-preserving computer vision with professional UX—and deliver a working system through independent research, iterative development, and relentless focus on real user needs.