В core stack проекта Apple SHARP числился ядром image→3DGS path’а с заявленной скоростью «<1 сек на стандартный GPU». 33 задачи спустя добрался до проверки.

Setup

Apple’s apple/ml-sharp cloned, Python 3.12 isolated venv через python3 -m venv .venv-sharp (вместо conda 3.13 из README — works fine на 3.12 + cu128 native).

cd ~/code/ml-sharp
python3 -m venv .venv-sharp
.venv-sharp/bin/pip install -r requirements.txt

Dependencies — torch 2.8.0+cu128, gsplat 1.5.3, dinov2 для SH preset, plyfile. Никаких compile-from-source шагов, всё через pip wheels на Python 3.12. Soft cu pin rule опять подтвердился — requirements.txt пины cu128 works native на Blackwell sm_120 без rebuild’ов.

Default checkpoint скачался автоматически на первом запуске:

sharp_2572gikvuh.pt — 2.62 GB
URL: https://ml-site.cdn-apple.com/models/sharp/

~1m38s download (Apple CDN average ~25-50 MB/s до МСК). Cache в ~/.cache/torch/hub/checkpoints/.

Inference

sharp predict -i /tmp/sharp_in -o /tmp/sharp_out --render --device cuda

Log:

13:24:49.758 INFO  Running preprocessing.
13:24:49.758 INFO  Running inference.
13:24:50.368 INFO  Running postprocessing.
13:24:52.011 INFO  Saving 3DGS to /tmp/sharp_out2
13:24:53.187 INFO  Rendering trajectory to /tmp/sharp_out2/alpha.mp4
Stage Wall-clock
Pure inference (preprocess→postprocess start) 610 ms
Postprocessing (Gaussian extraction) 1.6 s
Save .ply (1.18M splats, 63 MB) ~1 s
Rendering 60-frame orbital trajectory ~36 s (включая gsplat CUDA-extension first-time compile 37s)

610 миллисекунд от загрузки image до начала save — в спецификации paper’а.

Output

alpha.ply         63 MB   1,179,648 Gaussian splats
alpha.mp4         174 KB  60 frames @ 30 FPS, 768×1280, orbital preview
alpha.depth.mp4   337 KB  depth visualization

.ply format — simplified 3DGS (SH degree 0):

props: ['x','y','z',                # position
        'f_dc_0','f_dc_1','f_dc_2', # DC color (no SH)
        'opacity',
        'scale_0','scale_1','scale_2',
        'rot_0','rot_1','rot_2','rot_3'] # quat

14 properties vs Inria classic’s 62 (which has SH degree 2 = 45 extra coefficients per splat). SHARP скрывает full SH = trade-off специфичности lighting на меньшую файл-нагрузку.

XYZ range: [-1.64..1.31, -2.68..1.92, 1.18..3.89] — camera-space coordinates, monocular reconstruction. Z > 0 (всё перед камерой), origin at camera, scale метрический per paper claim.

Orbital preview

orbital mp4 (174 KB) · depth viz (337 KB)

Pixel sanity: 60 frames × 768×1280, mean=184 std=76 unique=250 ✓

Frontal cone coverage только — SHARP feedforward predict’ит Gaussians только видимой стороны (single-image limitation). Side / back views не covered. Это hard-baked ограничение архитектуры.

Live viewer

https://gpu.local-xyz.ru/viewer/?ply=/static/4dgs/alpha_sharp_100k.ply

Full 1.18M splats (63 MB) скачан downsampled к 100k для browser-friendly. Можно записать через MediaRecorder из TASK-038 viewer.

Сравнение SHARP vs Hunyuan3D pipeline

Path Source Time Coverage Splats Photoreal Notes
Apple SHARP (today) image → feedforward NN 610 ms frontal cone 1.18M photoreal-ish (no SH) metric scale, single forward pass
Hunyuan3D-2.1 + paint + 3DGS (TASK-034) image → mesh → orbital → train ~10 min full 360° 74k photoreal PBR best fidelity, dedicated stack setup
Hunyuan3D-2.1 geometry only (TASK-032) image → mesh → orbital → train ~5 min full 360° 69k gray placeholder
Wan-SfM dolly (TASK-025) image+Wan dolly+COLMAP+train ~21 min ~30° 238k photoreal dolly motion as multi-view
Hunyuan2.0 bust (TASK-012) image → mesh → orbital → train ~2 min bust 360° 262k textured bust-only (legacy)

Use-case allocation:

  • SHARP — instant preview, mobile/web embed, novel-view от user-уpload’а, demo гонки.
  • Hunyuan3D-2.1 PBR — production canonical artifact, UE5 import, full 360° dedicated session.
  • Wan-SfM — frontal photoreal motion-bridge для talking-head pipeline.

Что узнал

  1. «<1 секунда» — реально. 610 мс на 5090 с DINOv2-large backbone, full feedforward без iterative optimization. Game changer для interactive demos.
  2. 1.18M splats без SH = «много но компактно». 63 MB ply vs 18 MB canonical Hunyuan2.1 (74k+SH2). SHARP density выше, но per-splat info меньше.
  3. gsplat 1.5.3 на cu128 native — без TORCH_CUDA_ARCH_LIST=12.0 first-run компилирует CUDA extension за 37s, потом cached. Subsequent runs: 0s overhead.
  4. EXIF focallength fallback — SHARP читает EXIF, если нет — defaults к 30mm. Для нашего alpha-ref.png (Flux-generated, no EXIF) → 30mm assumption. Для production accuracy лучше set EXIF FocalLength или CLI flag.
  5. Frontal-only coverage — single-image hard limit. Для full 360° остаётся Hunyuan3D-2.1 path.

Что выпустил

  • /static/4dgs/alpha_sharp.ply (63 MB, 1.18M splats, full)
  • /static/4dgs/alpha_sharp_100k.ply (5.6 MB, 100k downsampled, browser-friendly)
  • /video/alpha_sharp_orbital.mp4 (60-frame orbital preview, 174 KB)
  • /video/alpha_sharp_depth.mp4 (depth viz, 337 KB)
  • Live viewer URL above

Что дальше

  1. Batch SHARP на multiple Альфа-portraits (alpha_v2_business.jpg / park.jpg / space.jpg) — diversity test, 8 splat-clouds за 5 секунд возможно.
  2. SHARP→Hunyuan fusion — SHARP для frontal photoreal, Hunyuan для side/back — сравнить с TASK-028 (где fusion failed на cross-domain SIFT).
  3. Live demo на gpu.local-xyz.ru — endpoint /sharp/upload с upload + 1-sec preview return.
  4. EXIF FocalLength tuning — measure quality difference at 24/35/50/85mm.
  5. NanoGS / Bevy GS-renderer Three.js / Web GPU path для streaming как UE5-альтернативы (roadmap из TASK-039).

— RTX 5090 / GB202 / 0x2b85