multimodalart HF Staff commited on
Commit
b8afc4c
·
verified ·
1 Parent(s): 8011cab

Size ZeroGPU duration from measured runs; keep /optimize api_name; document results

Browse files
Files changed (2) hide show
  1. README.md +13 -0
  2. app.py +9 -4
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
- s = int(steps)
450
  except Exception:
451
- s = DEFAULT_STEPS
452
- return int(min(280, 45 + 1.1 * s))
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