>_ DevTrendspl

Język

Strona główna

Języki

Sekcje

Frontend Backend Mobilne DevOps AI / ML GameDev Blockchain Systemy wbudowane Bezpieczeństwo
Python

Szybkie śledzenie twarzy na CPU bez ciężkich frameworków sieci neuronowych

OSF.png

Jeśli kiedykolwiek próbowałeś animować awatara 3D lub postać w czasie rzeczywistym z zwykłej kamery internetowej, prawdopodobnie stanąłeś przed dylematem. Albo używasz ciężkich modeli, które pożerają twoją kartę graficzną i połowę procesora, albo wynik staje się przerywanym maską z opóźnieniem rzędu pół sekundy. Dla streamingu gier to katastrofa, ponieważ GPU jest już obciążone renderowaniem.

Developer znany jako emilianavt natknął się dokładnie na ten problem podczas tworzenia narzędzi dla VTuberów. Rezultatem jest OpenSeeFace. Ta lekka biblioteka do śledzenia twarzy i punktów charakterystycznych (landmarks) jest zoptymalizowana pod kątem CPU i zapewnia stabilne 30–60 fps nawet na starszym sprzęcie.

Co jest pod maską i dlaczego działa szybko

Projekt nie ma na celu bycia pełnofunkcyjnym programem do animacji awatarów. To specjalizowany tracker. Przechwytuje wideo z kamery internetowej lub pliku, wykrywa twarz, oblicza współrzędne punktów charakterystycznych i wysyła gotowe dane przez UDP.

Model został pierwotnie wytrenowany na MobileNetV3 w PyTorch. Ale w Windows inferencja PyTorch na CPU była wolna. Autor przekonwertował sieć do formatu ONNX i przełączył wykonanie na onnxruntime. Wydania zawierają niestandardową kompilację ONNX Runtime bez niepotrzebnej telemetrii.

Architektura trackera rozwiązuje kilka zastosowanych zadań jednocześnie:

  • Przechwytywanie i inferencja są rozdzielone na samodzielny skrypt Pythona lub plik binarny. Jeśli główny program (na przykład gra Unity) ulegnie awarii, potok nie pociągnie kamery za sobą.
  • Transmisja współrzędnych przez UDP oznacza, że możesz uruchomić śledzenie na starym laptopie, a grę lub scenę 3D na głównym PC. Oszczędza to zasoby i chroni streamera przed przypadkowym pokazaniem prawdziwej twarzy na streamie.
  • Model został wytrenowany na zbiorach danych LS3D-W, WFLW, MPIIGaze oraz syntetycznych oczach z UnityEyes. Użyto niestandardowego wariantu Adaptive Wing Loss jako funkcji straty.

Interesujący szczegół: autor dostosował punkty charakterystyczne specjalnie do animacji awatarów, a nie do akademickich testów porównawczych. Etykietowanie jest zbliżone do iBUG 68, ale z quasi-3D konturami. Nawet jeśli współrzędne wektora spojrzenia są nieco niedokładne w wartościach bezwzględnych, algorytm dokładnie wykrywa mruganie i kształt ust podczas mówienia.

Results1.png

Results2.png

W porównaniu z Google MediaPipe, śledzenie OpenSeeFace radzi sobie lepiej podczas gwałtownych obrotów głowy, słabego oświetlenia i szumu z tanich kamer internetowych. Usta są rozpoznawane dokładniej, choć śledzenie okolicy oczu ustępuje niektórym specjalistycznym rozwiązaniom.

EmiFace.png

Poziomy modeli dla dowolnego sprzętu

Repozytorium zawiera kilka wstępnie zbudowanych modeli z różnymi kompromisami między dokładnością a szybkością. Wybór ustawia się za pomocą argumentu --model:

  • Model -1: tryb dla bardzo słabych procesorów. Osiąga do 213 fps na jednym rdzeniu bez śledzenia spojrzenia, ale śledzenie jest bardzo zgrubne.
  • Model 0: szybki model z podstawową dokładnością (~68 fps).
  • Model 1: zrównoważony kompromis między szybkością a jakością (~59 fps).
  • Model 2: dobre śledzenie z umiarkowanym zużyciem zasobów (~50 fps).
  • Model 3: domyślna i najdokładniejsza opcja (~44 fps na jednym rdzeniu).

