17370845950

【论文复现】PaDiM-Paddle:基于分布建模的异常检测与定位方法
本文基于PaddlePaddle复现PaDiM算法,通过CNN提取图像面片嵌入并建模高斯分布,用马氏距离检测异常。在MvTec数据集上,Image-Level AUC平均0.925,Pixel-Level AUC平均0.966,接近或优于PyTorch版本,还介绍了数据集及训练、验证等操作。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

PaDiM-Paddle:基于分布建模的异常检测与定位方法

1.1 简介

本项目基于PaddlePaddle 复现了论文:
PaDiM: a Patch Distribution Modeling Framework for Anomaly Detection and Localization

PaDiM是一种基于图像Patch的算法。它依赖于预先训练好的CNN功能提取器。 将图像分解为多个面片,并使用不同的特征提取层从每个面片中提取嵌入。 将不同层次的激活向量串联起来,得到包含不同语义层次和分辨率信息的嵌入向量。这有助于对细粒度和全局上下文进行编码。 然而,由于生成的嵌入向量可能携带冗余信息,因此使用随机选择来降低维数。 在整个训练批次中,为每个面片嵌入生成一个多元高斯分布。因此,对于训练图像集的每个面片,我们有不同的多元高斯分布。这些高斯分布表示为高斯参数矩阵。 在推理过程中,使用马氏距离对测试图像的每个面片位置进行评分。它使用训练期间为面片计算的协方差矩阵的逆矩阵。 马氏距离矩阵形成了异常图,分数越高表示异常区域。

本项目基于PaddlePaddle框架复现了PaDiM,并在MvTec数据集上进行了实验。

论文:

  • [1] Simonjan, Jennifer and Unluturk, Bige D. and Akyildiz, Ian F. PaDiM: a Patch Distribution Modeling Framework for Anomaly Detection and Localization

项目参考:

  • anomalib
  • PaDiM-Anomaly-Detection-Localization-master

1.2 复现精度

在MvTec数据集的测试效果对比如下表。

Image-Level AUC


Avg Carpet Grid Leather Tile Wood Bottle Cable Capsule Hazelnut Metal Nut Pill Screw Toothbrush Transistor Zipper
anomalib(Pytorch) 0.891 0.945 0.857 0.982 0.950 0.976 0.994 0.844 0.901 0.750 0.961 0.863 0.759 0.889 0.920 0.780
Paddle 0.925 1.000 0.907 1.000 0.981 0.994 0.998 0.833 0.863 0.870 0.970 0.885 0.729 0.992 0.947 0.907

Pixel-Level AUC


Avg Carpet Grid Leather Tile Wood Bottle Cable Capsule Hazelnut Metal Nut Pill Screw Toothbrush Transistor Zipper
anomalib(Pytorch) 0.968 0.984 0.918 0.994 0.934 0.947 0.983 0.965 0.984 0.978 0.970 0.957 0.978 0.988 0.968 0.979
Paddle 0.966 0.989 0.926 0.991 0.925 0.938 0.979 0.951 0.982 0.979 0.966 0.955 0.973 0.986 0.970 0.983

image-level auc的Mean为0.922。

pixel-level auc的Mean为0.966(966.2, 0.18% gap)。

1.3 数据集

数据集网站:MvTec数据集

AiStudio上的数据集:MVTec-AD

MVTec AD是MVtec公司提出的一个用于异常检测的数据集。与之前的异常检测数据集不同,该数据集模仿了工业实际生产场景,并且主要用于unsupervised anomaly detection。数据集为异常区域都提供了像素级标注,是一个全面的、包含多种物体、多种异常的数据集。

数据集包含不同领域中的五种纹理以及十种物体,且训练集中只包含正常样本,测试集中包含正常样本与缺陷样本,因此需要使用无监督方法学习正常样本的特征表示,并用其检测缺陷样本。这是符合现实的做法,因为异常情况不可预知并无法归纳。下图分别展示了几类图片的正常样本与缺陷样本,以及缺陷样本中的缺陷特写:

快速开始

In [ ]
%cd /home/aistudio/data/
!tar xvf data116034/mvtec_anomaly_detection.tar.xz

2.1 依赖安装

In [ ]
!pip install scikit-image

2.2 训练

一共有15个类别,这里需要对15个类别分别训练,最后取平均值作为验证指标. 随机数种子7

