{"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/pointad-comprehending-3d-anomalies-from","title":"PointAD: Comprehending 3D Anomalies from Points and Pixels for Zero-shot 3D Anomaly Detection","arxiv_id":"2410.00320","date":"2024-10-01","proceeding":null,"authors":["Qihang Zhou","Jiangtao Yan","Shibo He","Wenchao Meng","Jiming Chen"],"abstract":"Zero-shot (ZS) 3D anomaly detection is a crucial yet unexplored field that addresses scenarios where target 3D training samples are unavailable due to practical concerns like privacy protection. This paper introduces PointAD, a novel approach that transfers the strong generalization capabilities of CLIP for recognizing 3D anomalies on unseen objects. PointAD provides a unified framework to comprehend 3D anomalies from both points and pixels. In this framework, PointAD renders 3D anomalies into multiple 2D renderings and projects them back into 3D space. To capture the generic anomaly semantics into PointAD, we propose hybrid representation learning that optimizes the learnable text prompts from 3D and 2D through auxiliary point clouds. The collaboration optimization between point and pixel representations jointly facilitates our model to grasp underlying 3D anomaly patterns, contributing to detecting and segmenting anomalies of unseen diverse 3D objects. Through the alignment of 3D and 2D space, our model can directly integrate RGB information, further enhancing the understanding of 3D anomalies in a plug-and-play manner. Extensive experiments show the superiority of PointAD in ZS 3D anomaly detection across diverse unseen objects.","url_abs":"https://arxiv.org/abs/2410.00320v4","url_pdf":"https://arxiv.org/pdf/2410.00320v4.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":"pointad-comprehending-3d-anomalies-from","repo_url":"https://github.com/zqhang/pointad","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"pytorch","reach":{"status":"ok"}}],"tasks":[{"task_slug":"3d-anomaly-detection","task_name":"3D Anomaly Detection"},{"task_slug":"anomaly-detection","task_name":"Anomaly Detection"},{"task_slug":"representation-learning","task_name":"Representation Learning"}],"methods":[{"method_slug":"clip","method_name":"CLIP"}],"datasets_introduced":[],"methods_introduced":[],"results":[{"leaderboard":"/sota/3d-anomaly-detection-on-real-3d-ad","task":"3D Anomaly Detection","dataset":"Real 3D-AD","model":"PointAD","rank_in_archive_order":8,"of":19,"metrics":{"Mean Performance of P. and O. ":"0.7375","Object AUROC":"0.759","Point AUROC":"0.716"},"uses_additional_data":false}],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2410.00320","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2410.00320"}},"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/zqhang/PointAD","reach":{"status":"ok"}},{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/zqhang/pointad","reach":{"status":"ok"}}],"summary":{"ran":10,"ran_draft_wrong":5,"ran_honours":1,"ran_fixture":1,"unverified":9},"by_repo_kind":{"official":{"samples":23,"ran":15,"repositories":1},"community":{"samples":3,"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":23,"samples":[{"code_sha256_prefix":"2e7ee770aa7c6018","entry":"Attention","repo":"zqhang/pointad","repo_kind":"official","path":"AnomalyCLIP_lib/AnomalyCLIP.py","file_url":"https://github.com/zqhang/pointad/blob/HEAD/AnomalyCLIP_lib/AnomalyCLIP.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"deterministic","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"2e7ee770aa7c6018"}},{"code_sha256_prefix":"b0d940f6ea95cb97","entry":"ResidualAttentionBlock_learnable_token","repo":"zqhang/pointad","repo_kind":"official","path":"AnomalyCLIP_lib/AnomalyCLIP.py","file_url":"https://github.com/zqhang/pointad/blob/HEAD/AnomalyCLIP_lib/AnomalyCLIP.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"b0d940f6ea95cb97"}},{"code_sha256_prefix":"98f385d847636a3e","entry":"basic_clean","repo":"zqhang/PointAD","repo_kind":"official","path":"AnomalyCLIP_lib/simple_tokenizer.py","file_url":"https://github.com/zqhang/PointAD/blob/HEAD/AnomalyCLIP_lib/simple_tokenizer.py","link_basis":"harvester_set","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":"deterministic","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"98f385d847636a3e"}},{"code_sha256_prefix":"178a0488f0c59db0","entry":"cal_pro_score","repo":"zqhang/PointAD","repo_kind":"official","path":"metrics.py","file_url":"https://github.com/zqhang/PointAD/blob/HEAD/metrics.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"178a0488f0c59db0"}},{"code_sha256_prefix":"e70f60a663c06b9a","entry":"convert_to_custom_text_state_dict","repo":"zqhang/accurate-winclip-pytorch","repo_kind":"community","path":"src/open_clip/model.py","file_url":"https://github.com/zqhang/accurate-winclip-pytorch/blob/HEAD/src/open_clip/model.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"MISDECLARED","metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"e70f60a663c06b9a"}},{"code_sha256_prefix":"7050b3459cd4a0ff","entry":"generate_class_info","repo":"zqhang/PointAD","repo_kind":"official","path":"dataset.py","file_url":"https://github.com/zqhang/PointAD/blob/HEAD/dataset.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"7050b3459cd4a0ff"}},{"code_sha256_prefix":"561e1516acd5b4f8","entry":"generate_is_seen_for_point_in_each_view","repo":"zqhang/PointAD","repo_kind":"official","path":"dataset.py","file_url":"https://github.com/zqhang/PointAD/blob/HEAD/dataset.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"561e1516acd5b4f8"}},{"code_sha256_prefix":"1bc68318bf26bdf0","entry":"get_cast_dtype","repo":"zqhang/accurate-winclip-pytorch","repo_kind":"community","path":"src/open_clip/model.py","file_url":"https://github.com/zqhang/accurate-winclip-pytorch/blob/HEAD/src/open_clip/model.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"1bc68318bf26bdf0"}},{"code_sha256_prefix":"01e8c2f30dcaa3d3","entry":"get_logger","repo":"zqhang/PointAD","repo_kind":"official","path":"logger.py","file_url":"https://github.com/zqhang/PointAD/blob/HEAD/logger.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"01e8c2f30dcaa3d3"}},{"code_sha256_prefix":"d919ae32e5e4e616","entry":"get_pairs","repo":"zqhang/PointAD","repo_kind":"official","path":"AnomalyCLIP_lib/simple_tokenizer.py","file_url":"https://github.com/zqhang/PointAD/blob/HEAD/AnomalyCLIP_lib/simple_tokenizer.py","link_basis":"harvester_set","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"d919ae32e5e4e616"}},{"code_sha256_prefix":"fab7ecf2ea011dae","entry":"image_level_metrics","repo":"zqhang/PointAD","repo_kind":"official","path":"metrics.py","file_url":"https://github.com/zqhang/PointAD/blob/HEAD/metrics.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"fab7ecf2ea011dae"}},{"code_sha256_prefix":"4b3a4d17e1df3140","entry":"load_state_dict","repo":"zqhang/PointAD","repo_kind":"official","path":"AnomalyCLIP_lib/model_load.py","file_url":"https://github.com/zqhang/PointAD/blob/HEAD/AnomalyCLIP_lib/model_load.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"4b3a4d17e1df3140"}},{"code_sha256_prefix":"0c3f9d9b0ac9f33d","entry":"normalize","repo":"zqhang/PointAD","repo_kind":"official","path":"utils.py","file_url":"https://github.com/zqhang/PointAD/blob/HEAD/utils.py","link_basis":"plan_row","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"0c3f9d9b0ac9f33d"}},{"code_sha256_prefix":"8652c7a523dba2e8","entry":"pixel_level_metrics","repo":"zqhang/PointAD","repo_kind":"official","path":"metrics.py","file_url":"https://github.com/zqhang/PointAD/blob/HEAD/metrics.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"8652c7a523dba2e8"}},{"code_sha256_prefix":"abedbe9b904a9780","entry":"smooth","repo":"zqhang/PointAD","repo_kind":"official","path":"loss.py","file_url":"https://github.com/zqhang/PointAD/blob/HEAD/loss.py","link_basis":"plan_row","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"abedbe9b904a9780"}},{"code_sha256_prefix":"208456d9417303f4","entry":"sparsity","repo":"zqhang/PointAD","repo_kind":"official","path":"loss.py","file_url":"https://github.com/zqhang/PointAD/blob/HEAD/loss.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"208456d9417303f4"}},{"code_sha256_prefix":"9542161e9640b858","entry":"whitespace_clean","repo":"zqhang/PointAD","repo_kind":"official","path":"AnomalyCLIP_lib/simple_tokenizer.py","file_url":"https://github.com/zqhang/PointAD/blob/HEAD/AnomalyCLIP_lib/simple_tokenizer.py","link_basis":"harvester_set","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":"deterministic","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"9542161e9640b858"}},{"code_sha256_prefix":"3531139281d2a48e","entry":"AnomalyCLIP","repo":"zqhang/pointad","repo_kind":"official","path":"AnomalyCLIP_lib/AnomalyCLIP.py","file_url":"https://github.com/zqhang/pointad/blob/HEAD/AnomalyCLIP_lib/AnomalyCLIP.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"3531139281d2a48e"}},{"code_sha256_prefix":"6cbaa01bb223f295","entry":"ResidualAttentionBlock","repo":"zqhang/pointad","repo_kind":"official","path":"AnomalyCLIP_lib/AnomalyCLIP.py","file_url":"https://github.com/zqhang/pointad/blob/HEAD/AnomalyCLIP_lib/AnomalyCLIP.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"6cbaa01bb223f295"}},{"code_sha256_prefix":"904024b32ecbd1e1","entry":"Transformer","repo":"zqhang/pointad","repo_kind":"official","path":"AnomalyCLIP_lib/AnomalyCLIP.py","file_url":"https://github.com/zqhang/pointad/blob/HEAD/AnomalyCLIP_lib/AnomalyCLIP.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"904024b32ecbd1e1"}},{"code_sha256_prefix":"f8c143f839756ff3","entry":"VisionTransformer","repo":"zqhang/pointad","repo_kind":"official","path":"AnomalyCLIP_lib/AnomalyCLIP.py","file_url":"https://github.com/zqhang/pointad/blob/HEAD/AnomalyCLIP_lib/AnomalyCLIP.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"f8c143f839756ff3"}},{"code_sha256_prefix":"ed57101d91ad0e4e","entry":"build_model","repo":"zqhang/PointAD","repo_kind":"official","path":"AnomalyCLIP_lib/build_model.py","file_url":"https://github.com/zqhang/PointAD/blob/HEAD/AnomalyCLIP_lib/build_model.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"ed57101d91ad0e4e"}},{"code_sha256_prefix":"b7bca1358293c8ab","entry":"build_model_from_openai_state_dict","repo":"zqhang/accurate-winclip-pytorch","repo_kind":"community","path":"src/open_clip/model.py","file_url":"https://github.com/zqhang/accurate-winclip-pytorch/blob/HEAD/src/open_clip/model.py","link_basis":"first_harvest_node","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":"b7bca1358293c8ab"}},{"code_sha256_prefix":"2c38b8a1a6553df1","entry":"image_transform","repo":"zqhang/PointAD","repo_kind":"official","path":"AnomalyCLIP_lib/transform.py","file_url":"https://github.com/zqhang/PointAD/blob/HEAD/AnomalyCLIP_lib/transform.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"2c38b8a1a6553df1"}},{"code_sha256_prefix":"45e1ef91f571e2f5","entry":"load","repo":"zqhang/PointAD","repo_kind":"official","path":"AnomalyCLIP_lib/model_load.py","file_url":"https://github.com/zqhang/PointAD/blob/HEAD/AnomalyCLIP_lib/model_load.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"45e1ef91f571e2f5"}},{"code_sha256_prefix":"d53108edea9d2b46","entry":"load_checkpoint","repo":"zqhang/PointAD","repo_kind":"official","path":"AnomalyCLIP_lib/model_load.py","file_url":"https://github.com/zqhang/PointAD/blob/HEAD/AnomalyCLIP_lib/model_load.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"d53108edea9d2b46"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}