Skip to content

Expose Ceres solver thresholds in incremental mapping - #4892

Merged
ahojnnes merged 4 commits into
colmap:mainfrom
cola1917:feat/expose-ba-solver-thresholds-4446
Oct 28, 2026
Merged

ahojnnes merged 4 commits into
colmap:mainfrom
cola1917:feat/expose-ba-solver-thresholds-4446

Conversation

@cola1917

Copy link
Copy Markdown
Contributor

Closes #4446.

This implements the threshold-exposure alternative: callers can configure the existing Ceres solver-selection thresholds for incremental mapping without rebuilding COLMAP. The copy-returning BA getters and the broader BA options structure are unchanged.

Changes

  • Expose all five existing image-count thresholds through IncrementalPipelineOptions, Mapper.ba_* CLI/project options, and PyCOLMAP.
  • Forward the values to both local and global Ceres BA, preserving the existing defaults and threshold-ordering checks. No changes to solver algorithms or Caspar configuration.
  • Document the mapper-specific options and add default/propagation/validation, CLI/project round-trip, and Python regressions. Run the existing synthetic incremental reconstruction test with both the default dense-CPU threshold and a threshold of zero.

Validation

Built COLMAP and PyCOLMAP from this branch in a Linux CPU-only environment (GCC 11.4, Ceres 2.2.0, Python 3.10).

  • ctest --test-dir build-cpu --output-on-failure -R '^controllers/(incremental_pipeline_test|option_manager_test)$': 40 tests passed across the two executables.
  • python -m pytest src/pycolmap/sfm src/pycolmap/estimators/bundle_adjustment_test.py: 107 passed, including all 36 incremental-mapper cases.
  • Installed colmap mapper -h exposes the five new options with unchanged defaults.
  • Repository formatting scripts (clang-format 23.1.3 / ruff 0.16.10) and git diff --check pass.

CUDA solver execution/performance and the full repository suite were not tested.

cola1917 and others added 2 commits October 24, 2026 13:08
Add CHECK_OPTION_GE(..., 0) for all five solver thresholds in
IncrementalPipelineOptions::Check(), so negative values fail validation
instead of silently changing solver selection. Also note in the header
that the defaults mirror CeresBundleAdjustmentOptions.

@ahojnnes ahojnnes left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, LGTM.

@ahojnnes
ahojnnes enabled auto-merge (squash) October 27, 2026 08:18
Fixes the ClangTidy performance-inefficient-vector-operation error
(push_back in a loop) that also caused the Coverage job to be cancelled
by matrix fail-fast.
@cola1917

Copy link
Copy Markdown
Contributor Author

I could not reproduce the Windows automatic reconstruction failure locally. I built the failed CI merge commit (945c104343bf, PR head c09f1e6637ee) with the pinned vcpkg baseline, Release, GUI enabled and CUDA disabled, then ran automatic_reconstruction_test in 10 separate processes with fresh temporary directories: all 20 tests passed, with no skips. This was in Windows 11 Sandbox with VS 2026; the OS and CMake version differ from CI, so this does not rule out a runner-specific issue. Could a maintainer please rerun the Windows workflow? Thank you!

@ahojnnes ahojnnes added the full-ci Run Windows and remaining pycolmap CI label Oct 28, 2026
@ahojnnes
ahojnnes merged commit f00d606 into colmap:main Oct 28, 2026
18 of 21 checks passed
fringehush-gif added a commit to fringehush-gif/colmap that referenced this pull request Nov 3, 2026
## Summary
- Integrate all 12 upstream commits after the shared base 9371f7b, including LoMa BF16 loading, matching-worker error propagation, keypoint shape scaling, and project-file CLI overrides.
- Preserve the fork's CUDA blocking-sync helper alongside upstream's BF16 device check and register the shared CUDA test once.

## Validation
- Resolved all merge conflicts; no conflict markers or unmerged paths remain; git diff --check passes.
- Incremental Linux CUDA build linked six focused test executables. The prepared custom Ceres closure required its existing Abseil/CUDA library directories on the linker's search path.
- CTest passed controllers/base_option_manager_test, feature_matching_utils_test, incremental_pipeline_test, option_manager_test, feature/loma_test, and util/cuda_test (six programs, one run each).
- No full suite, Python binding, end-to-end, or performance claim.

## Upstream commits

- `ea470c0c4f4a40a3bdfa33d01eb38375c5df64de` Run Windows and remaining pycolmap CI only with the full-ci label (colmap#4904)
- `c0339e95482c404b51f38ff9b86866de495984f0` Fix MSVC warnings C4805, C4996, and C4756 (colmap#4910)
- `f00d6063bb0b120cf10ee190f7f06f4a34edf432` Expose Ceres solver thresholds in incremental mapping (colmap#4892)
- `978a4467f36bbfc9ae18780f2dca253000b0d008` Keep division-camera derivatives finite on the optical axis (colmap#4888)
- `98f31541f483788ab550f5c4a4e0804e8674b9e0` Fix leak and check covariance in CovarianceWeightedCostFunction (colmap#4911)
- `a467519441171054c7aaa17dffe86fe06431f05c` Avoid stack overflow when compressing union-find chains (colmap#4906)
- `404b83db2c2cc04892e14a578ddfa73e0ac9bfb1` Fix LoMa bf16 fallback on CUDA by loading it like any other model (colmap#4924)
- `d02e6701dede22eaeee89f73784a8c79f6f289ac` Add max_num_features option to automatic_reconstructor and benchmark (colmap#4907)
- `82c3b5db78d96a7e93ca7b8b2af0634e28aa33f4` Propagate errors of feature matching workers instead of terminating (colmap#4921)
- `4afe8d1156a71a2ff33974895f221c8eb3740cb1` Rescale keypoint shapes in image coordinates (colmap#4926)
- `ce2b5ab9df3801c2b75edbba338c04ad3c8cc6af` Fix vocabulary tree builder descriptor dimensions (colmap#4923)
- `f956ce629c21a88d75a7f7b3107298d1faf3dcf3` Fix command-line overrides for project files (colmap#4902)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

full-ci Run Windows and remaining pycolmap CI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Unify BA options OR expose solver thresholds during incremental_mapping

2 participants