预训练模型:挂载数据集[140122] (https://aistudio.baidu.com/aistudio/datasetdetail/140122)

放在output下面,后面就可以直接评估

In [ ]
%cd /home/aistudio/PaDiM-Paddle/
!python train.py --data_path=/home/aistudio/data/ --category carpet  --val=True --save_path=./output --seed 7
In [ ]
%cd /home/aistudio/PaDiM-Paddle/
!python train.py --data_path=/home/aistudio/data/ --category grid  --val=True --save_path=./output --seed 7
In [ ]
%cd /home/aistudio/PaDiM-Paddle/
!python train.py --data_path=/home/aistudio/data/ --category leather  --val=True --save_path=./output --seed 7
In [ ]
%cd /home/aistudio/PaDiM-Paddle/
!python train.py --data_path=/home/aistudio/data/ --category tile  --val=True --save_path=./output --seed 7
In [ ]
%cd /home/aistudio/PaDiM-Paddle/
!python train.py --data_path=/home/aistudio/data/ --category wood  --val=True --save_path=./output --seed 7
In [ ]
%cd /home/aistudio/PaDiM-Paddle/
!python train.py --data_path=/home/aistudio/data/ --category bottle  --val=True --save_path=./output --seed 7
In [ ]
%cd /home/aistudio/PaDiM-Paddle/
!python train.py --data_path=/home/aistudio/data/ --category cable  --val=True --save_path=./output --seed 7
In [ ]
%cd /home/aistudio/PaDiM-Paddle/
!python train.py --data_path=/home/aistudio/data/ --category capsule  --val=True --save_path=./output --seed 7
In [ ]
%cd /home/aistudio/PaDiM-Paddle/
!python train.py --data_path=/home/aistudio/data/ --category hazelnut  --val=True --save_path=./output --seed 7
In [ ]
%cd /home/aistudio/PaDiM-Paddle/
!python train.py --data_path=/home/aistudio/data/ --category metal_nut  --val=True --save_path=./output --seed 7
In [ ]
%cd /home/aistudio/PaDiM-Paddle/
!python train.py --data_path=/home/aistudio/data/ --category pill  --val=True --save_path=./output --seed 7
In [ ]
%cd /home/aistudio/PaDiM-Paddle/
!python train.py --data_path=/home/aistudio/data/ --category screw  --val=True --save_path=./output --seed 7
In [ ]
%cd /home/aistudio/PaDiM-Paddle/
!python train.py --data_path=/home/aistudio/data/ --category toothbrush  --val=True --save_path=./output --seed 7
In [ ]
%cd /home/aistudio/PaDiM-Paddle/
!python train.py --data_path=/home/aistudio/data/ --category transistor  --val=True --save_path=./output --seed 7
In [ ]
%cd /home/aistudio/PaDiM-Paddle/
!python train.py --data_path=/home/aistudio/data/ --category zipper  --val=True --save_path=./output --seed 7

2.3 验证

下面验证仅以carpet为例子,其他类别修改category即可。

In [ ]
%cd /home/aistudio/PaDiM-Paddle/
!python val.py --data_path=/home/aistudio/data/ --category carpet  --model_path=./output/carpet/best.pdparams --save_picture=True --save_path=./output --seed 7

2.4 预测

In [ ]
%cd /home/aistudio/PaDiM-Paddle/
!python predict.py --picture_path=/home/aistudio/data/carpet/test/color/000.png --category carpet  --model_path=./output/carpet/best.pdparams --save_picture=True --save_path=./output --seed 7

可以在output/carpet/找到如下的类似结果:

2.5 导出

In [ ]
%cd /home/aistudio/PaDiM-Paddle/
!python export_model.py --depth 18 --img_size=224 --model_path=./output/carpet/best.pdparams --save_dir=./output

2.6 推理

需要开启infer的380行。

        # postprocess(args, test_imgs, args.category, results, distribution) # 可视化
In [ ]
%cd /home/aistudio/PaDiM-Paddle/
!python infer.py --use_gpu=True --model_file=output/model.pdmodel --input_file=/home/aistudio/data/carpet/test/color/000.png --params_file=output/model.pdiparams --category=carpet  --distribution=./output/distribution --save_path=./output --seed 7

2.7 TIPC

注意:本部分为论文复现赛内容,只是为了验证整个项目的训练推理的正确性。学习目的可以不进行这部分的运行,即这部分非项目必要部分。

因为test_tipc 不支持后处理的可视化环境,此时没有图像保存结果输出

首先安装auto_log,需要进行安装,安装方式如下: auto_log的详细介绍参考https://github.com/LDOUBLEV/AutoLog。

git clone https://github.com/LDOUBLEV/AutoLog
cd AutoLog/
pip3 install -r requirements.txt
python3 setup.py bdist_wheel
pip3 install ./dist/auto_log-1.2.0-py3-none-any.whl

进行TIPC:

bash test_tipc/prepare.sh test_tipc/configs/PaDiM/train_infer_python.txt 'lite_train_lite_infer'bash test_tipc/test_train_inference_python.sh test_tipc/configs/PaDiM/train_infer_python.txt 'lite_train_lite_infer'