W rzeczywistości rzadko potrzebujesz więcej niż 30 fps do przechwytywania wyrazu twarzy, więc skrypt może być ograniczony do limitu klatek, aby oszczędzić czas CPU.

Jak uruchomić tracker

Praca z kodem wymaga Pythona 3.6 do 3.9 oraz minimalnego zestawu bibliotek:

pip install onnxruntime opencv-python pillow numpy

Jeśli nie chcesz zajmować się środowiskiem Python, sekcja Releases zawiera gotowe archiwum z facetracker.exe, zbudowane przez pyinstaller.

Podstawowe uruchomienie z wizualizacją wygląda tak:

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

Flaga -c 0 określa indeks kamery internetowej. Jeśli potrzebujesz przetworzyć wcześniej nagrany film, zamiast tego podaj ścieżkę do pliku video.mp4.

Integracja z Unity i innymi silnikami

Repozytorium zawiera gotowe do użycia skrypty C# dla Unity. Komponent OpenSee nasłuchuje przychodzących pakietów UDP w wątku w tle i przechowuje współrzędne w publicznym polu trackingData.

Aby połączyć tracker ze sceną, potrzebne są tylko kilka kroków:

  1. Dodaj komponenty OpenSee i OpenSeeShowPoints do pustego GameObject.
  2. Uruchom scenę w edytorze Unity.
  3. Uruchom skrypt facetracker.py. Punkty twarzy natychmiast pojawią się w przestrzeni sceny.
  4. Aby kontrolować głowę postaci, możesz połączyć komponent OpenSeeIKTarget wraz z FinalIK.

Wbudowany menedżer OpenSeeLauncher może uruchomić się sam i prawidłowo zakończyć plik binarny trackera przez WinAPI Job Objects. Jeśli twoja aplikacja Unity ulegnie awarii z błędem, proces potomny trackera nie pozostanie w pamięci.

Wykrywanie emocji przez LIBSVM

Oprócz współrzędnych punktów charakterystycznych, projekt zawiera komponent OpenSeeExpression. Rozwiązuje on zadanie klasyfikacji emocji (uśmiech, gniew, zaskoczenie) dla konkretnej osoby.

Zamiast próbować trenować jedną ogólną sieć neuronową dla wszystkich na świecie, autor użył klasyfikatora SVM. Użytkownik sam kalibruje system:

  • Wpisuje nazwę emocji w inspektorze Unity.
  • Wykonuje wymaganą mimikę twarzy i włącza nagrywanie.
  • Obraca głowę i mówi, aby model zapamiętał mimikę w ruchu.
  • Naciska Train.

Wytrenowany model jest zapisywany do osobnego pliku i ładowany przy następnym uruchomieniu aplikacji.

Gdzie jest już używane

OpenSeeFace stało się fundamentem dla kilku popularnych narzędzi do animacji:

  • VSeeFace: darmowy program VTuber z obsługą formatów VRM i VSFAvatar.
  • VTube Studio: narzędzie do kontrolowania 2D modeli Live2D przez kamerę internetową.
  • VPUPPR: otwarty renderer awatarów na silniku Godot.

Kto skorzysta z tego projektu

Biblioteka jest idealna dla deweloperów gier i instalacji interaktywnych, którzy potrzebują szybkiego przechwytywania twarzy bez kupowania drogich zestawów słuchawkowych lub iPhone'ów z TrueDepth. Kod jest rozpowszechniany na podstawie permissive licencji BSD 2-Clause, więc możesz bezpiecznie osadzać go w projektach komercyjnych.

Jeśli potrzebujesz rozpoznawać drobne szczegóły siatkówki lub budować submilimetrowo dokładną poligonalną maskę 3D do celów medycznych, OpenSeeFace nie zadziała. Ale do animacji postaci, sterowania interfejsem ruchem głowy i streamingu, jest to jedno z najbardziej praktycznych i lekkich rozwiązań na GitHub.

Powiązane projekty