Spaces:
Running on Zero
Running on Zero
Size ZeroGPU duration from measured runs; keep /optimize api_name; document results
Browse files
README.md
CHANGED
|
@@ -46,6 +46,19 @@ The **Learn2Splat** and **Adam (3DGS)** options run through the *same*
|
|
| 46 |
minibatches and step budget — only the update rule differs. That is the
|
| 47 |
like-for-like comparison the paper makes.
|
| 48 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 49 |
## Implementation notes
|
| 50 |
|
| 51 |
- Port of `demo.py --with-gui gradio` from the official
|
|
|
|
| 46 |
minibatches and step budget — only the update rule differs. That is the
|
| 47 |
like-for-like comparison the paper makes.
|
| 48 |
|
| 49 |
+
## What it shows (measured on this Space)
|
| 50 |
+
|
| 51 |
+
From the same SfM initialization (13.87 dB on the held-out views), 100
|
| 52 |
+
refinement steps over 161 training views, 8 views per step, no densification:
|
| 53 |
+
|
| 54 |
+
| optimizer | held-out PSNR | time |
|
| 55 |
+
|---|---|---|
|
| 56 |
+
| Learn2Splat (learned) | **23.91 dB** | 12.2 s |
|
| 57 |
+
| Adam (3DGS baseline) | 20.31 dB | 9.6 s |
|
| 58 |
+
|
| 59 |
+
200 learned steps reach 24.34 dB in 21.8 s. Numbers move a little run to run —
|
| 60 |
+
the per-step view minibatch is sampled at random.
|
| 61 |
+
|
| 62 |
## Implementation notes
|
| 63 |
|
| 64 |
- Port of `demo.py --with-gui gradio` from the official
|
app.py
CHANGED
|
@@ -445,11 +445,15 @@ def head_pct(step: int, n_steps: int) -> str:
|
|
| 445 |
# The run
|
| 446 |
# --------------------------------------------------------------------------
|
| 447 |
def _estimate_duration(method=METHOD_LEARNED, steps=DEFAULT_STEPS, *args, **kwargs):
|
|
|
|
|
|
|
|
|
|
|
|
|
| 448 |
try:
|
| 449 |
-
|
| 450 |
except Exception:
|
| 451 |
-
|
| 452 |
-
return int(min(
|
| 453 |
|
| 454 |
|
| 455 |
@spaces.GPU(duration=_estimate_duration)
|
|
@@ -612,7 +616,7 @@ with gr.Blocks(title="Learn2Splat") as demo:
|
|
| 612 |
run_btn = gr.Button("Run optimization", variant="primary")
|
| 613 |
status_html = gr.HTML(
|
| 614 |
_msg("SfM-initialized — pick an optimizer, then <b>Run</b>."),
|
| 615 |
-
elem_id="l2s-status",
|
| 616 |
)
|
| 617 |
with gr.Accordion("Advanced settings", open=False):
|
| 618 |
view_sl = gr.Slider(
|
|
@@ -663,6 +667,7 @@ with gr.Blocks(title="Learn2Splat") as demo:
|
|
| 663 |
# would defeat the point of watching the optimization converge.
|
| 664 |
cache_examples=False,
|
| 665 |
run_on_click=True,
|
|
|
|
| 666 |
label="Try",
|
| 667 |
)
|
| 668 |
|
|
|
|
| 445 |
# The run
|
| 446 |
# --------------------------------------------------------------------------
|
| 447 |
def _estimate_duration(method=METHOD_LEARNED, steps=DEFAULT_STEPS, *args, **kwargs):
|
| 448 |
+
"""GPU seconds to reserve. Measured on the live Space (ZeroGPU / Blackwell):
|
| 449 |
+
~0.11 s per step warm, plus ~13 s fixed (cold-worker warm-up, moving the
|
| 450 |
+
scene to VRAM, the held-out PSNR pass and the PLY export). A cold 30-step
|
| 451 |
+
run took 16.3 s end to end; this leaves ~1.4x headroom on top."""
|
| 452 |
try:
|
| 453 |
+
n = int(steps)
|
| 454 |
except Exception:
|
| 455 |
+
n = DEFAULT_STEPS
|
| 456 |
+
return int(min(180, 20 + 0.18 * n))
|
| 457 |
|
| 458 |
|
| 459 |
@spaces.GPU(duration=_estimate_duration)
|
|
|
|
| 616 |
run_btn = gr.Button("Run optimization", variant="primary")
|
| 617 |
status_html = gr.HTML(
|
| 618 |
_msg("SfM-initialized — pick an optimizer, then <b>Run</b>."),
|
| 619 |
+
label="Run status", show_label=False, elem_id="l2s-status",
|
| 620 |
)
|
| 621 |
with gr.Accordion("Advanced settings", open=False):
|
| 622 |
view_sl = gr.Slider(
|
|
|
|
| 667 |
# would defeat the point of watching the optimization converge.
|
| 668 |
cache_examples=False,
|
| 669 |
run_on_click=True,
|
| 670 |
+
api_name=False, # keep /optimize for the Run button's handler
|
| 671 |
label="Try",
|
| 672 |
)
|
| 673 |
|