{"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/dedode-detect-don-t-describe-describe-don-t","title":"DeDoDe: Detect, Don't Describe -- Describe, Don't Detect for Local Feature Matching","arxiv_id":"2308.08479","date":"2023-08-16","proceeding":null,"authors":["Johan Edstedt","Georg Bökman","Mårten Wadenbäck","Michael Felsberg"],"abstract":"Keypoint detection is a pivotal step in 3D reconstruction, whereby sets of (up to) K points are detected in each view of a scene. Crucially, the detected points need to be consistent between views, i.e., correspond to the same 3D point in the scene. One of the main challenges with keypoint detection is the formulation of the learning objective. Previous learning-based methods typically jointly learn descriptors with keypoints, and treat the keypoint detection as a binary classification task on mutual nearest neighbours. However, basing keypoint detection on descriptor nearest neighbours is a proxy task, which is not guaranteed to produce 3D-consistent keypoints. Furthermore, this ties the keypoints to a specific descriptor, complicating downstream usage. In this work, we instead learn keypoints directly from 3D consistency. To this end, we train the detector to detect tracks from large-scale SfM. As these points are often overly sparse, we derive a semi-supervised two-view detection objective to expand this set to a desired number of detections. To train a descriptor, we maximize the mutual nearest neighbour objective over the keypoints with a separate network. Results show that our approach, DeDoDe, achieves significant gains on multiple geometry benchmarks. Code is provided at https://github.com/Parskatt/DeDoDe","url_abs":"https://arxiv.org/abs/2308.08479v3","url_pdf":"https://arxiv.org/pdf/2308.08479v3.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":"dedode-detect-don-t-describe-describe-don-t","repo_url":"https://github.com/parskatt/dedode","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"pytorch","reach":{"status":"ok","spdx":"MIT"}},{"paper_slug":"dedode-detect-don-t-describe-describe-don-t","repo_url":"https://github.com/fabio-sim/DeDoDe-ONNX-TensorRT","is_official":0,"mentioned_in_paper":0,"mentioned_in_github":1,"framework":"pytorch","reach":{"status":"ok","spdx":"MIT"}}],"tasks":[{"task_slug":"3d-reconstruction","task_name":"3D Reconstruction"},{"task_slug":"binary-classification","task_name":"Binary Classification"},{"task_slug":"keypoint-detection","task_name":"Keypoint Detection"}],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"syntology_url":"https://syntology.ai/paper/2308.08479","atlas_url":"https://app.syntology.ai/?focus=2308.08479","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2308.08479"}},"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":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/parskatt/dedode","reach":{"status":"ok","spdx":"MIT"}},{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/fabio-sim/DeDoDe-ONNX-TensorRT","reach":{"status":"ok","spdx":"MIT"}}],"summary":{"ran":7,"unverified":2},"by_repo_kind":{"listed":{"samples":9,"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":"3ead9a8db068631b","entry":"draw_matches","repo":"fabio-sim/DeDoDe-ONNX-TensorRT","repo_kind":"listed","path":"onnx_runner/viz_utils.py","file_url":"https://github.com/fabio-sim/DeDoDe-ONNX-TensorRT/blob/HEAD/onnx_runner/viz_utils.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":"3ead9a8db068631b"}},{"code_sha256_prefix":"2dc31f31f1126fbf","entry":"dual_softmax_matcher","repo":"fabio-sim/DeDoDe-ONNX-TensorRT","repo_kind":"listed","path":"DeDoDe/matchers/dual_softmax_matcher.py","file_url":"https://github.com/fabio-sim/DeDoDe-ONNX-TensorRT/blob/HEAD/DeDoDe/matchers/dual_softmax_matcher.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":"2dc31f31f1126fbf"}},{"code_sha256_prefix":"7c61f8133d2acd4f","entry":"get_grid","repo":"fabio-sim/DeDoDe-ONNX-TensorRT","repo_kind":"listed","path":"DeDoDe/detectors/dedode_detector.py","file_url":"https://github.com/fabio-sim/DeDoDe-ONNX-TensorRT/blob/HEAD/DeDoDe/detectors/dedode_detector.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":"7c61f8133d2acd4f"}},{"code_sha256_prefix":"8e8f5b59e512cdbb","entry":"load_image","repo":"fabio-sim/DeDoDe-ONNX-TensorRT","repo_kind":"listed","path":"DeDoDe/utils.py","file_url":"https://github.com/fabio-sim/DeDoDe-ONNX-TensorRT/blob/HEAD/DeDoDe/utils.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":"8e8f5b59e512cdbb"}},{"code_sha256_prefix":"fb4c146bb1e3a690","entry":"sample_keypoints","repo":"fabio-sim/DeDoDe-ONNX-TensorRT","repo_kind":"listed","path":"DeDoDe/detectors/dedode_detector.py","file_url":"https://github.com/fabio-sim/DeDoDe-ONNX-TensorRT/blob/HEAD/DeDoDe/detectors/dedode_detector.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":"fb4c146bb1e3a690"}},{"code_sha256_prefix":"c10ee0f852bbdf33","entry":"to_normalized_coords","repo":"fabio-sim/DeDoDe-ONNX-TensorRT","repo_kind":"listed","path":"DeDoDe/utils.py","file_url":"https://github.com/fabio-sim/DeDoDe-ONNX-TensorRT/blob/HEAD/DeDoDe/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":"c10ee0f852bbdf33"}},{"code_sha256_prefix":"d68210e88633a3ff","entry":"to_pixel_coords","repo":"fabio-sim/DeDoDe-ONNX-TensorRT","repo_kind":"listed","path":"DeDoDe/utils.py","file_url":"https://github.com/fabio-sim/DeDoDe-ONNX-TensorRT/blob/HEAD/DeDoDe/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":"d68210e88633a3ff"}},{"code_sha256_prefix":"ce6427c3c07de632","entry":"DeDoDeDescriptorB","repo":"fabio-sim/DeDoDe-ONNX-TensorRT","repo_kind":"listed","path":"DeDoDe/model_zoo.py","file_url":"https://github.com/fabio-sim/DeDoDe-ONNX-TensorRT/blob/HEAD/DeDoDe/model_zoo.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":"ce6427c3c07de632"}},{"code_sha256_prefix":"bb353de918f7a6f3","entry":"DeDoDeDetectorL","repo":"fabio-sim/DeDoDe-ONNX-TensorRT","repo_kind":"listed","path":"DeDoDe/model_zoo.py","file_url":"https://github.com/fabio-sim/DeDoDe-ONNX-TensorRT/blob/HEAD/DeDoDe/model_zoo.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":"bb353de918f7a6f3"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}