{"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-affine-correspondences-by","title":"Learning Affine Correspondences by Integrating Geometric Constraints","arxiv_id":"2504.04834","date":"2025-04-07","proceeding":"CVPR 2025 1","authors":["Pengju Sun","Banglei Guan","Zhenbao Yu","Yang Shang","Qifeng Yu","Daniel Barath"],"abstract":"Affine correspondences have received significant attention due to their benefits in tasks like image matching and pose estimation. Existing methods for extracting affine correspondences still have many limitations in terms of performance; thus, exploring a new paradigm is crucial. In this paper, we present a new pipeline designed for extracting accurate affine correspondences by integrating dense matching and geometric constraints. Specifically, a novel extraction framework is introduced, with the aid of dense matching and a novel keypoint scale and orientation estimator. For this purpose, we propose loss functions based on geometric constraints, which can effectively improve accuracy by supervising neural networks to learn feature geometry. The experimental show that the accuracy and robustness of our method outperform the existing ones in image matching tasks. To further demonstrate the effectiveness of the proposed method, we applied it to relative pose estimation. Affine correspondences extracted by our method lead to more accurate poses than the baselines on a range of real-world datasets. The code is available at https://github.com/stilcrad/DenseAffine.","url_abs":"https://arxiv.org/abs/2504.04834v2","url_pdf":"https://arxiv.org/pdf/2504.04834v2.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-affine-correspondences-by","repo_url":"https://github.com/stilcrad/denseaffine","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":0,"framework":"pytorch","reach":null}],"tasks":[{"task_slug":"pose-estimation","task_name":"Pose Estimation"}],"methods":[{"method_slug":"attention","method_name":"Attention"},{"method_slug":"softmax","method_name":"Softmax"}],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2504.04834","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2504.04834"}},"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":"deterministic:regex_extraction","url":"https://github.com/stilcrad/LearningACs","reach":null}],"summary":{"ran":3,"ran_honours":2,"ran_draft_wrong":1,"ran_fixture":1,"ran_violates":1,"unverified":5},"by_repo_kind":{"found_in_text":{"samples":13,"ran":8,"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":13,"samples":[{"code_sha256_prefix":"a466618f8a546f24","entry":"AffNetFast","repo":"stilcrad/LearningACs","repo_kind":"found_in_text","path":"Network/affine_model.py","file_url":"https://github.com/stilcrad/LearningACs/blob/HEAD/Network/affine_model.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"invariant","behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"a466618f8a546f24"}},{"code_sha256_prefix":"2d4ccb2813ab9903","entry":"Unit","repo":"stilcrad/LearningACs","repo_kind":"found_in_text","path":"Network/affine_model.py","file_url":"https://github.com/stilcrad/LearningACs/blob/HEAD/Network/affine_model.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"2d4ccb2813ab9903"}},{"code_sha256_prefix":"bfe32474d1bb04a7","entry":"get_norm_xy","repo":"stilcrad/LearningACs","repo_kind":"found_in_text","path":"Network/affine_model.py","file_url":"https://github.com/stilcrad/LearningACs/blob/HEAD/Network/affine_model.py","link_basis":"first_harvest_node","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"bfe32474d1bb04a7"}},{"code_sha256_prefix":"3949f24043ad1382","entry":"get_rand_vec","repo":"stilcrad/LearningACs","repo_kind":"found_in_text","path":"Network/affine_model.py","file_url":"https://github.com/stilcrad/LearningACs/blob/HEAD/Network/affine_model.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"MISDECLARED","metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"3949f24043ad1382"}},{"code_sha256_prefix":"a5b38989557ebe9e","entry":"get_trans_mat","repo":"stilcrad/LearningACs","repo_kind":"found_in_text","path":"Network/affine_model.py","file_url":"https://github.com/stilcrad/LearningACs/blob/HEAD/Network/affine_model.py","link_basis":"first_harvest_node","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"a5b38989557ebe9e"}},{"code_sha256_prefix":"28a8887902d9d18b","entry":"make_layers","repo":"stilcrad/LearningACs","repo_kind":"found_in_text","path":"Network/affine_model.py","file_url":"https://github.com/stilcrad/LearningACs/blob/HEAD/Network/affine_model.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"28a8887902d9d18b"}},{"code_sha256_prefix":"4cca3e89d39e317a","entry":"rectifyAffineTransformationUpIsUp","repo":"stilcrad/LearningACs","repo_kind":"found_in_text","path":"Network/affine_model.py","file_url":"https://github.com/stilcrad/LearningACs/blob/HEAD/Network/affine_model.py","link_basis":"first_harvest_node","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"4cca3e89d39e317a"}},{"code_sha256_prefix":"e7ccfeab258df7aa","entry":"to_tensor","repo":"stilcrad/LearningACs","repo_kind":"found_in_text","path":"Network/affine_model.py","file_url":"https://github.com/stilcrad/LearningACs/blob/HEAD/Network/affine_model.py","link_basis":"first_harvest_node","language":"python","status":"ran_violates","verification_level":1,"contract_check":"VIOLATES","metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"e7ccfeab258df7aa"}},{"code_sha256_prefix":"4dd32fb6112ab6c3","entry":"AffineModel","repo":"stilcrad/LearningACs","repo_kind":"found_in_text","path":"Network/affine_model.py","file_url":"https://github.com/stilcrad/LearningACs/blob/HEAD/Network/affine_model.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"4dd32fb6112ab6c3"}},{"code_sha256_prefix":"59ddc773aeb48965","entry":"EstiNet","repo":"stilcrad/LearningACs","repo_kind":"found_in_text","path":"Network/affine_model.py","file_url":"https://github.com/stilcrad/LearningACs/blob/HEAD/Network/affine_model.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"59ddc773aeb48965"}},{"code_sha256_prefix":"a2166abb101c8a2d","entry":"affine_trans_loss","repo":"stilcrad/LearningACs","repo_kind":"found_in_text","path":"Network/affine_model.py","file_url":"https://github.com/stilcrad/LearningACs/blob/HEAD/Network/affine_model.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"a2166abb101c8a2d"}},{"code_sha256_prefix":"7a398b9ad47751d4","entry":"get_affine_patch","repo":"stilcrad/LearningACs","repo_kind":"found_in_text","path":"Network/affine_model.py","file_url":"https://github.com/stilcrad/LearningACs/blob/HEAD/Network/affine_model.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"7a398b9ad47751d4"}},{"code_sha256_prefix":"14f41a3c7a624577","entry":"get_random_border_point","repo":"stilcrad/LearningACs","repo_kind":"found_in_text","path":"Network/affine_model.py","file_url":"https://github.com/stilcrad/LearningACs/blob/HEAD/Network/affine_model.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NOASSERTION","inline_ok":false,"mcp_get_code":{"code_sha256":"14f41a3c7a624577"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}