Jak zbudować animowalnego awatara 4D z kilku zdjęć za pomocą CAP4D

Tworzenie kontrolowalnych głów 3D z jednego lub kilku zdjęć zwykle napotyka tę samą przeszkodę. Albo otrzymujesz płaską maskę bez tyłu głowy i odpowiedniej geometrii, albo potrzebujesz studia z dwudziestoma zsynchronizowanymi kamerami do trenowania sieci neuronowej.
Pare dni temu natknąłem się na repozytorium CAP4D autorstwa badaczy z Uniwersytetu w Toronto i LG Electronics, zaakceptowane na CVPR 2025. Autorzy udostępnili pipeline, który przyjmuje dowolny zestaw zdjęć lub krótki film z kamery monokularnej i buduje w pełni animowalnego awatara 4D oparty na technice 3D Gaussian Splatting.
Co siedzi pod maską
Jeśli rozłożymy architekturę na czynniki pierwsze, pipeline składa się z czterech etapów:
- Śledzenie twarzy przez FLAME. Skrypt przepuszcza źródłowe klatki przez narzędzie do śledzenia 3D (Pixel3DMM lub nadchodzący FlowFace), dopasowując parametry głowy do modelu parametrycznego FLAME.
- Wielowidokowa dyfuzja (MMDM). Tutaj autorzy wzięli Stable Diffusion i ControlNet, dostrajając je do generowania spójnych widoków głowy przy różnych wyrazach twarzy i pozach. Sieć dyfuzyjna dosłownie „uzupełnia" twarz pod kątami, których nie było na oryginalnych zdjęciach.
- Trenowanie Gausjanów (Gaussian Splatting). Reprezentacja oparta na GaussianAvatars jest trenowana na wygenerowanych i źródłowych obrazach. Gaussy są powiązane z siatką wielokątną FLAME, zapewniając stabilną geometrię podczas deformacji.
- Animacja i eksport PLY. Gotowego awatara można sterować parametrami z istniejących plików lub przenosić wyrazy twarzy z dowolnego innego wideo. Wynik jest eksportowany do pliku
.ply, który można otworzyć bezpośrednio w przeglądarce za pomocą silnika Brush.
Instalacja i pierwsze przeszkody
W README opisano standardową konfigurację środowiska Conda, ale jest pare miejsc, gdzie łatwo się potknąć:
git clone https://github.com/felixtaubner/cap4d/
cd cap4d
conda create --name cap4d_env python=3.10
conda activate cap4d_env
pip install -r requirements.txt
export PYTHONPATH=$(realpath "./"):$PYTHONPATH
Następnie musisz ręcznie zbudować PyTorch3D z obsługą CUDA:
export FORCE_CUDA=1
pip install "git+https://github.com/facebookresearch/pytorch3d.git@stable"
Aby pracować z modelem parametrycznym, musisz zarejestrować się na stronie FLAME (bezpłatnie do użytku niekomercyjnego) i ustawić zmienne środowiskowe:
export FLAME_USERNAME=your_flame_user_name
export FLAME_PWD=your_flame_password
bash scripts/download_flame.sh
bash scripts/download_mmdm_weights.sh
Jeśli skrypt pobierania nie działa z powodu problemów z wersją NumPy, repozytorium uprzejmie udostępnia narzędzie scripts/fixes/fix_flame_pickle.py.
Szybki test na gotowych postaciach
Aby sprawdzić, czy wszystkie jądra CUDA i biblioteki są poprawnie zainstalowane, autorzy dodali testowy przebieg:
bash scripts/test_pipeline.sh
Jeśli wideo z Nikową Teslą renderuje się w examples/debug_output/, środowisko jest skonfigurowane poprawnie. Następnie możesz zbudować gotowe przykłady (Tesla, Lincoln lub autor repozytorium Felix):
bash scripts/generate_tesla.sh
Skrypt wyświetli plik animacji exported_animation.ply. Możesz go przesłać do ich przeglądarki internetowej na GitHub Pages i obracać kamerą myszą bezpośrednio w oknie przeglądarki przy 60 FPS.
Uruchomienie na własnych danych
Gdy chcesz tchnąć życie we własną twarz lub postać z wideo, proces jest nieco bardziej złożony. Potrzebujesz repozytorium Pixel3DMM do śledzenia monokularnego:
export PIXEL3DMM_PATH=$(realpath "../PATH/TO/pixel3dmm")
export CAP4D_PATH=$(realpath "./")
bash scripts/install_pixel3Dmm.sh
Następnie uruchom śledzenie na folderze ze zdjęciami i docelowym wideo, z którego wyodrębniane są wyrazy:
# Трекинг исходных фотографий
bash scripts/track_video_pixel3dmm.sh examples/input/my_face/cam0/ examples/output/custom/reference_tracking/
# Трекинг видео-драйвера с движениями
bash scripts/track_video_pixel3dmm.sh examples/input/animation/driving.mp4 examples/output/custom/driving_video_tracking/
Wygeneruj syntetyczne widoki za pomocą modelu dyfuzyjnego:
python cap4d/inference/generate_images.py \
--config_path configs/generation/default.yaml \
--reference_data_path examples/output/custom/reference_tracking/ \
--output_path examples/output/custom/mmdm/
Dopasuj Gaussy do geometrii:
python gaussianavatars/train.py \
--config_path configs/avatar/default.yaml \
--source_paths examples/output/custom/mmdm/reference_images/ examples/output/custom/mmdm/generated_images/ \
--model_path examples/output/custom/avatar/ \
--interval 5000
Dla tych, którzy nie chcą wywoływać kroków indywidualnie, autorzy spakowali cały pipeline w jeden skrypt bash:
bash scripts/generate_avatar.sh examples/input/my_face/cam0/ examples/output/my_avatar/ default examples/input/animation/driving.mp4
Sprzęt i podwodne kamienie
Pipeline jest zasobochłonny. Etap MMDM wykorzystuje całą dostępną GPU, zużywa sporo pamięci VRAM i wymaga 64 GB RAM. Na pojedynczej konsumenckiej karcie graficznej generowanie obrazów może zająć pare godzin.
Druga niuans dotyczy śledzenia. Obecnie główny skrypt opiera się na zewnętrznym Pixel3DMM, który czasami zawodzi przy skomplikowanych kątach. Autorzy trenowali swoje wagi dyfuzyjne z adnotacjami z FlowFace, ale sam moduł FlowFace ma być wkrótce udostępniony w repozytorium. Z tego powodu niestandardowe generacje mogą wyglądać nieco mniej ostro niż oficjalne dema.
Dla kogo ten projekt
Jeśli pracujesz nad renderowaniem neuronowym, cyfrowymi awatarami do gier, animacją dla projektów indie lub po prostu eksplorujesz technikę 3D Gaussian Splatting, kod CAP4D zdecydowanie warto sprawdzić. Pokazuje ładnie, jak połączyć dyfuzję 2D z reprezentacją 3D przez sztywną siatkę parametryczną FLAME, omijając problem niewystarczającej liczby punktów widoku.
Do szybkiego startu zalecam najpierw pobawić się gotowymi presetami z Lincolnem i Teslą, aby ocenić wydajność renderera webowego, a dopiero potem przejść do budowania niestandardowych pipeline'ów na własnym zbiorze danych.
Powiązane projekty