{"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/learning-feature-descriptors-using-camera","title":"Learning Feature Descriptors using Camera Pose Supervision","arxiv_id":"2004.13324","date":"2020-04-28","proceeding":"ECCV 2020 8","authors":["Qianqian Wang","Xiaowei Zhou","Bharath Hariharan","Noah Snavely"],"abstract":"Recent research on learned visual descriptors has shown promising improvements in correspondence estimation, a key component of many 3D vision tasks. However, existing descriptor learning frameworks typically require ground-truth correspondences between feature points for training, which are challenging to acquire at scale. In this paper we propose a novel weakly-supervised framework that can learn feature descriptors solely from relative camera poses between images. To do so, we devise both a new loss function that exploits the epipolar constraint given by camera poses, and a new model architecture that makes the whole pipeline differentiable and efficient. Because we no longer need pixel-level ground-truth correspondences, our framework opens up the possibility of training on much larger and more diverse datasets for better and unbiased descriptors. We call the resulting descriptors CAmera Pose Supervised, or CAPS, descriptors. Though trained with weak supervision, CAPS descriptors outperform even prior fully-supervised descriptors and achieve state-of-the-art performance on a variety of geometric tasks. Project Page: https://qianqianwang68.github.io/CAPS/","url_abs":"https://arxiv.org/abs/2004.13324v3","url_pdf":"https://arxiv.org/pdf/2004.13324v3.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":"learning-feature-descriptors-using-camera","repo_url":"https://github.com/qianqianwang68/caps","is_official":0,"mentioned_in_paper":0,"mentioned_in_github":1,"framework":"pytorch","reach":{"status":"ok","spdx":"MIT"}}],"tasks":[],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2004.13324","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2004.13324"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-24T18:15:14+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":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/qianqianwang68/caps","reach":{"status":"ok","spdx":"MIT"}}],"summary":{"ran":2,"unverified":5},"by_repo_kind":{"listed":{"samples":7,"ran":2,"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":"22e670c8093b7c80","entry":"class_for_name","repo":"qianqianwang68/caps","repo_kind":"listed","path":"CAPS/network.py","file_url":"https://github.com/qianqianwang68/caps/blob/HEAD/CAPS/network.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"22e670c8093b7c80"}},{"code_sha256_prefix":"6bd09766d7ad212b","entry":"skew","repo":"qianqianwang68/caps","repo_kind":"listed","path":"dataloader/data_utils.py","file_url":"https://github.com/qianqianwang68/caps/blob/HEAD/dataloader/data_utils.py","link_basis":"harvester_set","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"6bd09766d7ad212b"}},{"code_sha256_prefix":"26f04718282dc148","entry":"average_precision","repo":"qianqianwang68/caps","repo_kind":"listed","path":"utils.py","file_url":"https://github.com/qianqianwang68/caps/blob/HEAD/utils.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"26f04718282dc148"}},{"code_sha256_prefix":"3ffdd49cf30a8dce","entry":"evaluate_pose","repo":"qianqianwang68/caps","repo_kind":"listed","path":"utils.py","file_url":"https://github.com/qianqianwang68/caps/blob/HEAD/utils.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"3ffdd49cf30a8dce"}},{"code_sha256_prefix":"961908c17d9b6d4c","entry":"homogenize","repo":"qianqianwang68/caps","repo_kind":"listed","path":"utils.py","file_url":"https://github.com/qianqianwang68/caps/blob/HEAD/utils.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"961908c17d9b6d4c"}},{"code_sha256_prefix":"c91cb9ba15e376f9","entry":"perspective_transform","repo":"qianqianwang68/caps","repo_kind":"listed","path":"dataloader/data_utils.py","file_url":"https://github.com/qianqianwang68/caps/blob/HEAD/dataloader/data_utils.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"c91cb9ba15e376f9"}},{"code_sha256_prefix":"100f94f2543eec22","entry":"rotateImage","repo":"qianqianwang68/caps","repo_kind":"listed","path":"dataloader/data_utils.py","file_url":"https://github.com/qianqianwang68/caps/blob/HEAD/dataloader/data_utils.py","link_basis":"harvester_set","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"100f94f2543eec22"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}