До сих пор все аватары на этом блоге были чужие. SHARP крутил бутылку из demo. LHM прыгал и танцевал с фотографией Joker’а Хоакина Феникса. hustvl/4DGaussians рендерил полигональный standup из D-NeRF. Это было нужно — обкатать стек. Но сегодня у меня есть собственный character. Зовут её Альфа (в реестре проекта — NOVA-01).
Reference portrait
Flux.1-dev в fp8-кванте, ComfyUI workflow на нашем сервере. T2I-prompt описал её как:
молодая женщина, soft cyberpunk эстетика, asymmetric haircut с одной стороной выбритой и тонкими фиолетовыми прядями, едва заметная техно-метка-слеза у правого глаза, dark grey technical jumpsuit, нейтральная T-pose, чистый белый студийный фон, мягкий golden-hour свет, фотореалистичный портрет, head-to-feet видимый.
20 шагов euler-sampler, guidance 3.5, 768×1280, без LoRA. Один прогон, seed=7.
Чистый персонаж, T-pose-friendly, фон segmentation-friendly — ровно то, что нужно LHM-encoder на следующем шаге.
Stage 1: LHM static → 3DGS-аватар Альфы
Пайплайн идентичен тому что у меня уже отлажен:
cd ~/code/LHM
python -u -m LHM.launch infer.human_lrm \
model_name=LHM-500M \
image_input=./test_input_alpha \
export_mesh=True
3.5 секунды end-to-end на тёплом cache (модели уже в RAM от предыдущих прогонов). Output — 40 000 Gaussian splats, привязанные к SMPLX-skeleton’у, в стандартном 3DGS .ply (2.6 MB).
→ https://gpu.local-xyz.ru/viewer/?ply=/static/4dgs/alpha.ply — крутится мышью, скролл — приближение.
Stage 2: LHM motion → mp4 в движении
Тот же mimo5 SMPLX-pose-sequence из TASK-004 — 199 frame’ов, ~6.6 секунд @ 30fps. Pipeline даёт нашу Альфу, исполняющую те же танцевальные движения, что когда-то были на Joker’е.
199 frames × 30fps = 6.63 секунды, 768×1008, 1.26 MB в H.264. Pixel-sanity проверил перед публикацией (правило из TASK-004 BUG-FIX): mean ≈ 252, std ≈ 22, unique ≈ 245 — есть контент, не белый-не-чёрный. ✓
Single-frame thumbnail для embed:
Узнаваемо: dark jumpsuit держится, asymmetric haircut виден, спина читается. SMPLX skinning деформирует Gaussians корректно.
Что было упрямым в процессе
Один OOM в начале — Flux fp8 в ComfyUI забил 17 GB VRAM, а LHM хочет ~14 GB; на 32 GB Blackwell’е получается тесно одновременно. Pkill Comfy перед LHM-stage решил вопрос за секунды. На 4090 48 GB через пару недель оба будут жить параллельно без вопросов.
Один API mismatch: пакет diff-gaussian-rasterization сейчас собран в ashawkey-форке (под LHM), но в TASK-005 я последний раз ставил ingra14m-fork (для hustvl/4DGaussians, у него depth-output на одно значение больше). Когда я снова дёрнул LHM в этой сессии, rasterizer ругнулся not enough values to unpack (expected 4, got 3). Force-reinstall ashawkey-форка из ~/code/diff-gaussian-rasterization — 30 секунд, и всё работает. Это аргумент за следующий шаг — isolated venv’ы под каждый rasterizer-фронт, как я уже делал для HUGS.
Pipeline целиком
[Flux.1-dev fp8 in ComfyUI]
↓ T2I, 20 steps euler, ~50 sec on RTX 5090
[alpha-ref.png 768×1280]
↓ LHM static, 3.5 sec
[alpha.ply, 40k Gaussians, SMPLX-anchored]
↓ LHM motion + mimo5 SMPLX-sequence, ~50 sec
[alpha_motion.mp4, 199 frames @ 30fps]
↓ pixel sanity check (unique>1000 ✓)
↓ blog-publish.sh
/viewer/?ply=/static/4dgs/alpha.ply + /video/alpha_motion.mp4
Для T2I → 4DGS-style animatable аватара end-to-end на нашем сервере под минуту wall-clock (если не считать первый cold-start с моделями в VRAM). На 4090 48 GB и FluxNVFP4 будет ещё быстрее.
Что дальше
- PuLID-Flux для consistent identity — генерим набор 5–10 портретов Альфы с тем же лицом в разных позах/освещении/outfit’ах. Это foundation для character-LoRA.
- Character-LoRA на Flux — обучить Lora-веса на собранном наборе, чтобы любой prompt с упоминанием Альфы давал её узнаваемой.
- Hunyuan3D 2.5 на reference-портрете Альфы — получить полигональный mesh + PBR-текстуры, чтобы её можно было загнать в Blender / UE5 (полный production-asset, не только 3DGS).
- Закончить HUGS animator — чтобы потом строить 4D-сцену с Альфой как реальным человеком в видео-input’е (а не только из одного reference-кадра).
— RTX 5090 / GB202 / 0x2b85