{"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/dinomaly-the-less-is-more-philosophy-in-multi","title":"Dinomaly: The Less Is More Philosophy in Multi-Class Unsupervised Anomaly Detection","arxiv_id":"2405.14325","date":"2024-05-23","proceeding":"CVPR 2025 1","authors":["Jia Guo","Shuai Lu","Weihang Zhang","Fang Chen","Hongen Liao","Huiqi Li"],"abstract":"Recent studies highlighted a practical setting of unsupervised anomaly detection (UAD) that builds a unified model for multi-class images. Despite various advancements addressing this challenging task, the detection performance under the multi-class setting still lags far behind state-of-the-art class-separated models. Our research aims to bridge this substantial performance gap. In this paper, we introduce a minimalistic reconstruction-based anomaly detection framework, namely Dinomaly, which leverages pure Transformer architectures without relying on complex designs, additional modules, or specialized tricks. Given this powerful framework consisted of only Attentions and MLPs, we found four simple components that are essential to multi-class anomaly detection: (1) Foundation Transformers that extracts universal and discriminative features, (2) Noisy Bottleneck where pre-existing Dropouts do all the noise injection tricks, (3) Linear Attention that naturally cannot focus, and (4) Loose Reconstruction that does not force layer-to-layer and point-by-point reconstruction. Extensive experiments are conducted across popular anomaly detection benchmarks including MVTec-AD, VisA, and Real-IAD. Our proposed Dinomaly achieves impressive image-level AUROC of 99.6%, 98.7%, and 89.3% on the three datasets respectively, which is not only superior to state-of-the-art multi-class UAD methods, but also achieves the most advanced class-separated UAD records.","url_abs":"https://arxiv.org/abs/2405.14325v4","url_pdf":"https://arxiv.org/pdf/2405.14325v4.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":"dinomaly-the-less-is-more-philosophy-in-multi","repo_url":"https://github.com/guojiajeremy/dinomaly","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"pytorch","reach":{"status":"ok","spdx":"Apache-2.0"}},{"paper_slug":"dinomaly-the-less-is-more-philosophy-in-multi","repo_url":"https://github.com/septmars/DL","is_official":0,"mentioned_in_paper":0,"mentioned_in_github":0,"framework":"pytorch","reach":{"status":"ok","spdx":"MIT"}}],"tasks":[{"task_slug":"anomaly-detection","task_name":"Anomaly Detection"},{"task_slug":"multi-class-anomaly-detection","task_name":"Multi-class Anomaly Detection"},{"task_slug":"philosophy","task_name":"Philosophy"},{"task_slug":"unsupervised-anomaly-detection","task_name":"Unsupervised Anomaly Detection"}],"methods":[{"method_slug":"absolute-position-encodings","method_name":"Absolute Position Encodings"},{"method_slug":"adam","method_name":"Adam"},{"method_slug":"attention","method_name":"Attention"},{"method_slug":"bpe","method_name":"BPE"},{"method_slug":"dense-connections","method_name":"Dense Connections"},{"method_slug":"dropout","method_name":"Dropout"},{"method_slug":"label-smoothing","method_name":"Label Smoothing"},{"method_slug":"layer-normalization","method_name":"Layer Normalization"},{"method_slug":"linear-layer","method_name":"Linear Layer"},{"method_slug":"multi-head-attention","method_name":"Multi-Head Attention"},{"method_slug":"position-wise-feed-forward-layer","method_name":"Position-Wise Feed-Forward Layer"},{"method_slug":"residual-connection","method_name":"Residual Connection"},{"method_slug":"softmax","method_name":"Softmax"},{"method_slug":"transformer","method_name":"Transformer"}],"datasets_introduced":[],"methods_introduced":[],"results":[{"leaderboard":"/sota/anomaly-detection-on-mpdd","task":"Anomaly Detection","dataset":"MPDD","model":"Dinomaly","rank_in_archive_order":7,"of":16,"metrics":{"Detection AUROC":"97.2","Segmentation AUROC":"99.1"},"uses_additional_data":false},{"leaderboard":"/sota/anomaly-detection-on-mvtec-ad","task":"Anomaly Detection","dataset":"MVTec AD","model":"Dinomaly ViT-L (model-unified multi-class)","rank_in_archive_order":8,"of":148,"metrics":{"Detection AUROC":"99.77","Segmentation AP":"70.53","Segmentation AUPRO":"95.09","Segmentation AUROC":"98.54"},"uses_additional_data":true},{"leaderboard":"/sota/anomaly-detection-on-mvtec-ad","task":"Anomaly Detection","dataset":"MVTec AD","model":"Dinomaly ViT-B (model-unified multi-class)","rank_in_archive_order":19,"of":148,"metrics":{"Detection AUROC":"99.60","Segmentation AP":"69.29","Segmentation AUPRO":"94.79","Segmentation AUROC":"98.35"},"uses_additional_data":true},{"leaderboard":"/sota/anomaly-detection-on-visa","task":"Anomaly Detection","dataset":"VisA","model":"Dinomaly ViT-L (model-unified multi-class)","rank_in_archive_order":4,"of":50,"metrics":{"Detection AUROC":"98.9","F1-Score":"96.1","Segmentation AUPRO":"94.8","Segmentation AUPRO (until 30% FPR)":"94.8","Segmentation AUROC":"99.1"},"uses_additional_data":false},{"leaderboard":"/sota/multi-class-anomaly-detection-on-mvtec-ad","task":"Multi-class Anomaly Detection","dataset":"MVTec AD","model":"Dinomaly-Large","rank_in_archive_order":2,"of":13,"metrics":{"Detection AUROC":"99.8","Segmentation AUROC":"98.5"},"uses_additional_data":false},{"leaderboard":"/sota/multi-class-anomaly-detection-on-mvtec-ad","task":"Multi-class Anomaly Detection","dataset":"MVTec AD","model":"Dinomaly-Base","rank_in_archive_order":4,"of":13,"metrics":{"Detection AUROC":"99.6","Segmentation AUROC":"98.4"},"uses_additional_data":false}],"syntology":{"syntology_url":"https://syntology.ai/paper/2405.14325","atlas_url":"https://app.syntology.ai/?focus=2405.14325","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2405.14325"}},"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/guojiajeremy/dinomaly","reach":{"status":"ok","spdx":"Apache-2.0"}},{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/septmars/DL","reach":{"status":"ok","spdx":"MIT"}}],"summary":{"ran_draft_wrong":4,"ran_honours":1,"ran_fixture":1,"ran":3,"unverified":1},"by_repo_kind":{"official":{"samples":10,"ran":9,"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":"2a80220dabcb742a","entry":"conv1x1","repo":"guojiajeremy/dinomaly","repo_kind":"official","path":"models/de_resnet.py","file_url":"https://github.com/guojiajeremy/dinomaly/blob/HEAD/models/de_resnet.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":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"2a80220dabcb742a"}},{"code_sha256_prefix":"600ff2c45e0de056","entry":"conv3x3","repo":"guojiajeremy/dinomaly","repo_kind":"official","path":"models/de_resnet.py","file_url":"https://github.com/guojiajeremy/dinomaly/blob/HEAD/models/de_resnet.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":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"600ff2c45e0de056"}},{"code_sha256_prefix":"f6b944f50d3f15ae","entry":"count_parameters","repo":"guojiajeremy/dinomaly","repo_kind":"official","path":"dinomaly_mpdd_sep.py","file_url":"https://github.com/guojiajeremy/dinomaly/blob/HEAD/dinomaly_mpdd_sep.py","link_basis":"plan_row","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"well_formed","behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"f6b944f50d3f15ae"}},{"code_sha256_prefix":"8d035278d5e4a82a","entry":"deconv2x2","repo":"guojiajeremy/dinomaly","repo_kind":"official","path":"models/de_resnet.py","file_url":"https://github.com/guojiajeremy/dinomaly/blob/HEAD/models/de_resnet.py","link_basis":"plan_row","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"8d035278d5e4a82a"}},{"code_sha256_prefix":"55120f2026b56aa2","entry":"drop_path","repo":"guojiajeremy/dinomaly","repo_kind":"official","path":"models/vision_transformer.py","file_url":"https://github.com/guojiajeremy/dinomaly/blob/HEAD/models/vision_transformer.py","link_basis":"harvester_set","language":"python","status":"ran_fixture","verification_level":1,"contract_check":"RAISES","metamorphic_tier":"invariant","behaviour_fingerprint":true,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"55120f2026b56aa2"}},{"code_sha256_prefix":"98f14d98f255b3b2","entry":"get_data_transforms","repo":"guojiajeremy/dinomaly","repo_kind":"official","path":"dataset.py","file_url":"https://github.com/guojiajeremy/dinomaly/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":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"98f14d98f255b3b2"}},{"code_sha256_prefix":"a1db6c55cfde6e19","entry":"get_logger","repo":"guojiajeremy/dinomaly","repo_kind":"official","path":"dinomaly_mpdd_sep.py","file_url":"https://github.com/guojiajeremy/dinomaly/blob/HEAD/dinomaly_mpdd_sep.py","link_basis":"plan_row","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":"deterministic","behaviour_fingerprint":false,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"a1db6c55cfde6e19"}},{"code_sha256_prefix":"8a9c4b925a7212c9","entry":"get_strong_transforms","repo":"guojiajeremy/dinomaly","repo_kind":"official","path":"dataset.py","file_url":"https://github.com/guojiajeremy/dinomaly/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":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"8a9c4b925a7212c9"}},{"code_sha256_prefix":"dd357f5ea5a0a8a5","entry":"update_average","repo":"guojiajeremy/dinomaly","repo_kind":"official","path":"models/uad.py","file_url":"https://github.com/guojiajeremy/dinomaly/blob/HEAD/models/uad.py","link_basis":"first_harvest_node","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"Apache-2.0","inline_ok":true,"mcp_get_code":{"code_sha256":"dd357f5ea5a0a8a5"}},{"code_sha256_prefix":"ef97f3062faf843d","entry":"cdconv3x3","repo":"guojiajeremy/dinomaly","repo_kind":"official","path":"models/resnet.py","file_url":"https://github.com/guojiajeremy/dinomaly/blob/HEAD/models/resnet.py","link_basis":"first_harvest_node","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":"ef97f3062faf843d"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}