{"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-thin-plate-spline-motion-and","title":"Parallax-Tolerant Unsupervised Deep Image Stitching","arxiv_id":"2302.08207","date":"2023-02-16","proceeding":"ICCV 2023 1","authors":["Lang Nie","Chunyu Lin","Kang Liao","Shuaicheng Liu","Yao Zhao"],"abstract":"Traditional image stitching approaches tend to leverage increasingly complex geometric features (point, line, edge, etc.) for better performance. However, these hand-crafted features are only suitable for specific natural scenes with adequate geometric structures. In contrast, deep stitching schemes overcome the adverse conditions by adaptively learning robust semantic features, but they cannot handle large-parallax cases due to homography-based registration. To solve these issues, we propose UDIS++, a parallax-tolerant unsupervised deep image stitching technique. First, we propose a robust and flexible warp to model the image registration from global homography to local thin-plate spline motion. It provides accurate alignment for overlapping regions and shape preservation for non-overlapping regions by joint optimization concerning alignment and distortion. Subsequently, to improve the generalization capability, we design a simple but effective iterative strategy to enhance the warp adaption in cross-dataset and cross-resolution applications. Finally, to further eliminate the parallax artifacts, we propose to composite the stitched image seamlessly by unsupervised learning for seam-driven composition masks. Compared with existing methods, our solution is parallax-tolerant and free from laborious designs of complicated geometric features for specific scenes. Extensive experiments show our superiority over the SoTA methods, both quantitatively and qualitatively. The code is available at https://github.com/nie-lang/UDIS2.","url_abs":"https://arxiv.org/abs/2302.08207v2","url_pdf":"https://arxiv.org/pdf/2302.08207v2.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-thin-plate-spline-motion-and","repo_url":"https://github.com/nie-lang/udis2","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"pytorch","reach":{"status":"ok","spdx":"Apache-2.0"}}],"tasks":[{"task_slug":"image-registration","task_name":"Image Registration"},{"task_slug":"image-stitching","task_name":"Image Stitching"}],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2302.08207","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2302.08207"}},"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/nie-lang/udis2","reach":{"status":"ok","spdx":"Apache-2.0"}}],"summary":{"ran_fixture":1,"unverified":9},"by_repo_kind":{"official":{"samples":10,"ran":1,"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":"0d43cef2235f0f10","entry":"tensor_DLT","repo":"nie-lang/udis2","repo_kind":"official","path":"Warp/Codes/utils/torch_DLT.py","file_url":"https://github.com/nie-lang/udis2/blob/HEAD/Warp/Codes/utils/torch_DLT.py","link_basis":"harvester_set","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":"invariant","behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"0d43cef2235f0f10"}},{"code_sha256_prefix":"e45a3f6709743d0c","entry":"boundary_extraction","repo":"nie-lang/udis2","repo_kind":"official","path":"Composition/Codes/loss.py","file_url":"https://github.com/nie-lang/udis2/blob/HEAD/Composition/Codes/loss.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":"e45a3f6709743d0c"}},{"code_sha256_prefix":"1baa38f232521d53","entry":"build_model","repo":"nie-lang/udis2","repo_kind":"official","path":"Composition/Codes/network.py","file_url":"https://github.com/nie-lang/udis2/blob/HEAD/Composition/Codes/network.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":"1baa38f232521d53"}},{"code_sha256_prefix":"572dc8d08e227add","entry":"cal_boundary_term","repo":"nie-lang/udis2","repo_kind":"official","path":"Composition/Codes/loss.py","file_url":"https://github.com/nie-lang/udis2/blob/HEAD/Composition/Codes/loss.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":"572dc8d08e227add"}},{"code_sha256_prefix":"e825db3cf6bfc370","entry":"cal_lp_loss","repo":"nie-lang/udis2","repo_kind":"official","path":"Warp/Codes/loss.py","file_url":"https://github.com/nie-lang/udis2/blob/HEAD/Warp/Codes/loss.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":"e825db3cf6bfc370"}},{"code_sha256_prefix":"9ed8d56cbbc96cdc","entry":"cal_lp_loss2","repo":"nie-lang/udis2","repo_kind":"official","path":"Warp/Codes/loss.py","file_url":"https://github.com/nie-lang/udis2/blob/HEAD/Warp/Codes/loss.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":"9ed8d56cbbc96cdc"}},{"code_sha256_prefix":"f2dbbaca4d14c751","entry":"l_num_loss","repo":"nie-lang/udis2","repo_kind":"official","path":"Composition/Codes/loss.py","file_url":"https://github.com/nie-lang/udis2/blob/HEAD/Composition/Codes/loss.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":"f2dbbaca4d14c751"}},{"code_sha256_prefix":"2400556d875b3688","entry":"transformer","repo":"nie-lang/udis2","repo_kind":"official","path":"Warp/Codes/utils/torch_homo_transform.py","file_url":"https://github.com/nie-lang/udis2/blob/HEAD/Warp/Codes/utils/torch_homo_transform.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":"2400556d875b3688"}},{"code_sha256_prefix":"f240a2b70ae50490","entry":"transformer","repo":"nie-lang/udis2","repo_kind":"official","path":"Warp/Codes/utils/torch_tps_transform.py","file_url":"https://github.com/nie-lang/udis2/blob/HEAD/Warp/Codes/utils/torch_tps_transform.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":"f240a2b70ae50490"}},{"code_sha256_prefix":"b692293738829cc8","entry":"transformer","repo":"nie-lang/udis2","repo_kind":"official","path":"Warp/Codes/utils/torch_tps_transform2.py","file_url":"https://github.com/nie-lang/udis2/blob/HEAD/Warp/Codes/utils/torch_tps_transform2.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":"b692293738829cc8"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}