{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/mp-sfm-monocular-surface-priors-for-robust","title":"MP-SfM: Monocular Surface Priors for Robust Structure-from-Motion","arxiv_id":"2504.20040","date":"2025-04-28","proceeding":"CVPR 2025 1","authors":["Zador Pataki","Paul-Edouard Sarlin","Johannes L. Schönberger","Marc Pollefeys"],"abstract":"While Structure-from-Motion (SfM) has seen much progress over the years, state-of-the-art systems are prone to failure when facing extreme viewpoint changes in low-overlap, low-parallax or high-symmetry scenarios. Because capturing images that avoid these pitfalls is challenging, this severely limits the wider use of SfM, especially by non-expert users. We overcome these limitations by augmenting the classical SfM paradigm with monocular depth and normal priors inferred by deep neural networks. Thanks to a tight integration of monocular and multi-view constraints, our approach significantly outperforms existing ones under extreme viewpoint changes, while maintaining strong performance in standard conditions. We also show that monocular priors can help reject faulty associations due to symmetries, which is a long-standing problem for SfM. This makes our approach the first capable of reliably reconstructing challenging indoor environments from few images. Through principled uncertainty propagation, it is robust to errors in the priors, can handle priors inferred by different models with little tuning, and will thus easily benefit from future progress in monocular depth and normal estimation. Our code is publicly available at https://github.com/cvg/mpsfm.","url_abs":"https://arxiv.org/abs/2504.20040v1","url_pdf":"https://arxiv.org/pdf/2504.20040v1.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"mp-sfm-monocular-surface-priors-for-robust","repo_url":"https://github.com/cvg/mpsfm","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"pytorch","reach":{"status":"ok","spdx":"Apache-2.0"}}],"tasks":[],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"syntology_url":"https://syntology.ai/paper/2504.20040","atlas_url":"https://app.syntology.ai/?focus=2504.20040","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2504.20040"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-25T09:33:49+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"deterministic:regex_extraction","url":"https://github.com/cvg/mpsfm","reach":{"status":"ok","spdx":"Apache-2.0"}}],"summary":{"ran":7,"unverified":4},"by_repo_kind":{"official":{"samples":11,"ran":7,"repositories":1}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":0,"samples":[{"code_sha256_prefix":"d942d293c42894cd","entry":"get_mask","repo":"cvg/mpsfm","repo_kind":"official","path":"mpsfm/utils/io.py","file_url":"https://github.com/cvg/mpsfm/blob/HEAD/mpsfm/utils/io.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"d942d293c42894cd"}},{"code_sha256_prefix":"e81828a0eb508ec5","entry":"get_mono_map","repo":"cvg/mpsfm","repo_kind":"official","path":"mpsfm/utils/io.py","file_url":"https://github.com/cvg/mpsfm/blob/HEAD/mpsfm/utils/io.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"e81828a0eb508ec5"}},{"code_sha256_prefix":"2e381cce9cc5d6cd","entry":"names_to_pair","repo":"cvg/mpsfm","repo_kind":"official","path":"mpsfm/utils/parsers.py","file_url":"https://github.com/cvg/mpsfm/blob/HEAD/mpsfm/utils/parsers.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"2e381cce9cc5d6cd"}},{"code_sha256_prefix":"a22a5e83951963da","entry":"names_to_pair_old","repo":"cvg/mpsfm","repo_kind":"official","path":"mpsfm/utils/parsers.py","file_url":"https://github.com/cvg/mpsfm/blob/HEAD/mpsfm/utils/parsers.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"a22a5e83951963da"}},{"code_sha256_prefix":"583d7632c3e1ee4b","entry":"parse_retrieval","repo":"cvg/mpsfm","repo_kind":"official","path":"mpsfm/utils/parsers.py","file_url":"https://github.com/cvg/mpsfm/blob/HEAD/mpsfm/utils/parsers.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"583d7632c3e1ee4b"}},{"code_sha256_prefix":"31ea8021cf3c76df","entry":"project3D","repo":"cvg/mpsfm","repo_kind":"official","path":"mpsfm/utils/geometry.py","file_url":"https://github.com/cvg/mpsfm/blob/HEAD/mpsfm/utils/geometry.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"31ea8021cf3c76df"}},{"code_sha256_prefix":"f04e4160498a099a","entry":"setup_matrix_library","repo":"cvg/mpsfm","repo_kind":"official","path":"mpsfm/utils/integration.py","file_url":"https://github.com/cvg/mpsfm/blob/HEAD/mpsfm/utils/integration.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"f04e4160498a099a"}},{"code_sha256_prefix":"2dafe7e4c96b8f96","entry":"move_left","repo":"cvg/mpsfm","repo_kind":"official","path":"mpsfm/utils/integration.py","file_url":"https://github.com/cvg/mpsfm/blob/HEAD/mpsfm/utils/integration.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"2dafe7e4c96b8f96"}},{"code_sha256_prefix":"66be2c01950d12bf","entry":"move_right","repo":"cvg/mpsfm","repo_kind":"official","path":"mpsfm/utils/integration.py","file_url":"https://github.com/cvg/mpsfm/blob/HEAD/mpsfm/utils/integration.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"66be2c01950d12bf"}},{"code_sha256_prefix":"b8ff0d73fb867b95","entry":"project3D_colmap","repo":"cvg/mpsfm","repo_kind":"official","path":"mpsfm/utils/geometry.py","file_url":"https://github.com/cvg/mpsfm/blob/HEAD/mpsfm/utils/geometry.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"b8ff0d73fb867b95"}},{"code_sha256_prefix":"cad78037e4a75b38","entry":"unproject_depth_map_to_world","repo":"cvg/mpsfm","repo_kind":"official","path":"mpsfm/utils/geometry.py","file_url":"https://github.com/cvg/mpsfm/blob/HEAD/mpsfm/utils/geometry.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"cad78037e4a75b38"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}