>_ DevTrendsnl

Taal

Home

Talen

Secties

Frontend Backend Mobiel DevOps AI / ML GameDev Blockchain Embedded Beveiliging
Python

Lichtgewicht gezichtstracking op CPU zonder zware neurale netwerk-frameworks

OSF.png

Als je ooit geprobeerd hebt om een 3D-avatar of -personage in real time te animeren vanaf een gewone webcam, heb je waarschijnlijk een dilemma meegemaakt. Of je gebruikt zware modellen die je grafische kaart en de helft van je processor verbruiken, of het resultaat wordt een schokkerig masker met een halve seconde vertraging. Voor game streaming is dit een ramp, want de GPU is al belast met renderen.

De ontwikkelaar bekend als emilianavt liep tegen exact dit probleem aan bij het maken van tools voor VTubers. Het resultaat was OpenSeeFace. Deze lichtgewicht bibliotheek voor gezichts- en landmark-tracking is geoptimaliseerd voor CPU en levert stabiele 30-60 fps, zelfs op oudere hardware.

Wat er onder de motorkap zit en waarom het snel werkt

Het project streeft er niet naar om een volledig uitgerust avatar-animatieprogramma te zijn. Het is een gespecialiseerde tracker. Het legt video vast van een webcam of bestand, detecteert het gezicht, berekent landmark-coördinaten en stuurt de kant-en-klare data via UDP.

Het model is oorspronkelijk getraind op MobileNetV3 in PyTorch. Maar op Windows was PyTorch CPU-inferentie traag. De auteur heeft het netwerk geconverteerd naar ONNX-formaat en is overgeschakeld naar onnxruntime. De release-builds bevatten een aangepaste ONNX Runtime-build zonder onnodige telemetrie.

De architectuur van de tracker lost verschillende praktische taken tegelijk op:

  • Capture en inferentie zijn gescheiden in een standalone Python-script of binary. Als het hoofdprogramma (bijvoorbeeld een Unity-spel) crasht, sleept de pipeline de camera niet mee omlaag.
  • UDP-coördinaattransmissie betekent dat je tracking kunt uitvoeren op een oude laptop terwijl je het spel of de 3D-scène op je hoofd-PC draait. Dit bespaart resources en beschermt de streamer tegen het per ongeluk tonen van hun echte gezicht op stream.
  • Het model is getraind op LS3D-W, WFLW, MPIIGaze-datasets en synthetische ogen van UnityEyes. Er is een aangepaste variant van Adaptive Wing Loss gebruikt voor de loss-functie.

Een interessant detail: de auteur heeft de landmarks specifiek aangepast voor avatar-animatie, niet voor academische benchmarks. De labeling is vergelijkbaar met iBUG 68, maar met quasi-3D-contouren. Zelfs als de gaze-vectorcoördinaten iets afwijken in absolute waarden, detecteert het algoritme knipperen en mondvorm tijdens spreken nauwkeurig.

Results1.png

Results2.png

Vergeleken met Google MediaPipe houdt OpenSeeFace-tracking beter stand bij scherpe hoofd draaiingen, slechte belichting en ruis van goedkope webcams. De mond wordt nauwkeuriger herkend, hoewel ooggebied-tracking niet quiteert aan sommige gespecialiseerde oplossingen.

EmiFace.png

Modelniveaus voor elke hardware

De repository bevat verschillende voorgebouwde modellen met verschillende nauwkeurigheid-snelheid-afwegingen. De selectie wordt ingesteld via het --model-argument:

  • Model -1: modus voor zeer zwakke processors. Levert tot 213 fps op één core zonder gaze-tracking, maar de tracking is zeer grof.
  • Model 0: snel model met basisnauwkeurigheid (~68 fps).
  • Model 1: gebalanceerd compromis tussen snelheid en kwaliteit (~59 fps).
  • Model 2: goede tracking met gematigd resourcegebruik (~50 fps).
  • Model 3: standaard en meest nauwkeurige optie (~44 fps op één core).

In de praktijk heb je zelden meer dan 30 fps nodig voor gezichtsuitdrukkingscapture, dus het script kan worden gelimiteerd qua framerate om CPU-tijd te besparen.

Hoe de tracker te starten

Werken met de code vereist Python 3.6 tot 3.9 en een minimale set aan bibliotheken:

pip install onnxruntime opencv-python pillow numpy

Als je geen zin hebt om met de Python-omgeving bezig te zijn, heeft de Releases-sectie een kant-en-klare archive met facetracker.exe, gebouwd via pyinstaller.

Basisstart met visualisatie ziet er zo uit:

python facetracker.py --visualize 3 --pnp-points 1 --max-threads 4 -c 0

De -c 0-vlag specificeert de webcam-index. Als je een vooraf opgenomen video wilt verwerken, geef dan het bestandspad door in plaats van video.mp4.

Integratie met Unity en andere engines

De repository bevat kant-en-klare C#-scripts voor Unity. Het OpenSee-component luistert naar inkomende UDP-pakketten in een achtergrondthread en slaat coördinaten op in het publieke veld trackingData.

Om de tracker op een scène aan te sluiten, zijn maar een paar stappen nodig:

  1. Voeg de OpenSee en OpenSeeShowPoints-componenten toe aan een leeg GameObject.
  2. Start de scène in de Unity-editor.
  3. Start het facetracker.py-script. Gezichtspunten verschijnen direct in de scéneruimte.
  4. Om het hoofd van een personage te besturen, kun je het OpenSeeIKTarget-component aansluiten samen met FinalIK.

De ingebouwde OpenSeeLauncher-manager kan zichzelf starten en de tracker-binary correct beëindigen via WinAPI Job Objects. Als je Unity-applicatie crasht met een fout, blijft het onderliggende tracker-proces niet in het geheugen hangen.

Emotiedetectie via LIBSVM

Naast landmark-coördinaten bevat het project het OpenSeeExpression-component. Het lost de taak op van emotieclassificatie (glimlach, boosheid, verrassing) voor een specifiek persoon.

In plaats van te proberen één algemeen neuraal netwerk voor iedereen op de planeet te trainen, gebruikte de auteur een SVM-classifier. De gebruiker calibreert het systeem zelf:

  • Voert de emotienaam in de Unity-inspector in.
  • Maakt de vereiste gezichtsuitdrukking en schakelt opname in.
  • Draait het hoofd en spreekt zodat het model mimetische vervormingen in beweging onthoudt.
  • Drukt op Train.

Het getrainde model wordt opgeslagen in een apart bestand en geladen bij de volgende applicatiestart.

Waar het al wordt gebruikt

OpenSeeFace is de basis geworden voor verschillende populaire animatietools:

  • VSeeFace: gratis VTuber-programma met ondersteuning voor VRM- en VSFAvatar-formaten.
  • VTube Studio: tool voor het besturen van 2D Live2D-modellen via webcam.
  • VPUPPR: open avatar-renderer op de Godot-engine.

Wie heeft baat bij dit project

De bibliotheek is ideaal voor game-ontwikkelaars en interactieve installaties die snelle facial capture nodig hebben zonder dure headsets of iPhones met TrueDepth. De code wordt gedistribueerd onder de permissieve BSD 2-Clause-licentie, dus je kunt het veilig insluiten in commerciële projecten.

Als je fijne retinale details moet herkennen of een submillimeter-nauwkeurige polygonale 3D-masker moet bouwen voor medische doeleinden, werkt OpenSeeFace niet. Maar voor personage-animatie, hoofd bewegingsinterface-besturing en streaming is het een van de meest praktische en lichtgewicht oplossingen op GitHub.

Gerelateerde projecten