{"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/adaclip-adapting-clip-with-hybrid-learnable","title":"AdaCLIP: Adapting CLIP with Hybrid Learnable Prompts for Zero-Shot Anomaly Detection","arxiv_id":"2407.15795","date":"2024-07-22","proceeding":null,"authors":["Yunkang Cao","Jiangning Zhang","Luca Frittoli","Yuqi Cheng","Weiming Shen","Giacomo Boracchi"],"abstract":"Zero-shot anomaly detection (ZSAD) targets the identification of anomalies within images from arbitrary novel categories. This study introduces AdaCLIP for the ZSAD task, leveraging a pre-trained vision-language model (VLM), CLIP. AdaCLIP incorporates learnable prompts into CLIP and optimizes them through training on auxiliary annotated anomaly detection data. Two types of learnable prompts are proposed: static and dynamic. Static prompts are shared across all images, serving to preliminarily adapt CLIP for ZSAD. In contrast, dynamic prompts are generated for each test image, providing CLIP with dynamic adaptation capabilities. The combination of static and dynamic prompts is referred to as hybrid prompts, and yields enhanced ZSAD performance. Extensive experiments conducted across 14 real-world anomaly detection datasets from industrial and medical domains indicate that AdaCLIP outperforms other ZSAD methods and can generalize better to different categories and even domains. Finally, our analysis highlights the importance of diverse auxiliary data and optimized prompts for enhanced generalization capacity. Code is available at https://github.com/caoyunkang/AdaCLIP.","url_abs":"https://arxiv.org/abs/2407.15795v1","url_pdf":"https://arxiv.org/pdf/2407.15795v1.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":"adaclip-adapting-clip-with-hybrid-learnable","repo_url":"https://github.com/caoyunkang/adaclip","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"pytorch","reach":{"status":"ok","spdx":"MIT"}}],"tasks":[{"task_slug":"anomaly-detection","task_name":"Anomaly Detection"},{"task_slug":"language-modeling","task_name":"Language Modeling"},{"task_slug":"language-modelling","task_name":"Language Modelling"},{"task_slug":"zero-shot-anomaly-detection","task_name":"zero-shot anomaly detection"}],"methods":[{"method_slug":"clip","method_name":"CLIP"}],"datasets_introduced":[],"methods_introduced":[],"results":[{"leaderboard":"/sota/anomaly-detection-on-mpdd","task":"Anomaly Detection","dataset":"MPDD","model":"AdaCLIP","rank_in_archive_order":13,"of":16,"metrics":{"Detection AUROC":"82.5","Segmentation AUROC":"96.1"},"uses_additional_data":false},{"leaderboard":"/sota/anomaly-detection-on-mvtec-ad","task":"Anomaly Detection","dataset":"MVTec AD","model":"AdaCLIP","rank_in_archive_order":113,"of":148,"metrics":{"Detection AUROC":"89.2","Segmentation AUROC":"88.7"},"uses_additional_data":false},{"leaderboard":"/sota/anomaly-detection-on-visa","task":"Anomaly Detection","dataset":"VisA","model":"AdaCLIP","rank_in_archive_order":34,"of":50,"metrics":{"Detection AUROC":"85.8","Segmentation AUROC":"95.5"},"uses_additional_data":true}],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2407.15795","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2407.15795"}},"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/caoyunkang/adaclip","reach":{"status":"ok","spdx":"MIT"}},{"provenance":"deterministic:regex_extraction","url":"https://github.com/caoyunkang/AdaCLIP","reach":{"status":"ok","spdx":"MIT"}}],"summary":{"ran":14,"ran_draft_wrong":4,"ran_violates":1,"unverified":9},"by_repo_kind":{"official":{"samples":28,"ran":19,"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":"8933c7b9c7e59316","entry":"AttentionalPooler","repo":"caoyunkang/AdaCLIP","repo_kind":"official","path":"method/adaclip.py","file_url":"https://github.com/caoyunkang/AdaCLIP/blob/HEAD/method/adaclip.py","link_basis":"first_harvest_node","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":"8933c7b9c7e59316"}},{"code_sha256_prefix":"d53cfe614e64f0f8","entry":"CLIPTextCfg","repo":"caoyunkang/AdaCLIP","repo_kind":"official","path":"method/adaclip.py","file_url":"https://github.com/caoyunkang/AdaCLIP/blob/HEAD/method/adaclip.py","link_basis":"first_harvest_node","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":"d53cfe614e64f0f8"}},{"code_sha256_prefix":"358336605882f8ac","entry":"CLIPVisionCfg","repo":"caoyunkang/AdaCLIP","repo_kind":"official","path":"method/adaclip.py","file_url":"https://github.com/caoyunkang/AdaCLIP/blob/HEAD/method/adaclip.py","link_basis":"first_harvest_node","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":"358336605882f8ac"}},{"code_sha256_prefix":"7fef9e3e704a163e","entry":"HybridSemanticFusion","repo":"caoyunkang/AdaCLIP","repo_kind":"official","path":"method/adaclip.py","file_url":"https://github.com/caoyunkang/AdaCLIP/blob/HEAD/method/adaclip.py","link_basis":"first_harvest_node","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":"7fef9e3e704a163e"}},{"code_sha256_prefix":"60328965616e6752","entry":"LayerNorm","repo":"caoyunkang/AdaCLIP","repo_kind":"official","path":"method/adaclip.py","file_url":"https://github.com/caoyunkang/AdaCLIP/blob/HEAD/method/adaclip.py","link_basis":"first_harvest_node","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":"60328965616e6752"}},{"code_sha256_prefix":"7a539f31051f66e9","entry":"LayerNormFp32","repo":"caoyunkang/AdaCLIP","repo_kind":"official","path":"method/adaclip.py","file_url":"https://github.com/caoyunkang/AdaCLIP/blob/HEAD/method/adaclip.py","link_basis":"first_harvest_node","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":"7a539f31051f66e9"}},{"code_sha256_prefix":"a47771f643ef84d8","entry":"PatchDropout","repo":"caoyunkang/AdaCLIP","repo_kind":"official","path":"method/adaclip.py","file_url":"https://github.com/caoyunkang/AdaCLIP/blob/HEAD/method/adaclip.py","link_basis":"first_harvest_node","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":"a47771f643ef84d8"}},{"code_sha256_prefix":"9bb8bb245a3e6712","entry":"ProjectLayer","repo":"caoyunkang/AdaCLIP","repo_kind":"official","path":"method/adaclip.py","file_url":"https://github.com/caoyunkang/AdaCLIP/blob/HEAD/method/adaclip.py","link_basis":"first_harvest_node","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":"9bb8bb245a3e6712"}},{"code_sha256_prefix":"baa7068d196ec4c6","entry":"PromptLayer","repo":"caoyunkang/AdaCLIP","repo_kind":"official","path":"method/adaclip.py","file_url":"https://github.com/caoyunkang/AdaCLIP/blob/HEAD/method/adaclip.py","link_basis":"first_harvest_node","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":"baa7068d196ec4c6"}},{"code_sha256_prefix":"7affcf897896a315","entry":"ResidualAttentionBlock","repo":"caoyunkang/AdaCLIP","repo_kind":"official","path":"method/adaclip.py","file_url":"https://github.com/caoyunkang/AdaCLIP/blob/HEAD/method/adaclip.py","link_basis":"first_harvest_node","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":"7affcf897896a315"}},{"code_sha256_prefix":"f60673dd45a8761e","entry":"TextTransformer","repo":"caoyunkang/AdaCLIP","repo_kind":"official","path":"method/adaclip.py","file_url":"https://github.com/caoyunkang/AdaCLIP/blob/HEAD/method/adaclip.py","link_basis":"first_harvest_node","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":"f60673dd45a8761e"}},{"code_sha256_prefix":"98f385d847636a3e","entry":"basic_clean","repo":"caoyunkang/adaclip","repo_kind":"official","path":"method/simple_tokenizer.py","file_url":"https://github.com/caoyunkang/adaclip/blob/HEAD/method/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":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"98f385d847636a3e"}},{"code_sha256_prefix":"f19962ebb134b3d7","entry":"convert_to_custom_text_state_dict","repo":"caoyunkang/adaclip","repo_kind":"official","path":"method/clip_model.py","file_url":"https://github.com/caoyunkang/adaclip/blob/HEAD/method/clip_model.py","link_basis":"harvester_set","language":"python","status":"ran_violates","verification_level":1,"contract_check":"VIOLATES","metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"f19962ebb134b3d7"}},{"code_sha256_prefix":"dcd422d66b0581d8","entry":"get_cast_dtype","repo":"caoyunkang/adaclip","repo_kind":"official","path":"method/clip_model.py","file_url":"https://github.com/caoyunkang/adaclip/blob/HEAD/method/clip_model.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":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"dcd422d66b0581d8"}},{"code_sha256_prefix":"d919ae32e5e4e616","entry":"get_pairs","repo":"caoyunkang/adaclip","repo_kind":"official","path":"method/simple_tokenizer.py","file_url":"https://github.com/caoyunkang/adaclip/blob/HEAD/method/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":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"d919ae32e5e4e616"}},{"code_sha256_prefix":"c213fb0a0028da05","entry":"list_pretrained","repo":"caoyunkang/adaclip","repo_kind":"official","path":"method/custom_clip.py","file_url":"https://github.com/caoyunkang/adaclip/blob/HEAD/method/custom_clip.py","link_basis":"first_harvest_node","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":"c213fb0a0028da05"}},{"code_sha256_prefix":"63bcf6e40f415106","entry":"list_pretrained_models_by_tag","repo":"caoyunkang/adaclip","repo_kind":"official","path":"method/custom_clip.py","file_url":"https://github.com/caoyunkang/adaclip/blob/HEAD/method/custom_clip.py","link_basis":"first_harvest_node","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":"63bcf6e40f415106"}},{"code_sha256_prefix":"1fe3bf9de033fd8f","entry":"list_pretrained_tags_by_model","repo":"caoyunkang/adaclip","repo_kind":"official","path":"method/custom_clip.py","file_url":"https://github.com/caoyunkang/adaclip/blob/HEAD/method/custom_clip.py","link_basis":"first_harvest_node","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":"1fe3bf9de033fd8f"}},{"code_sha256_prefix":"9542161e9640b858","entry":"whitespace_clean","repo":"caoyunkang/adaclip","repo_kind":"official","path":"method/simple_tokenizer.py","file_url":"https://github.com/caoyunkang/adaclip/blob/HEAD/method/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":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"9542161e9640b858"}},{"code_sha256_prefix":"ccef093b595414f9","entry":"AdaCLIP","repo":"caoyunkang/AdaCLIP","repo_kind":"official","path":"method/adaclip.py","file_url":"https://github.com/caoyunkang/AdaCLIP/blob/HEAD/method/adaclip.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":"ccef093b595414f9"}},{"code_sha256_prefix":"7dd2e9759231f093","entry":"CLIP","repo":"caoyunkang/AdaCLIP","repo_kind":"official","path":"method/adaclip.py","file_url":"https://github.com/caoyunkang/AdaCLIP/blob/HEAD/method/adaclip.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":"7dd2e9759231f093"}},{"code_sha256_prefix":"6e78fb5e970d4a0b","entry":"TextEmbebddingLayer","repo":"caoyunkang/AdaCLIP","repo_kind":"official","path":"method/adaclip.py","file_url":"https://github.com/caoyunkang/AdaCLIP/blob/HEAD/method/adaclip.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":"6e78fb5e970d4a0b"}},{"code_sha256_prefix":"2480af5fe5844d5b","entry":"Transformer","repo":"caoyunkang/AdaCLIP","repo_kind":"official","path":"method/adaclip.py","file_url":"https://github.com/caoyunkang/AdaCLIP/blob/HEAD/method/adaclip.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":"2480af5fe5844d5b"}},{"code_sha256_prefix":"51acd62f8b9ee4da","entry":"VisionTransformer","repo":"caoyunkang/AdaCLIP","repo_kind":"official","path":"method/adaclip.py","file_url":"https://github.com/caoyunkang/AdaCLIP/blob/HEAD/method/adaclip.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":"51acd62f8b9ee4da"}},{"code_sha256_prefix":"432535468a1356fd","entry":"_build_text_tower","repo":"caoyunkang/AdaCLIP","repo_kind":"official","path":"method/adaclip.py","file_url":"https://github.com/caoyunkang/AdaCLIP/blob/HEAD/method/adaclip.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":"432535468a1356fd"}},{"code_sha256_prefix":"98b01b93d323fa78","entry":"_build_vision_tower","repo":"caoyunkang/AdaCLIP","repo_kind":"official","path":"method/adaclip.py","file_url":"https://github.com/caoyunkang/AdaCLIP/blob/HEAD/method/adaclip.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":"98b01b93d323fa78"}},{"code_sha256_prefix":"5d5046aaa43f74c7","entry":"build_model_from_openai_state_dict","repo":"caoyunkang/adaclip","repo_kind":"official","path":"method/clip_model.py","file_url":"https://github.com/caoyunkang/adaclip/blob/HEAD/method/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":"5d5046aaa43f74c7"}},{"code_sha256_prefix":"9b5765523c6d17fd","entry":"freeze_batch_norm_2d","repo":"caoyunkang/adaclip","repo_kind":"official","path":"method/utils.py","file_url":"https://github.com/caoyunkang/adaclip/blob/HEAD/method/utils.py","link_basis":"plan_row","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":"9b5765523c6d17fd"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}