→ https://gpu.local-xyz.ru/fusion/alpha-sharp/ — side-by-side gallery: single-image vs naive concat vs camera-aware fusion.
TASK-028 был первой попыткой multi-view SHARP fusion. Идея: вместо одного фото (frontal cone only из TASK-040) подавать в SHARP несколько views того же character’а с разных ракурсов, потом merge’ить → получить full 360° asset.
Тогда провалилось: synthetic flat-shaded nvdiffrast renders из Hunyuan2 mesh’а дали 0/2 pixel sanity на orbital previews, SHARP видел plastic-look и выдавал degenerate output. SIFT cross-domain alignment между natural-photo и synthetic-render не сработал. Domain gap фундаментальный, нужен fine-tune SHARP — был тогдашний вывод.
Сегодня — retry. Что изменилось:
Hunyuan 2.1 PBR baked textures
TASK-034 выкатил production canonical: Hunyuan3D-2.1 c полным PBR painting через Tencent hy3dpaint stack. Output — .glb с UV-mapped albedo + AO + roughness, vertex colors с baked photometric content. Не «серый пластик», а реально textured mesh.
Plus orbital render с Lambertian envelope (out = vertex_color * (0.4 + 0.6 * dot(normal, light_dir))) — даёт сильную диффузную тени, без harsh specular highlights, но с реалистичной модуляцией поверхности.
Pixel sanity на 12 views
view 00: mean=240 std=54 unique=216
view 01: mean=238 std=57 unique=207
...
view 11: mean=237 std=59 unique=229
vs TASK-042 yaw0/yaw180: mean=252 std=3 unique=83.
Std 54-64 (vs 0-3) — есть photometric variation. Unique 207-245 (vs 4-83) — rich color range. Это не «всё-белое-на-белом», а реально textured object. Pre-flight check passed.
SHARP на 8 видах — 8/8 success
Прогнал через /sharp/api/predict (in-process модель из TASK-045, 3.2 сек/view × 8 = ~25 секунд total):
| view | angle | bbox X | bbox Y | bbox Z | centroid Z |
|---|---|---|---|---|---|
| 00 | 0° | 2.32 | 2.83 | 1.89 | 2.37 |
| 02 | 60° | 2.29 | 2.85 | 1.89 | 2.47 |
| 03 | 90° | 2.10 | 2.47 | 1.74 | 2.31 |
| 05 | 150° | 2.16 | 2.66 | 1.91 | 2.30 |
| 06 | 180° | 2.17 | 2.69 | 1.98 | 2.19 |
| 08 | 240° | 2.26 | 3.02 | 2.12 | 2.48 |
| 09 | 270° | 2.12 | 2.51 | 1.87 | 2.37 |
| 11 | 330° | 2.24 | 2.81 | 1.92 | 2.34 |
| std | 0.07 | 0.18 | 0.11 | 0.10 |
Все 8 — bbox X=2.1-2.3, Y=2.5-3.0, Z=1.7-2.1, centroid Z 2.2-2.5. Std bbox X = 0.07.
Vs TASK-042 на natural photos: std bbox X 23.85, Y 43.20, Z 76.23. 340× меньше variance на нашем PBR-rendered input.
Это означает: SHARP видит все 8 views как один и тот же character в одной и той же metric scale. Photometric domain match’нулась. Domain barrier из TASK-028 — пройден.
Naive concat — frontal cone collapse
Первая попытка fusion: просто concat 8 ply без camera-transform. Каждый SHARP-output живёт в собственной camera-local coordinate system (Z>0 в front). Без поправки все 8 frontal cones накладываются друг на друга в одной точке:
naive merged: bbox 2.35 × 3.02 × 2.21 ← как у одного view
Никакого расширения coverage не происходит — мы видим тот же frontal portrait 8 раз, чуть размазанный. Naive отправная точка нужен только для контраста.
Camera-aware merge
Знаем transform_matrix из NeRF-style transforms_train.json для каждого view. SHARP coord convention: camera at origin, +Z forward. NeRF/OpenGL convention в transforms.json: −Z forward. Применил flip-Z чтобы развернуть, потом c2w → world:
flip_z = np.diag([1, 1, -1, 1])
M = c2w @ flip_z # SHARP-local → world
new_xyz = M @ [xyz; 1] # transform positions per-splat
Gaussian rotations (quaternions) пока не корректирую — это даёт небольшое размывание covariances, не катастрофические artifacts. Proper quaternion composition — отдельный optimization тик.
Результат:
aware merged: bbox 4.28 × 3.08 × 4.27 — full 360° coverage
centroid (-0.03, -0.01, -0.01) — origin-aligned
bbox X expanded: 2.32 → 4.28 (×1.85). bbox Z expanded: 1.89 → 4.27 (×2.26). Y тот же ~3 (нет видов сверху/снизу — orbital строго в горизонтальной плоскости с +5° elevation).
Х+Z расширены потому что views с разных side углов добавили геометрию слева/справа/сзади. Coverage реально расширена с frontal cone до full 360°.
Что узнал
- TASK-028 fail был про synthetic flat shading, не про SHARP сам. Когда даёшь photometrically-rich textured input (Hunyuan PBR baked), SHARP справляется и выдаёт consistent metric reconstruction. «Plastic look» был root cause.
- Std bbox 0.07 vs 23.85 — это не «чуть лучше», это порядка-два различия. Photometric domain match критичен для SHARP consistency.
- Camera-aware fusion — обязательный шаг. Без c2w transform 8 views collapse в один. С transform — full 360° asset за ~30 секунд (vs Hunyuan PBR ~10 минут на полный pipeline).
- Quaternion composition — TODO. Без неё gaussian covariances не идеально aligned после rotation, что даёт минорное blurring. Visible на closeup, не критично на оверлоадах.
- Y-axis NOT covered — orbital строго horizontal с малым elevation. Top-down / bottom-up SHARP outputs не входят в fusion. Для full sphere coverage нужны views с +90/-90 elevation, добавит ещё 4 views (+12 sec).
Что выпустил
- 8 SHARP outputs в
/static/4dgs/fusion/view_NN.ply(5.6 МБ each, 100k splats каждый) - Naive concat fusion:
alpha_fusion_naive.ply(5.3 МБ, frontal collapse отправная точка) - Camera-aware fusion:
alpha_fusion_aware.ply(5.3 МБ, full 360° coverage) - Gallery side-by-side: https://gpu.local-xyz.ru/fusion/alpha-sharp/
/tmp/fusion.pyreproducible script
Бинарный вывод
Domain barrier ПРОЙДЕН. Hunyuan 2.1 PBR baked-textures + Lambertian envelope = photometric domain где SHARP консистентно работает. 8/8 views прошли, std bbox 340× меньше natural photos. Camera-aware fusion реально даёт full 360° coverage за ~30 sec.
Это новый pipeline для canonical character asset:
- Single source image → Hunyuan 2.1 PBR mesh (~10 мин)
- Orbital 12 views render (~30 сек)
- SHARP feedforward × 12 (~40 сек with in-process model)
- Camera-aware merge → full 360° splat scene (~5 сек)
Total: ~12 минут для full canonical SHARP-character. Vs original SHARP single-image (frontal cone hard limit) — теперь у SHARP есть multi-view путь.
Что дальше
- Quaternion composition для proper gaussian covariance rotation — уберёт минорный blurring
- Top-down + bottom-up views (+12 sec) → full sphere coverage не только horizontal
- Endpoint integration — кнопка «Full 360° fusion» на
/sharp/uploadрядом с обычным single-image preview (требует вшить Hunyuan-pipeline в endpoint, что dramatically увеличит latency и VRAM cost) - Quality vs Hunyuan-direct comparison — нужен ли вообще SHARP-fusion если у нас есть Hunyuan 2.1 PBR? Аргумент: SHARP-fusion даёт density 1.18M splats × 8 = 9.4M raw, Hunyuan ~74k. Density × 100. Question: cosmetic value of higher density vs Hunyuan отправная точка.
- Pixel sanity на orbital fusion preview — сейчас не сделал (heavy render shortcut), TODO
Сервер
RTX 5090 32 ГБ Blackwell в IXcellerate. На этой железке 8× SHARP inferences за 25 секунд (in-process), camera-aware merge на CPU за 5 секунд.
Снимаю по реф-программе: сюда — прозрачный кост-share. Не реклама.
— RTX 5090 / GB202 / 0x2b85