Anonimiseert gezichten live in je webcambeeld en stuurt het resultaat naar een virtuele camera. Bedoeld voor podcasts, interviews en livestream-events waarbij het publiek of gasten anoniem in beeld moeten blijven.
Kies daarna gewoon de virtuele camera als bron in OBS, Zoom, Teams, Google Meet, YouTube Studio enz.
- Gezichtsdetectie met YuNet (OpenCV), snel genoeg voor 1080p op een gewone laptop
- Tracking met de Hongaarse methode, zodat een gezicht een vast ID houdt en een korte detectie-misser het gezicht niet blootgeeft
- Vier anonimiseringsmodi: Overlay (eigen PNG, bijv. een logo), Pixelate, Blur, Black
- Twee vensters: bediening en een schaalbare preview
- Debug-kaders zie je alleen in de preview, nooit in de stream
ANON.mp4
| Je wilt… | Gebruik |
|---|---|
| Live webcambeeld anonimiseren voor OBS, Zoom, Teams of Meet | Face Anonymizer (desktop-app, deze pagina) |
| Hetzelfde, maar alleen in Meet, Zoom of Teams in de browser | Browserextensie |
| Een map vol foto's anonimiseren op je eigen computer | Foto Anonymizer (desktop-app) |
| Foto's anonimiseren zonder iets te installeren | Foto Anonymizer webtool |
| Opgeslagen video's, beeldreeksen (genummerde beelden) of losse foto's anonimiseren | Face Anonymizer for AV (desktop-app) |
| Met je telefoon filmen of fotograferen, met gezichten al afgedekt | Face Anonymizer Camera (Android en iPhone via de browser, of als Android-app) |
Alle tools gebruiken hetzelfde gezichtsmodel en werken volledig lokaal: er gaan geen beelden of video's naar een server.
Eenmalig in een terminal, vanuit de map van deze repository:
git clone https://github.com/picazuid-pilot/face-anonymizer.git
cd face-anonymizer
./install.shHet script:
- installeert Python, Tk en de virtuele-camera-driver (v4l2loopback);
- zet de app met een eigen Python-omgeving in
~/.local/share/face-anonymizer; - downloadt het gezichtsmodel vooraf;
- stelt de virtuele camera "Face Anonymizer" zo in dat hij na elke herstart beschikbaar is;
- maakt een snelkoppeling in het app-menu en op het bureaublad.
Daarna start je Face Anonymizer gewoon via het app-menu of het bureaublad; een terminal is niet meer nodig. Gaat er iets mis bij het starten, dan krijg je een venster met de foutmelding (het volledige logboek staat in ~/.cache/face-anonymizer/).
| Bijwerken | git pull && ./install.sh |
| Verwijderen | ./uninstall.sh |
| Zonder vragen | ./install.sh --yes |
| Zonder virtuele camera | ./install.sh --no-virtualcam |
Secure Boot: staat Secure Boot aan, dan vraagt Ubuntu bij het installeren van de driver om een wachtwoord. Na de herstart verschijnt een blauw scherm: kies Enroll MOK en voer dat wachtwoord in. Daarna werkt de virtuele camera.
Python 3.10 of nieuwer en OBS Studio (alleen voor de driver van de virtuele camera; OBS hoeft niet open te staan).
pip install -r requirements.txt
python face_anonymizer.pyOp macOS moet je de virtuele camera één keer in OBS starten om hem te registreren. Op Windows zet je de virtuele camera in OBS zelf niet aan; deze tool gebruikt hem.
Nee, niet om naar Zoom, Meet of Teams te gaan. De virtuele camera verschijnt in die apps als een gewone webcam met de naam "Face Anonymizer". Op Linux levert v4l2loopback die camera; op Windows en macOS moet OBS geïnstalleerd zijn voor de driver. OBS gebruik je alleen als je zelf een livestream opbouwt; daar kies je de virtuele camera dan als Video-opnameapparaat.
- Kies het cameranummer (meestal
0) en druk op ▶ Start. - Vink Enable Virtual Camera aan. Je kunt dit ook tijdens het streamen aan- en uitzetten.
- Kies in Zoom, Meet, Teams of OBS de camera "Face Anonymizer". Op Linux toont Chrome/Meet de camera pas als er beeld op staat: start dus eerst deze tool en vink de virtuele camera aan, en open of herlaad daarna Meet.
- Zet Show debug boxes gerust aan om te tunen: de kaders komen niet in de stream terecht.
- Sluit je het previewvenster, dan loopt de stream gewoon door en bespaar je rekenkracht.
Gebruik je de virtuele camera in de browser, zet dan de browserextensie uit; anders wordt het beeld twee keer bewerkt.
Standaard wordt assets/overlay.png als overlay geladen. Met 📁 Select PNG kies je een andere. Transparante PNG’s werken het best; zorg dat het deel dat over het gezicht valt volledig dekkend is.
| Instelling | Wat het doet | Tip |
|---|---|---|
| Scale | Grootte van het masker t.o.v. het gezicht | 1.6–2.0 dekt ook haar en oren |
| Confidence | Minimale zekerheid van een detectie | Hoog (0.6–0.8) = minder valse vlekken op de achtergrond |
| Min Size | Kleinste gezicht in pixels | Verhoog bij een vol publiek op afstand als er ruis ontstaat |
| Persistence | Hoe lang (frames) een masker blijft staan als het gezicht even niet gedetecteerd wordt | Zie hieronder |
| Smart persistence | Gezichten die nog geen 5 keer gezien zijn, verdwijnen al na 5 frames | Laat aan |
| Detect at | Detecteren op lagere resolutie | 960 of 1280 geeft veel meer FPS bij 1080p; Full vindt kleine gezichten verder weg beter |
| Mode | Overlay / Pixelate / Blur / Black | Zonder geladen overlay wordt automatisch gepixeld |
| Mirror overlay | Spiegelt het logo | Zoom, Meet en Teams spiegelen alleen je eigen voorbeeld; de anderen zien het logo gewoon goed. Zet dit alleen aan als je ook gespiegeld uitzendt |
| Protective blur | Vervaagt het hele beeld zolang er geen gezicht gevonden wordt (voor het geval er een gemist wordt) | Standaard uit, want bij een leeg podium of een pauze wordt het beeld dan vaag. Ook in de browserextensie (Beschermende blur) |
Waarom hoge confidence + lage persistence zo goed werkt: bij lage confidence ontstaan af en toe valse detecties (een lamp, een poster), en met hoge persistence blijven die maskers lang hangen. Smart persistence lost precies dat op: losse valse detecties verdwijnen snel, terwijl echte gezichten die al een tijd gevolgd worden wél lang afgedekt blijven. Je kunt de persistence daardoor weer wat hoger zetten (bijv. 20–30) zonder rommel, wat veiliger is als iemand even wegdraait. Een kwijtgeraakt gezicht krijgt bovendien een masker dat langzaam groeit, zodat het nog bedekt is als de persoon beweegt.
Melding "No v4l2 loopback device found" of "Face Anonymizer" staat niet in de cameralijst van Zoom: de driver voor de virtuele camera is niet geladen. De app probeert dit zelf op te lossen en vraagt daarvoor je wachtwoord. Lukt dat niet, dan staat in de statusregel waarom. Zelf nagaan:
modinfo v4l2loopback | head -3 # foutmelding = driver niet geïnstalleerd
lsmod | grep v4l2loopback # leeg = niet geladen
mokutil --sb-state # "SecureBoot enabled" = zie hieronder
ls /dev/video* # /dev/video10 hoort erbij te staan| Oorzaak | Oplossing |
|---|---|
| Driver niet geïnstalleerd (nieuwe computer, of bij de installatie "nee" gekozen) | ./install.sh opnieuw draaien, of sudo apt install v4l2loopback-dkms linux-headers-$(uname -r) |
Secure Boot blokkeert de driver (Key was rejected by service) |
sudo mokutil --revoke-import en dan sudo mokutil --import /var/lib/shim-signed/mok/MOK.der, kies een eenmalig wachtwoord en herstart. Druk in het blauwe scherm Perform MOK management direct op een toets (het verdwijnt na 10 seconden) en kies Enroll MOK → Continue → Yes, wachtwoord, Reboot. ./install.sh doet dit ook voor je |
| Na een kernelupdate werkt het niet meer | sudo apt install linux-headers-$(uname -r) en sudo dpkg-reconfigure v4l2loopback-dkms |
| Driver geladen, maar niet zichtbaar in Zoom | Zoom pas starten (of helemaal afsluiten en opnieuw openen) nadat de virtuele camera aanstaat en beeld geeft. Zoom zoekt alleen bij het opstarten naar camera's |
Met de hand laden: sudo modprobe v4l2loopback devices=1 video_nr=10 exclusive_caps=1 card_label="Face Anonymizer"
Geen enkele gezichtsdetector is 100% betrouwbaar. Profielen, handen voor het gezicht, sterk tegenlicht en hele kleine gezichten kunnen gemist worden. Test daarom vooraf in de echte ruimte met het echte licht, en overweeg bij gevoelige events extra maatregelen: camerastandpunt achter het publiek, een iets grotere Scale, of in OBS een vaste vertraging zodat je kunt ingrijpen.
Alle verwerking gebeurt lokaal; er worden geen beelden verstuurd.
pip install pytest
python -m pytest tests/De tests draaien zonder camera of scherm. Ze controleren onder meer dat debug-kaders nooit in de stream komen, dat elke afdekmodus het gezicht echt bedekt, dat kleine en grote gezichten gevonden worden, dat metadata verdwijnt en dat telefoonfoto's rechtop komen.
Maakt alle gezichten op een map vol foto's onherkenbaar, bijvoorbeeld foto's van een bijeenkomst die je wilt delen of publiceren.
- Originelen blijven altijd bewaard: de resultaten komen in een aparte map (standaard
<map>_anoniem), met dezelfde submappen - Logo, pixels, blur of zwart vlak, dezelfde keuzes als bij de live-tool; ook overlay spiegelen
- Metadata wordt verwijderd: GPS-locatie, cameratype en datum gaan niet mee
- Telefoonfoto's worden rechtop gezet; iPhone-foto's (HEIC) worden JPG
- Ook kleine gezichten: er wordt op meerdere schalen gezocht; Grondig zoekt daarnaast in stukken van de foto op volle resolutie, voor publiek ver weg
- Nalopen: foto's zonder gevonden gezicht worden gemarkeerd. Klik een foto aan om maskers weg te halen (klik) of toe te voegen (slepen); de foto wordt direct opnieuw opgeslagen
Na ./install.sh staat Foto Anonymizer in je app-menu en op je bureaublad. Kies een map, kies de afdekking en druk op Start. Dubbelklik daarna op een foto in de lijst om hem na te lopen.
Zonder venster, bijvoorbeeld voor een script:
python photo_anonymizer.py ~/Fotos/bijeenkomst # → ~/Fotos/bijeenkomst_anoniem
python photo_anonymizer.py BRON DOEL -r --mode pixelate --accuracy thorough
python photo_anonymizer.py --helpDezelfde functie in de browser, zonder installatie: sleep foto's of een hele map op de pagina, loop ze na en download alles als ZIP. De foto's worden niet geüpload: alles gebeurt in je eigen browser, en de pagina mag technisch gezien geen verbinding maken met andere websites. Getest in Chrome (dus ook Edge), op de computer en op telefoonformaat; Firefox en Safari zijn nog niet getest.
- Online: https://picazuid-pilot.github.io/face-anonymizer/ (de camera-app staat op
/camera/; wordt bij elke wijziging automatisch bijgewerkt via GitHub Pages) - Op je eigen website (bijv. InfinityFree): voer
web/build.shuit en zet de inhoud vandist/webin een map op je hosting. Er is geen PHP of database nodig. Voor de camera-app moet de site via https bereikbaar zijn (telefoons geven anders geen toegang tot de camera). Nainstall.shstaat de gebouwde versie ook al klaar in~/.local/share/face-anonymizer/web.
iPhone-foto's (HEIC) kan de browser niet openen; gebruik daarvoor de desktop-app.
| Desktop-app | Webtool | |
|---|---|---|
| Installatie | install.sh |
Geen |
| Grote mappen (honderden foto's) | Beter: schrijft direct naar schijf | Prima tot enkele honderden foto's |
| iPhone-foto's (HEIC) | Ja | Nee |
| Mappenstructuur behouden | Ja | Ja (bij een map slepen of kiezen) |
| Snelheid | Sneller | Iets trager |
Anonimiseert gezichten in opgeslagen video's, beeldreeksen (bijv. shot_0001.png, shot_0002.png …) en losse foto's, voor podcasts, interviews en opnames van bijeenkomsten.
- Originelen blijven altijd bewaard: de resultaten krijgen
_anoniemin de naam en komen in een aparte map (standaardanoniemnaast je bestanden) - Geluid blijft behouden; de video wordt opnieuw opgeslagen als MP4 (H.264)
- Metadata wordt verwijderd: GPS-locatie, titel en toestel gaan niet mee
- Telefoonvideo's worden rechtop gezet
- Logo, pixels, blur of zwart vlak, ook overlay spiegelen, net als bij de andere tools
Live weet de tool alleen wat er al gebeurd is. Bij een opgeslagen video kent hij ook de beelden erna:
- Eerst worden in alle beelden de gezichten gezocht.
- Daarna worden ze over de tijd gevolgd. Wordt een gezicht even gemist (opzij kijken, hand voor het gezicht, bewegingsonscherpte), dan vult de tool dat stuk op langs de baan tussen ervoor en erna. Het masker wordt daar iets groter, omdat de positie minder zeker is.
- Elk masker verschijnt net iets vóór het gezicht in beeld komt en blijft net iets langer staan.
- Losse twijfelachtige treffers (bijv. een poster die één beeld lang op een gezicht lijkt) vallen weg.
Dubbelklik na het verwerken op een video in de lijst:
- Bladeren met de schuifregelaar of de pijltjestoetsen
- Oranje kaders en de oranje stukjes op de tijdlijn zijn opgevulde stukken: daar is het gezicht niet zelf gevonden. Met Volgend opgevuld stuk spring je er direct naartoe om ze te controleren
- Klik op een masker om het in de hele video weg te halen (bijv. een vals masker op een poster)
- Sleep over een gemist gezicht om een masker toe te voegen, vanaf dat beeld voor een in te stellen aantal seconden
- Ongedaan maken en daarna Opnieuw opslaan
Na ./install.sh staat Face Anonymizer for AV in je app-menu. Voeg bestanden of een map toe, kies de afdekking en druk op Start. Een map met genummerde beelden wordt automatisch als beeldreeks herkend; de uitvoer krijgt dezelfde bestandsnamen.
Zonder venster:
python av_anonymizer.py opname.mp4 # → anoniem/opname_anoniem.mp4
python av_anonymizer.py ~/Opnames ~/Shots/scene1 -o ~/Anoniem --speed thorough
python av_anonymizer.py --help| Instelling | Uitleg |
|---|---|
| Snel / Normaal / Grondig | Snel zoekt in elk 2e beeld en vult ertussen aan. Grondig zoekt ook naar kleine gezichten ver weg, maar is een stuk trager |
| Zekerheid | Hoger = minder valse maskers |
| Missers opvullen | Hoe lang (standaard 1,5 s) een masker blijft staan als een gezicht even niet gevonden wordt |
Snelheid: reken op ongeveer 2 tot 4 keer de lengte van de video op een gewone laptop (Normaal, 1080p). Een opname van 10 minuten duurt dus zo'n 20 tot 40 minuten. Snel scheelt ongeveer een derde.
Goed om te weten:
- Beeldreeksen worden als 8-bit opgeslagen; 16-bit PNG/TIFF uit compositing-software verliest dus kleurdiepte.
- Een gezicht dat lang én snel uit beeld beweegt (meer dan ~1 seconde niet te zien terwijl het van richting verandert) kan het opvullen niet precies volgen. Die stukken staan oranje bij het nalopen.
Film en fotografeer op je Android-telefoon of iPhone met gezichten al afgedekt door het logo, blur, pixels of een zwart vlak. Zo hoef je achteraf niets meer na te bewerken.
Openen: https://picazuid-pilot.github.io/face-anonymizer/camera/ en tik op Camera starten. Zet hem daarna op je beginscherm, dan opent hij als gewone app en werkt hij ook zonder internet:
- iPhone (Safari): Delen → Zet op beginscherm
- Android (Chrome): ⋮ → App installeren (of de knop Als app installeren op het startscherm)
Wat hij doet:
- Wat je ziet, wordt opgeslagen. Video's worden opgenomen vanaf het bewerkte beeld, nooit vanaf de camera zelf. Het onbewerkte beeld wordt nergens bewaard.
- Bij twijfel dicht: zolang de gezichtsherkenning nog laadt of hapert, wordt het hele beeld vervaagd, ook in de opname.
- Beschermende blur (schildje bovenin, standaard aan): zolang er geen gezicht gevonden wordt, wordt het hele beeld vervaagd, voor het geval er een gemist wordt. Een gezicht dat wél gevonden wordt, krijgt gewoon zijn masker en de rest is scherp. Zet het schildje uit voor beelden zonder mensen, zoals een dier of natuur.
- Foto's worden bij het maken nog een keer grondig doorzocht, zodat ook kleinere gezichten verderop afgedekt worden.
- Gezichten worden gevolgd tussen twee herkenningen door; het masker beweegt mee en groeit bij snelle bewegingen.
- Voor- en achtercamera, geluid aan of uit, eigen PNG-logo, logo spiegelen, maskergrootte, zekerheid en snelheid van de herkenning.
- Bewaren: op de iPhone via Bewaar in Foto's, op Android in Downloads (ook zichtbaar in Google Foto's onder Apparaatmappen). Of Delen… naar WhatsApp, Signal, mail enz.
- Er gaat niets naar internet: de pagina mag technisch gezien geen verbinding maken met andere websites.
Goed om te weten:
- Foto's hebben de resolutie van het videobeeld (1080p of 720p), dus minder pixels dan je gewone camera-app.
- Een opname staat in het geheugen tot je hem bewaart; na 20 minuten stopt hij vanzelf. Ga je tijdens het filmen naar een andere app, dan wordt de opname netjes afgerond.
- Android-telefoons met een oudere Chrome slaan video's op als WebM in plaats van MP4.
- Nodig: iPhone met iOS 16.4 of nieuwer, of Android met een recente Chrome. Op oudere toestellen blijft het hele beeld vervaagd met de melding Gezichtsherkenning werkt niet.
- De eerste keer wordt ongeveer 15 MB geladen (het gezichtsmodel); daarna staat alles op je telefoon.
- Getest in Chrome met een nagebootste camera op telefoonformaat. Op echte telefoons (vooral iPhone) is hij nog niet getest: laat het weten als iets niet werkt.
- Een versie voor de App Store is mogelijk door deze app in te pakken (bijv. met Capacitor), maar vraagt een Mac en een Apple-ontwikkelaarsaccount.
Liever een echte app? Installeer fa-camera.apk (Android 10 of nieuwer). Foto's en video's komen dan direct in je galerij, in de map FA Camera. GitHub bouwt de APK automatisch bij elke wijziging. Uitleg over installeren, bijwerken en ondertekenen: android-app/README.md.
In browser-extension/ staat een extensie (installatie: zie de README; na install.sh staat hij ook klaar in ~/.local/share/face-anonymizer/browser-extension) die in webapps (Google Meet, Zoom in de browser, Teams web, StreamYard, YouTube Studio) je webcambeeld vervangt door een geanonimiseerde versie. Zet hem aan en kies je gewone camera; meer is niet nodig. Hij gebruikt hetzelfde YuNet-model en dezelfde tracking als deze Python-tool.
| Python-tool | Browserextensie | |
|---|---|---|
| OBS, Zoom/Teams desktop-app | ✅ via virtuele camera | ❌ |
| Meet, Zoom/Teams in de browser, YouTube Studio | ✅ via virtuele camera | ✅ direct |
| Installatie | install.sh (Linux) of Python + OBS (Windows/macOS) |
Extensie laden |
| Kleine gezichten ver weg | Beter (volle resolutie) | Detectie op 320–640 px |
- Webpagina die de webcam in de browser anonimiseert, als Browserbron of Venster-opname in OBS.
assets/overlay.png is een neutrale "Your image here"-afbeelding. Kies in elke tool je eigen logo:
| Tool | Waar |
|---|---|
| Face Anonymizer (live) | 📁 Select PNG |
| Foto Anonymizer en Face Anonymizer for AV | Overlay kiezen… |
| Foto Anonymizer-webtool | Ander logo kiezen |
| Camera-app (telefoon en Android-app) | Instellingen → Eigen PNG kiezen (wordt onthouden) |
| Browserextensie | In de popup: Eigen PNG kiezen… |
Wil je dat je eigen logo overal de standaard is, vervang dan assets/overlay.png door je logo en voer ./install.sh opnieuw uit. Gebruik een PNG waarvan het deel over het gezicht volledig dekkend is; een doorzichtige rand eromheen wordt automatisch weggeknipt.
Copyright © 2026 picazuid-pilot en bijdragers.
Face Anonymizer is vrije software: je mag het verspreiden en aanpassen onder de voorwaarden van de GNU General Public License versie 3 of (naar keuze) een latere versie, zoals gepubliceerd door de Free Software Foundation. Zie LICENSE.
Het wordt verspreid in de hoop dat het nuttig is, maar zonder enige garantie. Controleer het resultaat altijd zelf voordat je beelden deelt.
Gebruikte onderdelen van anderen (gezichtsmodel, ONNX Runtime, Capacitor e.d.) en hun licenties: THIRD_PARTY_NOTICES.md.
