{"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/cableinspect-ad-an-expert-annotated-anomaly","title":"CableInspect-AD: An Expert-Annotated Anomaly Detection Dataset","arxiv_id":"2409.20353","date":"2024-09-30","proceeding":null,"authors":["Akshatha Arodi","Margaux Luck","Jean-Luc Bedwani","Aldo Zaimi","Ge Li","Nicolas Pouliot","Julien Beaudry","Gaétan Marceau Caron"],"abstract":"Machine learning models are increasingly being deployed in real-world contexts. However, systematic studies on their transferability to specific and critical applications are underrepresented in the research literature. An important example is visual anomaly detection (VAD) for robotic power line inspection. While existing VAD methods perform well in controlled environments, real-world scenarios present diverse and unexpected anomalies that current datasets fail to capture. To address this gap, we introduce $\\textit{CableInspect-AD}$, a high-quality, publicly available dataset created and annotated by domain experts from Hydro-Qu\\'ebec, a Canadian public utility. This dataset includes high-resolution images with challenging real-world anomalies, covering defects with varying severity levels. To address the challenges of collecting diverse anomalous and nominal examples for setting a detection threshold, we propose an enhancement to the celebrated PatchCore algorithm. This enhancement enables its use in scenarios with limited labeled data. We also present a comprehensive evaluation protocol based on cross-validation to assess models' performances. We evaluate our $\\textit{Enhanced-PatchCore}$ for few-shot and many-shot detection, and Vision-Language Models for zero-shot detection. While promising, these models struggle to detect all anomalies, highlighting the dataset's value as a challenging benchmark for the broader research community. Project page: https://mila-iqia.github.io/cableinspect-ad/.","url_abs":"https://arxiv.org/abs/2409.20353v1","url_pdf":"https://arxiv.org/pdf/2409.20353v1.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":"cableinspect-ad-an-expert-annotated-anomaly","repo_url":"https://github.com/mila-iqia/cableinspect-ad-code","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":0,"framework":"pytorch","reach":{"status":"ok","spdx":"Apache-2.0"}}],"tasks":[{"task_slug":"anomaly-detection","task_name":"Anomaly Detection"}],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"syntology_url":null,"atlas_url":"https://app.syntology.ai/?focus=2409.20353","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2409.20353"}},"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/mila-iqia/cableinspect-ad-code","reach":{"status":"ok","spdx":"Apache-2.0"}}],"summary":{"ran":16,"unverified":6},"by_repo_kind":{"official":{"samples":22,"ran":16,"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":"bf01bf57f7eee8c7","entry":"add_class_description","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"src/anomaly_detector/base_anomaly_detector_inference.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/src/anomaly_detector/base_anomaly_detector_inference.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":"bf01bf57f7eee8c7"}},{"code_sha256_prefix":"d7c35998ffe39b5d","entry":"add_class_name","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"src/anomaly_detector/base_anomaly_detector_inference.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/src/anomaly_detector/base_anomaly_detector_inference.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":"d7c35998ffe39b5d"}},{"code_sha256_prefix":"07fa7d6e6f042906","entry":"build_data_rows_from_data_dict","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"dataset/generate_labels.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/dataset/generate_labels.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":"07fa7d6e6f042906"}},{"code_sha256_prefix":"ce8d2afe5c019df9","entry":"build_labels_dataframe_from_annotations","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"dataset/generate_labels.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/dataset/generate_labels.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":"ce8d2afe5c019df9"}},{"code_sha256_prefix":"0fcc22a29c7ed53f","entry":"build_labels_dataframe_from_data_rows","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"dataset/generate_labels.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/dataset/generate_labels.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":"0fcc22a29c7ed53f"}},{"code_sha256_prefix":"4b46ad44d8b56051","entry":"check_df_cable_side_pass","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"dataset/utils.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/dataset/utils.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":"4b46ad44d8b56051"}},{"code_sha256_prefix":"753b40afacd6ec68","entry":"compute_metrics","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"src/anomaly_detector/evaluation_utils.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/src/anomaly_detector/evaluation_utils.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":"753b40afacd6ec68"}},{"code_sha256_prefix":"d7f4146dfedb7f98","entry":"crop_image","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"dataset/raw_to_cropped_dataset.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/dataset/raw_to_cropped_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":"d7f4146dfedb7f98"}},{"code_sha256_prefix":"a8e594894de43df9","entry":"extract_metrics","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"src/anomaly_detector/evaluation_utils.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/src/anomaly_detector/evaluation_utils.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":"a8e594894de43df9"}},{"code_sha256_prefix":"94bd9041d52daa8d","entry":"flatten_dict","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"src/enhanced-patchcore/post_processing/post_processing_unsupervised_results.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/src/enhanced-patchcore/post_processing/post_processing_unsupervised_results.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":"94bd9041d52daa8d"}},{"code_sha256_prefix":"6b425c3917a99747","entry":"get_anomaly_ids","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"dataset/utils.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/dataset/utils.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":"6b425c3917a99747"}},{"code_sha256_prefix":"6e8bda85f761c8f1","entry":"get_border","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"dataset/raw_to_cropped_dataset.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/dataset/raw_to_cropped_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":"6e8bda85f761c8f1"}},{"code_sha256_prefix":"922b7ffc50bacd31","entry":"identify_connected_anomalies","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"dataset/utils.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/dataset/utils.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":"922b7ffc50bacd31"}},{"code_sha256_prefix":"416586b364c17784","entry":"read_prompt_from_yaml","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"src/anomaly_detector/base_anomaly_detector_inference.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/src/anomaly_detector/base_anomaly_detector_inference.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":"416586b364c17784"}},{"code_sha256_prefix":"704fc42c8390c49f","entry":"read_result_csv","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"src/anomaly_detector/evaluation_utils.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/src/anomaly_detector/evaluation_utils.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":"704fc42c8390c49f"}},{"code_sha256_prefix":"d731e161ae42ec44","entry":"remove_broken_runs","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"src/enhanced-patchcore/post_processing/post_processing_unsupervised_results.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/src/enhanced-patchcore/post_processing/post_processing_unsupervised_results.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":"d731e161ae42ec44"}},{"code_sha256_prefix":"943f15268bdd462e","entry":"add_anomalous_label","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"src/enhanced-patchcore/src/anomalib/post_processing/post_process.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/src/enhanced-patchcore/src/anomalib/post_processing/post_process.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":"943f15268bdd462e"}},{"code_sha256_prefix":"4447ac929ca7ab0c","entry":"add_label","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"src/enhanced-patchcore/src/anomalib/post_processing/post_process.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/src/enhanced-patchcore/src/anomalib/post_processing/post_process.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":"4447ac929ca7ab0c"}},{"code_sha256_prefix":"fe1771d45fa5b75a","entry":"add_normal_label","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"src/enhanced-patchcore/src/anomalib/post_processing/post_process.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/src/enhanced-patchcore/src/anomalib/post_processing/post_process.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":"fe1771d45fa5b75a"}},{"code_sha256_prefix":"3a9a6499b8b37aad","entry":"read_image","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"dataset/raw_to_cropped_dataset.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/dataset/raw_to_cropped_dataset.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":"3a9a6499b8b37aad"}},{"code_sha256_prefix":"6d3c92b52fa4d6da","entry":"update_multi_gpu_training_config","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"src/enhanced-patchcore/src/anomalib/config/config.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/src/enhanced-patchcore/src/anomalib/config/config.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":"6d3c92b52fa4d6da"}},{"code_sha256_prefix":"5179dd442c5dbf8b","entry":"update_nncf_config","repo":"mila-iqia/cableinspect-ad-code","repo_kind":"official","path":"src/enhanced-patchcore/src/anomalib/config/config.py","file_url":"https://github.com/mila-iqia/cableinspect-ad-code/blob/HEAD/src/enhanced-patchcore/src/anomalib/config/config.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":"5179dd442c5dbf8b"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}