Anomalib 图像数据集加载指南:Image Datamodules 的完整参考与底层拆分机制

📅 发布时间:2026/9/17 17:48:51
Anomalib 图像数据集加载指南:Image Datamodules 的完整参考与底层拆分机制
Anomalib 图像数据集加载指南Image Datamodules 的完整参考与底层拆分机制【免费下载链接】anomalibAn anomaly detection library comprising state-of-the-art algorithms and features such as experiment management, hyper-parameter optimization, and edge inference.项目地址: https://gitcode.com/GitHub_Trending/an/anomalib本篇基于仓库中的 Image Datamodules 参考文档 展开介绍 Anomalib 提供的图像异常检测数据集模块Image Datamodules清单、通用参数、数据集切分模式以及如何通过配置文件和代码两种方式加载数据。读完后你可以直接为 MVTec AD、MVTec LOCO、自定义文件夹等 14 种数据集格式构建训练/评估数据管道并理解其背后的切分与增强机制。一、什么是 Image DatamodulesAnomalib 的图像 Datamodule 专门用于处理基于图像的异常检测数据集。它们为训练和推理提供标准化的接口负责图像数据的加载与预处理。每个 Datamodule 都继承自 PyTorch Lightning 的LightningDataModule经由 Anomalib 的基类 AnomalibDataModule因此可以直接交给 LightningTrainer使用。所有图像 Datamodule 的源码位于 src/anomalib/data/datamodules/image/并从 anomalib.data 包 统一导出因此最简导入方式就是from anomalib.data import MVTecAD。支持的数据集清单参考文档列出了当前支持的全部图像 Datamodule结合各模块源码文件位置整理如下Datamodule数据集说明源码文件AutoVI汽车视觉缺陷检测Automotive Visual Defect Inspection数据集autovi.pyBMAD医学异常检测数据集bmad.pyBTech钢铁制造表面缺陷检测数据集btech.pyDatumaro兼容 Intel Geti™ 导出格式Datumaro的数据集datumaro.pyFolder自定义文件夹组织方式normal/abnormal 目录folder.pyKolektor电枢表面缺陷检测数据集kolektor.pyMPDD金属零件视觉缺陷检测数据集mpdd.pyMVTecAD工业异常检测基准数据集mvtecad.pyMVTecAD2支持自然图像场景的 MVTec AD 2 数据集mvtecad2.pyMVTecLOCO逻辑与结构异常检测数据集mvtec_loco.pyRealIAD面向工业异常检测真实场景的 Real-IAD 数据集realiad.pyTabular通过表格image_path label描述的自定义数据集tabular.pyVAD面向汽车应用的 Valeo 异常检测数据集vad.pyVisaVisual AnomalyVisA数据集visa.py值得注意的是从 数据包导出列表 看__all__中还包含参考文档未单独列出卡片的Kaputt物流场景视觉缺陷检测数据集见 kaputt.py可以直接from anomalib.data import Kaputt使用。此外src/anomalib/data/datamodules/image/init.py 中定义了ImageDataFormat字符串枚举为每种数据集格式提供机器可读的标识符如MVTEC_AD mvtecad、FOLDER folder、MVTEC_LOCO mvtec_loco、TABULAR tabular等。该枚举还会被合并进顶层的DataFormat枚举见 anomalib.data 的DataFormat定义供 CLI 和配置系统在字符串层面识别数据集格式。二、基类 AnomalibDataModule 与通用参数所有图像 Datamodule 共享同一个基类 AnomalibDataModule它统一承担了数据集切分、验证集构建与 DataLoader 配置。理解它的通用参数是配置任意一个具体 Datamodule 的前提。通用构造参数以 MVTecAD 为例所有图像 Datamodule 都接受以下公共参数默认值取自基类与子类签名参数类型默认值说明train_batch_sizeint32训练 DataLoader 的批大小eval_batch_sizeint32验证/测试 DataLoader 的批大小num_workersint8数据加载的 worker 数量train_augmentationsTransform \| NoneNone训练阶段增强torchvisiontransforms.v2val_augmentationsTransform \| NoneNone验证阶段增强test_augmentationsTransform \| NoneNone测试阶段增强augmentationsTransform \| NoneNone当未提供分阶段增强时作用于所有阶段test_split_modeTestSplitMode \| str视数据集而定测试集获取方式test_split_ratiofloat0.2子类/0.5基类兜底用于测试集的采样比例val_split_modeValSplitMode \| str视数据集而定验证集获取方式val_split_ratiofloat0.5验证集采样比例seedint \| NoneNone切分随机种子保证可复现其中各阶段增强存在回退逻辑在基类 初始化代码 中train_augmentations、val_augmentations、test_augmentations若为None则依次回退到通用的augmentations参数。测试集与验证集的切分模式异常检测与监督学习的核心差异在于训练集只含正常样本验证/测试集中才有异常样本。因此 Anomalib 用两个枚举显式描述了测试集从哪里来、验证集从哪里来定义在 anomalib/data/utils/split.pyTestSplitMode测试集来源取值含义none不构建测试切分from_dir使用数据集中独立的测试目录多数工业数据集的默认方式synthetic从正常样本合成异常SyntheticAnomalyDatasetValSplitMode验证集来源取值含义none不构建验证集same_as_test验证集与测试集相同from_train从训练集按比例随机采样标签感知from_test从测试集按比例随机采样标签感知synthetic从训练正常样本合成异常验证集from_dir使用数据集自带的专用验证目录不同数据集的默认值并不完全一致这在实际配置时需要注意。例如从源码签名看MVTecAD 默认test_split_modeFROM_DIR、val_split_modeSAME_AS_TEST——因为 MVTec AD 自带 test 目录验证集直接复用测试集Folder 与 Tabular 默认test_split_modeFROM_DIR、val_split_modeFROM_TESTDatumaro 默认val_split_modeFROM_TEST。如果你希望显式控制可以参考 MVTecAD 的文档字符串 中的示例from anomalib.data import MVTecAD from anomalib.data import ValSplitMode # 从测试集中划出 10% 作为验证集 datamodule MVTecAD( val_split_modeValSplitMode.FROM_TEST, val_split_ratio0.1, ) # 用合成异常构建验证集 datamodule MVTecAD( val_split_modeValSplitMode.SYNTHETIC, val_split_ratio0.2, )三、典型数据集实战3.1 MVTec AD自动下载的工业基准数据集MVTecAD 是最常用的基准数据集模块。它的两个特色是按类别category加载和自动下载解压。from anomalib.data import MVTecAD # 自动下载若本地不存在root 默认为 ./datasets/MVTecAD datamodule MVTecAD( root./datasets/MVTecAD, categorybottle, # 可选类别如 cable、capsule、transistor 等 ) datamodule.setup() batch next(iter(datamodule.train_dataloader())) print(batch.keys()) # dict_keys([image, label, mask, image_path, mask_path]) print(batch[image].shape) # torch.Size([32, 3, H, W])从源码看自动下载逻辑位于 prepare_data 方法当root/category目录不存在时调用download_and_extract拉取源码中DOWNLOAD_INFO定义的数据集归档并校验哈希。该方法的文档注明 MVTec AD 数据集以 CC BY-NC-SA 4.0 协议发布请遵守其使用条款。调用setup()后一个 batch 的标准字段为image张量、label0 正常 / 1 异常、mask像素级掩码、image_path与mask_path——这组字段是 Anomalib 图像数据管道的统一输出契约后续模型训练与可视化都依赖它。3.2 Folder自定义目录结构对于自采的工业图像Folder 是最直接的选择。源码文档字符串中给出了约定目录结构root/ ├── normal_dir/ # 正常图像训练 │ ├── image1.png │ └── image2.png ├── abnormal_dir/ # 异常图像 │ ├── image3.png │ └── image4.png └── mask_dir/ # 异常图像对应的掩码 ├── mask3.png └── mask4.png构造参数要点name必填数据集名称用于日志与保存normal_dir必填正常图像目录支持单个路径或路径序列root包含 normal/abnormal 目录的根目录abnormal_dir、normal_test_dir、mask_dir均可选支持多目录normal_split_ratio默认0.2当不存在独立正常测试图时从正常训练图中划出测试集的比例extensions默认None限制读取的图片扩展名。from anomalib.data import Folder datamodule Folder( namecustom, root./datasets/custom, normal_dirgood, abnormal_dirdefect, mask_dirmask, ) datamodule.setup() batch next(iter(datamodule.train_dataloader())) # batch.keys() - dict_keys([image, label, mask, image_path, mask_path])3.3 Tabular用表格描述数据集Tabular 适合样本已经过标注系统管理的场景直接传入image_path、label_index、split三列的dict/list/pandas.DataFrame每个样本显式声明属于Split.TRAIN还是Split.TEST切分完全由表格决定from anomalib.data import Tabular from anomalib.data import LabelName, Split samples { image_path: [images/image1.png, images/image2.png, images/image3.png], label_index: [LabelName.NORMAL, LabelName.NORMAL, LabelName.ABNORMAL], split: [Split.TRAIN, Split.TRAIN, Split.TEST], } datamodule Tabular(namecustom, samplessamples, root./datasets/custom) datamodule.setup()源码中Tabular还提供基于文件的加载方式且对文件格式做了显式白名单见 SUPPORTED_FILE_FORMATS只允许csv、json、parquet刻意排除了pickle、hdf等可能在反序列化时执行任意代码的格式。3.4 DatumaroIntel Geti 导出格式Datumaro 支持 Intel Geti™ 导出的 Datumaro 格式数据集当前仅支持该来源的标注。约定目录结构为root/ ├── annotations/ │ ├── train.json │ └── test.json └── images/ ├── train/... └── test/...from anomalib.data import Datumaro datamodule Datumaro( root./datasets/datumaro, train_batch_size32, eval_batch_size32, num_workers8, ) datamodule.setup() batch next(iter(datamodule.train_dataloader())) # dict_keys([image_path, label, image])可以注意到Datumaro 格式的 batch 没有mask字段其标注以实例框/分类为主这与 MVTec 类带掩码的数据集不同在下游使用 mask 相关功能时需要留意。四、setup() 的内部执行流程切分是如何发生的各子类只实现自己的_setup()创建 train/test 数据集真正复杂的切分逻辑统一在基类 setup 方法 中编排顺序为_setup(stage)由子类实例化train_data/test_data例如 MVTecAD 分别创建Split.TRAIN与Split.TEST的MVTecADDataset_create_test_split()处理测试集来源_create_val_split()处理验证集来源_update_augmentations()把用户增强与模型侧预处理PreProcessor中的Resize合并。测试集构建优先目录其次采样基类的_create_test_split体现了异常检测数据的一个关键细节——测试集必须同时包含正常样本和异常样本否则阈值估计与评估都会失真若test_data中已有正常样本has_normal为真先按标签把正常样本分离出来split_by_label异常样本留在test_data若测试集中没有正常样本且test_split_mode ! none则按test_split_ratio从训练集中random_split采样正常图最后按模式归并from_dir直接把正常样本并入test_datasynthetic则把正常样本交给SyntheticAnomalyDataset.from_dataset生成合成异常。验证集构建五种来源策略_create_val_split按ValSplitMode分发FROM_DIR数据集自带验证目录直接跳过FROM_TRAIN/FROM_TEST分别对训练集/测试集做标签感知的random_splitlabel_awareTrue保证切分后各子集仍保有正常/异常两类样本SAME_AS_TESTcopy.deepcopy(self.test_data)验证与测试完全一致MVTecAD 的默认策略SYNTHETIC从训练集中随机划出正常样本再生成合成异常作为验证集。底层的 random_split 实现 值得细看当label_awareTrue时它先按label_index分组dataset.samples.groupby(label_index)在每个标签内部按比例随机子采样再把各标签的同位子集拼接回最终切分——这就是标签感知的实际含义。若提供了seed会通过torch.Generator().manual_seed(seed)保证切分可复现。增强与模型 Resize 的自动合并_update_subset_augmentations处理了一个容易被忽视的冲突场景当模型 PreProcessor 自带Resize时基类会把该Resize追加到数据集增强链的末尾使缩放发生在 collate 之前以降低 DataLoader 共享内存开销若用户增强里已有尺寸/插值/抗锯齿设置不一致的Resize会记录 warning 提示模型看到的最终输入尺寸由模型 transform 决定。这解释了为何 Anomalib 中调整有效输入尺寸应修改模型 PreProcessor而不是在 datamodule 增强里另写一个 Resize。五、两种工程化用法配置文件与工厂函数除了直接实例化Anomalib 提供了两条声明式路径适合 CLI 训练与实验管理。5.1 YAML 配置 AnomalibDataModule.from_config仓库提供了 MVTec 数据配置示例class_path: anomalib.data.MVTecAD init_args: root: ./datasets/MVTecAD category: bottle train_batch_size: 32 eval_batch_size: 32 num_workers: 8 test_split_mode: from_dir test_split_ratio: 0.2 val_split_mode: same_as_test val_split_ratio: 0.5 seed: null以及 Folder 格式的配置示例用 MVTec 的 bottle 类别目录组织成 normal/abnormal/mask 目录并指定extensions: [.png]。examples/configs/data/ 目录下还包含btech.yaml、mvtec_loco.yaml、mvtecad2.yaml、realiad.yaml、visa.yaml、kaputt.yaml、datumaro.yaml等 20 个数据集配置可直接参考各数据集的参数写法。代码侧通过 from_config 类方法 加载底层使用 jsonargparse 的add_subclass_arguments完成按类名动态实例化并支持以关键字参数覆盖配置项from anomalib.data import AnomalibDataModule data_config examples/configs/data/mvtec.yaml datamodule AnomalibDataModule.from_config(config_pathdata_config) # 覆盖配置中的参数 datamodule AnomalibDataModule.from_config( config_pathdata_config, **{data.train_batch_size: 8} )5.2get_datamodule工厂函数get_datamodule 则面向 pipeline 场景传入DictConfig/dict读取data.class_path如anomalib.data.MVTecAD与data.init_args动态导入anomalib.data包并实例化对应类找不到类时抛出UnknownDatamoduleError。函数还对init_args中的image_size做了to_tuple归一化保证配置里写列表也能得到元组。该函数是 pipeline 模块把数据配置转成 DataModule 的入口配置中class_path init_args的写法与上面from_config完全一致因此 YAML 示例可以无缝复用于两类场景。六、单元测试如何验证数据管道数据模块的行为有大量单元测试覆盖位于 tests/unit/data/datamodule/约 31 个测试文件按数据集逐个验证切分、dataloader 输出等契约辅助数据构造逻辑在 tests/helpers/data.py。如果你需要确认某个 Datamodule 在某版本下的具体行为如 batch 字段、切分比例生效情况优先查对应数据集的测试文件比只看文档字符串更精确。小结选择 Datamodule标准基准用MVTecAD/MVTecAD2/MVTecLOCO等专用类自采图像按目录组织用Folder样本由标注表管理用TabularIntel Geti 导出用Datumaro。完整清单见 参考文档 与 anomalib.data 导出列表。掌握切分模式TestSplitModenone/from_dir/synthetic与ValSplitModenone/same_as_test/from_train/from_test/synthetic/from_dir是配置验证集、测试集的核心开关注意各数据集默认值不同。工程化加载用class_path init_args的 YAML 配置配合AnomalibDataModule.from_config或get_datamodule可在 CLI 与 pipeline 之间复用同一份数据配置。行为兜底测试集正常样本缺失时会自动从训练集采样、模型 Resize 会自动合并进增强链——这些默认机制的源码都在 AnomalibDataModule 中可逐行核对。【免费下载链接】anomalibAn anomaly detection library comprising state-of-the-art algorithms and features such as experiment management, hyper-parameter optimization, and edge inference.项目地址: https://gitcode.com/GitHub_Trending/an/anomalib创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考