Skip to content

Keep division-camera derivatives finite on the optical axis - #4888

Merged
ahojnnes merged 1 commit into
colmap:mainfrom
aswanth-07:fix/division-optical-axis-jacobians
Oct 28, 2026
Merged

ahojnnes merged 1 commit into
colmap:mainfrom
aswanth-07:fix/division-optical-axis-jacobians

Conversation

@aswanth-07

Copy link
Copy Markdown
Contributor

SIMPLE_DIVISION and DIVISION project (0, 0, w) correctly for positive depth, but Ceres automatic differentiation returns NaN Jacobians. This reaches rig reprojection and fixed-point reprojection cost functions even with zero distortion. Ordinary bundle adjustment uses the existing analytic derivatives and is unaffected.

Both projection templates compute sqrt(u*u + v*v) and then square it again. The intermediate square root has an undefined derivative at zero, although the squared-radius expression in the division model is smooth there. I use u*u + v*v directly in both templates, matching the existing analytic implementation.

I added exact optical-axis inputs to the camera-Jacobian test helper. Its floating-point grid steps from -0.5 by 0.1 and misses exact zero. Both division-model tests fail on unchanged production code and pass with this correction. Parameter order, model IDs, projection branch selection and stored camera files stay unchanged.

Validation on Windows with MSVC, Eigen 3.4 and Ceres 2.2:

  • All 66 native tests pass across camera models, model Jacobians and reprojection cost functions. I compiled the repository test sources in a focused native build and ran models_test.exe --gtest_brief=1, models_jacobian_test.exe --gtest_brief=1 and reprojection_error_test.exe --gtest_brief=1.
  • Actual rig and fixed-point cost functions pass 18 parameter combinations each, with finite Jacobians and the independently expected optical-axis derivatives.
  • 432 off-axis controls preserve projection and derivative values within 1e-12*(1+abs(base)). Six negative-discriminant controls remain rejected, and repeated fresh-process outputs match.
  • Full-file clang-format and git diff --check pass.

The full COLMAP build, reconstruction datasets, Python-extension build, GPU paths and other operating systems were not tested locally.

AI assistance disclosure: AI-assisted development tools were used during investigation and implementation. The reported tests were run against the final diff.

@aswanth-07
aswanth-07 marked this pull request as ready for review October 24, 2026 01:00
@ahojnnes
ahojnnes enabled auto-merge (squash) October 28, 2026 09:58
@ahojnnes
ahojnnes merged commit 978a446 into colmap:main Oct 28, 2026
16 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

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants