Skip to content

Evaluate SfM and preprocessing settings against known poses #39

Description

@hummat

Problem

Every measurement in docs/evaluation.md and docs/methods_and_models.md §6.7 compared two configs on the
same SfM output. That pairing is what made small effects visible, and it also means SfM quality cancelled out
of every result. We have no evidence the current COLMAP settings are good, and none that they are bad.

scripts/sfm.sh has never had any of its knobs varied in an experiment: --matcher
(exhaustive/sequential/vocab_tree), --extra (affine shape estimation, domain size pooling, guided matching,
CPU only), the GLOMAP path, and camera model.

What is already answered elsewhere

MUGSQA (2511.06830) varies the input axes on 1,970 samples from 55
Sketchfab meshes: view count (72/36/9), resolution (1080/720/480), camera distance (5 m/2 m/1 m), and point
cloud initialisation quality. docs/evaluation.md calls it "the synthetic ground-truth benchmark we sketched
out for ourselves. It exists, and the code and data are released."

Read their per-axis numbers before re-running our own view-count experiment. That experiment is void (the
ceil bug) and would cost about 40 minutes a config to redo.

The part worth building, which is small

MUGSQA renders in Blender with exact poses in NeRF-synthetic format, so COLMAP is never in their loop. Their
initialisation axis degrades a point cloud synthetically rather than testing whether a matcher produced a
good one.

That also means their release is an SfM benchmark we get for free: rendered views plus known extrinsics is
exactly what scores COLMAP. Run each matcher variant on their images, compare against their poses, read
rotation and translation error. No rendering, no training run, minutes per config.

Caveat that decides how far to trust it: Blender renders of Sketchfab objects have no motion blur, no rolling
shutter, no textureless plaster, no auto-exposure wander. Use it to rank candidates cheaply, then confirm the
winner with one paired A/B on a real scene, everything downstream held fixed.

Coverage, so this does not get re-derived again

Measured on our own data:

Axis Where
Opacity pruning ladder docs/evaluation.md
Container (PLY/SPZ/SOG) sizes docs/methods_and_models.md §6.7
max_gs_num / cap_max §6.7
Training steps, seeding, MCMC vs ADC §6.7
Appearance embeddings vs exposure drift, 55 scenes §6.7
Transients and person masking §6.7, docs/evaluation.md
Synthetic occluders (person cutouts over R2D2, 49 of 154 frames) not written up
JPEG encoding contamination docs/evaluation.md
Eval-frame autocorrelation docs/evaluation.md

Not measured by us, and not by MUGSQA either:

  • Motion blur, sensor noise, low light. These appear in docs/troubleshooting.md as capture advice ("prevent
    motion blur, avoid fast motion or low light") with nothing behind them.
  • Rolling shutter.
  • Matcher, feature extraction and SfM backend, per above.

3DGS-QA degrades exported assets with positional noise and SH perturbation, which is a different thing from
capture-side noise and does not substitute for it.

Plan

  1. Read MUGSQA's view-count and initialisation results. Decide from those whether the frame-count rerun is
    worth 40 minutes a config.
  2. If a matcher question survives that, score COLMAP variants against MUGSQA's poses.
  3. Confirm any winner with one paired A/B on gaudi_fountain, everything after SfM held fixed.
  4. Seed gandalf, legolas, lizard_landscape and lizard_portrait, which lack sparse_pc.ply. Check
    whether the COLMAP sparse model survived first; if it did, this is a processing re-run and not an SfM one.

Do not build a synthetic benchmark for this. Step 2 uses someone else's.

Related

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestpipelinePipeline (scripts/run.sh)

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions