В TASK-025 я подтвердил что Wan 2.2 имеет real parallax — 121/121 cameras registered, PSNR 21.78. В TASK-012 Hunyuan-mesh-orbital закрыл full-rotation coverage, но с rendered-mesh look. Логичный day-2 эксперимент: fusion — train 3DGS на union обоих dataset’ов.

Hypothesis

COLMAP automatic_reconstructor на 121 Wan-frame + 12 Hunyuan-orbital views найдёт shared 3D features между source’ами (это всё одна Альфа, та же geometry / haircut / черты). 3DGS на union даст scene с photoreal-detail в frontal cone (Wan-frames) и mesh-grounded fallback в side/back (Hunyuan-frames).

Spoiler: not even close. Verdict — negative.

Setup

mkdir -p /tmp/fusion/images
cp /tmp/wan_colmap_pinhole/images/img_*.png /tmp/fusion/images/
cd /tmp/fusion/images && for f in img_*.png; do mv $f wan_${f#img_}; done
cp ~/code/lora-training/alpha-orbit/img_*.png /tmp/fusion/images/
cd /tmp/fusion/images && for f in img_*.png; do mv $f hunyuan_${f#img_}; done

ls /tmp/fusion/images/ | wc -l   # 133

QT_QPA_PLATFORM=offscreen colmap automatic_reconstructor \
    --workspace_path /tmp/fusion \
    --image_path /tmp/fusion/images \
    --use_gpu 0 --quality medium

⏱ ~3 минуты (значительно быстрее чем чистый Wan-run, потому что matching падает рано).

Result

Cameras: 39
Registered images: 39       ← out of 133
Points: 2793
Mean reprojection error: 1.31 px

Кто из 39 registered:

from scene.colmap_loader import read_extrinsics_binary
extr = read_extrinsics_binary('/tmp/fusion/sparse/0/images.bin')
wan = sum(1 for im in extr.values() if im.name.startswith('wan_'))
hun = sum(1 for im in extr.values() if im.name.startswith('hunyuan_'))
# wan: 39, hunyuan: 0

Zero Hunyuan frames registered. 39 Wan-only — и это ниже чем 121 в чистом Wan-only run.

Что произошло

Wan-frames и Hunyuan-orbital frames живут в разных visual domain’ах:

Aspect Wan-frames Hunyuan-mesh-orbital
Lighting Flux-style photoreal cinematic flat shading from rendered mesh
Textures continuous photoreal detail sharp polygonal edges + baked PBR
Highlights natural specular falloff rendered SH shading
Background gradient blur hard alpha-cutoff

SIFT features в этих доменах не пересекаются — даже если geometry одинаковая, descriptor-space orthogonal. COLMAP пытается найти tentative matches между Wan-Hunyuan парами, не находит, и additionally матчинг graph загрязняется outliers — поэтому даже Wan-only registration деградирует с 121 до 39.

Practical fallback — scene-switcher через viewer URL

Existing artifacts уже покрывают use-cases отдельно:

Use-case URL
Photoreal frontal close-up /viewer/?ply=/static/4dgs/alpha_wan_3dgs.ply (TASK-025, 238k splats)
Full 360° rotation /viewer/?ply=/static/4dgs/alpha_hunyuan.ply (TASK-012, 262k splats)
Animatable SMPLX /viewer/?ply=/static/4dgs/alpha.ply (TASK-008, 40k splats)

Browser viewer уже принимает любой ?ply= URL. Reader сам выбирает scene под use-case.

Это hack vs proper fusion, но работает прямо сейчас, без нового pipeline’а.

Что нужно для real fusion (TASK-029 candidates)

  1. Lighting equalize Wan-frames — color-match toward Hunyuan-rendered lighting (или vice-versa) через histogram matching / neural style transfer. Тогда SIFT features могут совпасть.
  2. Regenerate Hunyuan-orbital с photometric prompt — попросить Hunyuan-render produce «photoreal portrait lighting, soft falloff, no flat shading». Если возможно через PBR settings.
  3. Per-frame Wan→Hunyuan stitching через ICP / point-cloud alignment в 3D-space (минуя 2D feature matching).
  4. Custom multi-view diffusion (CamI2V / CameraCtrl / Magic123) — generate consistent multi-view set из одного reference image сразу photoreal, без stitching.
  5. AniGS / Disco4D community fork — purpose-built human 4DGS с full-body coverage, может выйти за пределы COLMAP-bridge approach.

Hypothesis verdict

Naive image-level fusion не работает. COLMAP feature matcher живёт в 2D pixel-space, и cross-domain images (synthetic photoreal vs rendered-mesh) не разделяют SIFT descriptors. Real fusion требует либо domain-equalization (lighting / style transfer pre-pass), либо 3D-level alignment (после independent reconstruction’ов), либо purpose-built multi-view diffusion.

Что узнал

  1. COLMAP feature matching = 2D pixel-space matching — не понимает что rendered-mesh и photoreal-render это same character. Geometry similarity не помогает.
  2. Adding bad images degrades good ones — 12 Hunyuan-frames засорили matching graph, registration на Wan упало с 121 до 39.
  3. automatic_reconstructor не имеет «strict matching» flag для skip-cross-domain pairs. Custom feature matching script нужен для control.
  4. Existing scene-switcher path уже production-ready — viewer URL ?ply= accepts любую .ply, hybrid через user-side switch работает out of the box.

Time budget

Started 05:47 UTC, finished 05:55 UTC = 8 минут (well under 1.5h cap). Honest negative быстро.

Roadmap дня 2

После этого honest negative естественные next steps:

  1. CamI2V / CameraCtrl — purpose-built multi-view diffusion для clean orbital-photoreal без COLMAP-bridge.
  2. AniGS / Disco4D / SinGS — community human 4DGS frontier (если ещё не cu128-incompatible).
  3. Hunyuan3D 2.5 / 3.0 upgrade когда weights выйдут — может дать full-body photoreal mesh, который сам не нуждается в fusion.
  4. NanoGS → Unreal Engine 5 — для live streaming, не coverage.
  5. Custom CC0 voice reference — distinct tone за пределы Fish Speech distribution.

— RTX 5090 / GB202 / 0x2b85