
深入 PaDiM基于补丁分布建模的异常检测与定位 —— Anomalib 源码级实战指南【免费下载链接】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/anomalibPaDiMPatch Distribution Modeling是异常检测领域极具代表性的分割级Segmentation算法它不依赖端到端训练而是通过预训练 CNN 提取多尺度特征、为每个图像补丁拟合多元高斯分布再以马氏距离完成异常评分与像素级定位。本文以 Anomalib 仓库中 PaDiM 官方文档 为核心骨架结合 torch_model.py、lightning_model.py、anomaly_map.py 等源码与基准测试数据系统讲解其算法原理、配置参数、训练推理流程与工程实践要点。读完本文你将掌握在 Anomalib 中一键训练 PaDiM、调整骨干网络与特征维度、理解异常图生成链路并复现 MVTec AD 基准结果的全部技能。一、算法核心原理补丁分布建模PaDiM 的核心思想是正常样本在每个空间补丁位置上的特征向量服从一个多元高斯分布测试时通过与参考分布的马氏距离偏离程度来度量异常。其整体流程分为三个关键阶段对应 README 中的 Description多尺度补丁特征提取图像被拆分为补丁使用预训练 CNN 特征提取器从多个不同层抽取每个补丁的嵌入向量。由于不同卷积层对应不同感受野与语义层级将多层激活向量拼接后嵌入向量同时携带了细粒度低级纹理与全局高级语义上下文信息。随机降维拼接后的嵌入向量可能包含冗余信息因此通过随机选择random selection进行维度缩减只保留固定数量的特征维度。逐补丁高斯建模对整个训练批次为每个补丁嵌入生成一个多元高斯分布所有补丁的高斯参数组合成一个高斯参数矩阵mean inverse covariance。推理阶段使用马氏距离Mahalanobis distance为测试图像的每个补丁位置打分打分时直接使用训练阶段为该补丁计算的协方差矩阵的逆。所有补丁的马氏距离构成异常图anomaly map分数越高代表该区域越可能异常——这就是 README 中Model Type: Segmentation像素级分割定位的含义。二、源码级原理剖析特征提取到异常图2.1 多层级特征拼接与随机降维generate_embedding在 torch_model.py 中generate_embedding方法实现多层级特征的拼接与降维以layers[0]分辨率最高的层的特征图为基准后续层特征图通过F.interpolate(..., modenearest)上采样到与首层一致的空间尺寸沿通道维torch.cat拼接所有层特征用预先随机生成的索引idx通过torch.index_select完成维度子采样。这里的idx在模型初始化时通过torch.randperm(self.n_features_original)[: self.n_features]生成并注册为 buffer见 torch_model.py源码注释明确说明Since idx is randomly selected, save it with model to get same results——随机索引会随模型保存保证推理结果可复现。以 ResNet-18 骨干、layers[layer1, layer2, layer3]、输入 224×224 为例三层特征形状分别为[B, 64, 56, 56]、[B, 128, 28, 28]、[B, 256, 14, 14]拼接后原始特征维度为 448再按n_features100随机保留 100 维此示例来自 torch_model.py 的 docstring。2.2 逐补丁多元高斯拟合MultiVariateGaussian训练阶段每个 batch 的嵌入被收集进memory_bank训练结束后调用fit()一次性拟合高斯分布见 torch_model.py随后清空 memory bank 以释放显存。高斯拟合的核心实现在 multi_variate_gaussian.py计算每个空间位置共 H×W 个补丁沿 batch 维的均值mean形状为(C, H*W)为每个补丁位置估计协方差矩阵实现与numpy.cov等价并在对角上添加0.01正则项保证可逆整体协方差再叠加1e-5 * I进一步数值稳定化最后用torch.linalg.inv求逆得到inv_covariance形状为(H*W, C, C)特别地当设备为 MPSApple Silicon时求逆操作会回退到 CPU 执行再拷回设备见 multi_variate_gaussian.py。2.3 推理马氏距离 → 上采样 → 高斯平滑AnomalyMapGenerator推理时由 AnomalyMapGenerator 完成异常图生成对应 README 中矩阵化马氏距离形成异常图的描述具体三步compute_distance实现论文 Section III-C 的公式 (2)计算测试补丁嵌入与参考分布的马氏距离(delta^T · inv_cov · delta)后开方并clamp(0)得到(B, 1, H, W)的原始分数图见 anomaly_map.pyup_sample通过F.interpolate(..., modebilinear)将分数图上采样回原始输入图像尺寸见 anomaly_map.pysmooth_anomaly_map使用GaussianBlur2d进行高斯平滑降噪平滑核标准差sigma默认值为 4核尺寸由2 * int(4.0 * sigma 0.5) 1计算见 anomaly_map.py。最终在 forward 中异常图取空间维最大值torch.amax作为图像级异常分数pred_score与异常图一起封装进InferenceBatch返回。三、模型参数详解与默认值PadimLightning 模块见 lightning_model.py的构造参数如下参数类型默认值说明backbonestrresnet18预训练骨干网络名称常用resnet18、wide_resnet50_2等 timm 模型layerslist[str][layer1, layer2, layer3]抽取特征的骨干层名称列表按分辨率从高到低排列pre_trainedboolTrue是否使用预训练骨干权重n_featuresint | NoneNone降维后保留的特征数论文默认值见下表pre_processor/post_processor/evaluator/visualizermodule | boolTrueAnomalib 标准预处理、后处理、评估器与可视化组件开关关键注意n_features为None时自动使用论文默认值定义于 torch_model.py骨干网络默认 n_featuresresnet18100wide_resnet50_2550若使用其他骨干网络则必须显式指定n_features否则抛出ValueError同时要求0 n_features n_features_original原始特征总维数否则同样报错见 torch_model.py。从源码结构还可以推断以下行为特征无需传统训练configure_optimizers直接返回空lightning_model.pytraining_step只做特征抽取并返回一个占位 dummy losslightning_model.py真正学习发生在fit()对高斯参数的估计默认 trainer 参数max_epochs1、val_check_interval1.0、num_sanity_val_steps0、devices1仅支持单 GPU见 lightning_model.py学习类型LearningType.ONE_CLASS属于单类别学习范式lightning_model.py继承自MemoryBankMixin与 PatchCore 等共享特征记忆库 事后拟合的工程模式。四、快速上手三种使用方式4.1 CLI 一键训练README 官方命令在仓库根目录执行anomalib train --model Padim --data MVTecAD --data.category category其中category替换为 MVTec AD 数据集的类别如bottle、carpet、transistor等。README 中标注Model Type: Segmentation即该模型同时输出图像级分数与像素级异常图。4.2 配置文件方式推荐用于复现实验模型配置参考 padim.yamlmodel: class_path: anomalib.models.Padim init_args: layers: - layer1 - layer2 - layer3 backbone: resnet18 pre_trained: true n_features: null数据配置参考 mvtec.yamltest_split_mode: from_dir、val_split_mode: same_as_test等字段可按需调整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组合使用anomalib train --config examples/configs/model/padim.yaml --data examples/configs/data/mvtec.yaml4.3 Python APIEngine 训练与预测来自 lightning_model.py 的官方示例from anomalib.models import Padim from anomalib.data import MVTecAD from anomalib.engine import Engine # 初始化模型与数据 datamodule MVTecAD() model Padim( backboneresnet18, layers[layer1, layer2, layer3], pre_trainedTrue, ) engine Engine() engine.train(modelmodel, datamoduledatamodule) predictions engine.predict(modelmodel, datamoduledatamodule)模型也可通过get_model(Padim)或带init_args的配置字典动态实例化相关用法在单元测试 test_model_utils.py 中有完整覆盖包括传入backbone: wide_resnet50_2与完整class_path的两种注册方式。五、MVTec AD 基准结果以下结果均由 seed42收集与 README 保持一致。图像级 AUC 与 F1 反映图像是否异常的判别能力像素级 AUC 反映异常区域定位能力。5.1 Image-Level AUC图像级 AUCAvgCarpetGridLeatherTileWoodBottleCableCapsuleHazelnutMetal NutPillScrewToothbrushTransistorZipperResNet-180.8910.9450.8570.9820.9500.9760.9940.8440.9010.7500.9610.8630.7590.8890.9200.780Wide ResNet-500.9500.9950.9421.00.9740.9930.9990.8780.9270.9640.9890.9390.8450.9420.9760.8825.2 Pixel-Level AUC像素级 AUCAvgCarpetGridLeatherTileWoodBottleCableCapsuleHazelnutMetal NutPillScrewToothbrushTransistorZipperResNet-180.9680.9840.9180.9940.9340.9470.9830.9650.9840.9780.9700.9570.9780.9880.9680.979Wide ResNet-500.9790.9910.9700.9930.9550.9570.9850.9700.9880.9850.9820.9660.9880.9910.9760.9865.3 Image F1 Score图像级 F1AvgCarpetGridLeatherTileWoodBottleCableCapsuleHazelnutMetal NutPillScrewToothbrushTransistorZipperResNet-180.9160.9300.8930.9840.9340.9520.9760.8580.9600.8360.9740.9320.8790.9230.7960.915Wide ResNet-500.9510.9890.9301.00.9600.9830.9920.8560.9820.9370.9780.9460.8950.9520.9140.947对比可见更宽的 Wide ResNet-50 骨干在图像级 AUC/F1 上全面优于 ResNet-18图像级平均 AUC 从 0.891 提升至 0.950说明更强的骨干特征对补丁分布建模至关重要而像素级定位两者的差距相对较小0.968 vs 0.979侧面反映 PaDiM 的定位能力对骨干宽度依赖较小。六、工程实践要点与限制6.1 特征记忆库与显存权衡训练时所有样本的嵌入先存入memory_bank再在fit()中一次性torch.vstack拼接后拟合高斯并清空torch_model.py。这意味着训练阶段会累积特征而非更新梯度内存占用随训练样本数线性增长拟合后显存被及时释放。若 memory bank 为空例如跳过训练直接验证fit()会抛出ValueError提示。6.2 推理链路与部署推理输出同时包含pred_score图像级分数与anomaly_map像素级异常图默认后处理器PostProcessor()会基于此进行阈值化与可视化lightning_model.py。仓库的部署与导出测试如 test_ov_export.py、test_inferencer.py均覆盖了 PaDiM 的 OpenVINO 导出与推理路径因此训练完成后可借助 Anomalib 的导出能力将其部署到边缘设备进行实时推理。6.3 已知限制仅支持单设备训练默认devices1暂不支持多卡并行不支持 ViT 骨干PadimModel基于 timm 的features_onlyCNN 模式output_fmtNCHW与 transformer 类骨干的 token 输出格式不兼容可复现性随机降维索引随模型保存配合固定 seed基准使用42即可稳定复现论文指标。七、进一步阅读模型完整 API 参考PaDiM 参考文档模型入口与注册padim/init.py核心源码torch_model.py | lightning_model.py | anomaly_map.py | multi_variate_gaussian.py模型注册与动态加载测试test_model_utils.py【免费下载链接】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),仅供参考