From 5c53d7af557d27d00028560fdd014b59afd10fa5 Mon Sep 17 00:00:00 2001 From: nantonzhang Date: Thu, 16 Apr 2026 14:53:36 -0400 Subject: [PATCH] patch mvo --- gtsfm/cluster_optimizer/cluster_mvo.py | 14 ++++++++++++++ gtsfm/configs/unified_megaloc.yaml | 16 ++++++++-------- gtsfm/runner.py | 9 ++++++++- run | 6 +++--- 4 files changed, 33 insertions(+), 12 deletions(-) diff --git a/gtsfm/cluster_optimizer/cluster_mvo.py b/gtsfm/cluster_optimizer/cluster_mvo.py index bf7e99bcb..143e4ed60 100644 --- a/gtsfm/cluster_optimizer/cluster_mvo.py +++ b/gtsfm/cluster_optimizer/cluster_mvo.py @@ -58,6 +58,11 @@ def __init__( correspondence_generator: CorrespondenceGeneratorBase, two_view_estimator: TwoViewEstimator, multiview_optimizer: MultiViewOptimizer, + drop_outlier_after_camera_merging: bool | None = None, + drop_child_if_merging_fail: bool | None = None, + drop_camera_with_no_track: bool | None = None, + plot_reprojection_histograms: bool | None = None, + run_bundle_adjustment_on_parent: bool | None = None, dense_multiview_optimizer: Optional[MVSBase] = None, gaussian_splatting_optimizer: Optional[Any] = None, save_gtsfm_data: bool = True, @@ -68,6 +73,15 @@ def __init__( ) -> None: super().__init__(output_worker=output_worker) self._pose_angular_error_thresh = pose_angular_error_thresh + # These legacy cluster-merging options are still present in several Hydra configs, + # but the leaf-only MVO optimizer does not consume them directly. + _ = ( + drop_outlier_after_camera_merging, + drop_child_if_merging_fail, + drop_camera_with_no_track, + plot_reprojection_histograms, + run_bundle_adjustment_on_parent, + ) # assign MVO-only correspondence generator on this instance self.correspondence_generator = correspondence_generator self.two_view_estimator = two_view_estimator diff --git a/gtsfm/configs/unified_megaloc.yaml b/gtsfm/configs/unified_megaloc.yaml index 1ef266186..c7ede0e24 100644 --- a/gtsfm/configs/unified_megaloc.yaml +++ b/gtsfm/configs/unified_megaloc.yaml @@ -113,11 +113,11 @@ cluster_optimizer: calibration_prior_focal_sigma: 20.0 measurement_noise_sigma: 1.0 - # comment out to not run - dense_multiview_optimizer: - _target_: gtsfm.densify.mvs_patchmatchnet.MVSPatchmatchNet - - gaussian_splatting_optimizer: - _target_: gtsfm.splat.gaussian_splatting.GaussianSplatting - cfg: - _target_: gtsfm.splat.gaussian_splatting.Config + # # comment out to not run + # dense_multiview_optimizer: + # _target_: gtsfm.densify.mvs_patchmatchnet.MVSPatchmatchNet + + # gaussian_splatting_optimizer: + # _target_: gtsfm.splat.gaussian_splatting.GaussianSplatting + # cfg: + # _target_: gtsfm.splat.gaussian_splatting.Config diff --git a/gtsfm/runner.py b/gtsfm/runner.py index fea7fb9f1..92fd294d0 100644 --- a/gtsfm/runner.py +++ b/gtsfm/runner.py @@ -289,7 +289,13 @@ def _set_mvo_overwrites(self, scene_optimizer: "SceneOptimizer", main_cfg) -> No if not self.parsed_args.run_mvs: multiview_optimizer.dense_multiview_optimizer = None logger.info("🔄 Disabled Multiview dense MVS optimizer via CLI flag --run_mvs=False") - OmegaConf.update(main_cfg, "cluster_optimizer.dense_multiview_optimizer", None, merge=False) + OmegaConf.update( + main_cfg, + "cluster_optimizer.dense_multiview_optimizer", + None, + merge=False, + force_add=True, + ) # Override gaussian splatting if self.parsed_args.run_gs: @@ -305,6 +311,7 @@ def _set_mvo_overwrites(self, scene_optimizer: "SceneOptimizer", main_cfg) -> No "cluster_optimizer.gaussian_splatting_optimizer", gs_cfg.gaussian_splatting_optimizer, merge=False, + force_add=True, ) else: multiview_optimizer.gaussian_splatting_optimizer = None diff --git a/run b/run index cd319a028..10767c63d 100755 --- a/run +++ b/run @@ -11,7 +11,7 @@ else fi if [ "$#" -eq 0 ]; then - exec "${PYTHON_CMD[@]}" gtsfm/runner.py --help + exec "${PYTHON_CMD[@]}" -m gtsfm.runner --help else - exec "${PYTHON_CMD[@]}" gtsfm/runner.py "$@" -fi \ No newline at end of file + exec "${PYTHON_CMD[@]}" -m gtsfm.runner "$@" +fi