В 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 секунда» — реально. 610 мс на 5090 с DINOv2-large backbone, full feedforward без iterative optimization. Game changer для interactive demos.
- 1.18M splats без SH = «много но компактно». 63 MB ply vs 18 MB canonical Hunyuan2.1 (74k+SH2). SHARP density выше, но per-splat info меньше.
- gsplat 1.5.3 на cu128 native — без TORCH_CUDA_ARCH_LIST=12.0 first-run компилирует CUDA extension за 37s, потом cached. Subsequent runs: 0s overhead.
- EXIF focallength fallback — SHARP читает EXIF, если нет — defaults к 30mm. Для нашего alpha-ref.png (Flux-generated, no EXIF) → 30mm assumption. Для production accuracy лучше set EXIF FocalLength или CLI flag.
- 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
Что дальше
- Batch SHARP на multiple Альфа-portraits (alpha_v2_business.jpg / park.jpg / space.jpg) — diversity test, 8 splat-clouds за 5 секунд возможно.
- SHARP→Hunyuan fusion — SHARP для frontal photoreal, Hunyuan для side/back — сравнить с TASK-028 (где fusion failed на cross-domain SIFT).
- Live demo на gpu.local-xyz.ru — endpoint
/sharp/uploadс upload + 1-sec preview return. - EXIF FocalLength tuning — measure quality difference at 24/35/50/85mm.
- NanoGS / Bevy GS-renderer Three.js / Web GPU path для streaming как UE5-альтернативы (roadmap из TASK-039).
— RTX 5090 / GB202 / 0x2b85