This is the unofficial code based on PaddlePaddle of paper:
PaDiM: a Patch Distribution Modeling Framework for Anomaly Detection and Localization
PaDiM是一种基于图像Patch的算法。它依赖于预先训练好的CNN功能提取器。 将图像分解为多个面片,并使用不同的特征提取层从每个面片中提取嵌入。 将不同层次的激活向量串联起来,得到包含不同语义层次和分辨率信息的嵌入向量。这有助于对细粒度和全局上下文进行编码。 然而,由于生成的嵌入向量可能携带冗余信息,因此使用随机选择来降低维数。 在整个训练批次中,为每个面片嵌入生成一个多元高斯分布。因此,对于训练图像集的每个面片,我们有不同的多元高斯分布。这些高斯分布表示为高斯参数矩阵。 在推理过程中,使用马氏距离对测试图像的每个面片位置进行评分。它使用训练期间为面片计算的协方差矩阵的逆矩阵。 马氏距离矩阵形成了异常图,分数越高表示异常区域。 本项目基于PaddlePaddle框架复现了STFPM,并在MvTec数据集上进行了实验。
论文:
- [1] Simonjan, Jennifer and Unluturk, Bige D. and Akyildiz, Ian F. PaDiM: a Patch Distribution Modeling Framework for Anomaly Detection and Localization
项目参考:
在MvTec数据集的测试效果如下表。
Avg | Carpet | Grid | Leather | Tile | Wood | Bottle | Cable | Capsule | Hazelnut | Metal Nut | Pill | Screw | Toothbrush | Transistor | Zipper | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
anomalib | 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.922 | 0.998 | 0.915 | 1.000 | 0.941 | 0.984 | 0.999 | 0.854 | 0.854 | 0.848 | 0.978 | 0.881 | 0.777 | 1.000 | 0.952 | 0.862 |
Avg | Carpet | Grid | Leather | Tile | Wood | Bottle | Cable | Capsule | Hazelnut | Metal Nut | Pill | Screw | Toothbrush | Transistor | Zipper | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
anomalib | 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.961 | 0.989 | 0.941 | 0.988 | 0.889 | 0.929 | 0.978 | 0.951 | 0.982 | 0.973 | 0.955 | 0.942 | 0.974 | 0.985 | 0.965 | 0.979 |
image-level auc的Mean为0.922。
pixel-level auc的Mean为0.961, 误差0.007,在误差允许范围内。
训练日志:logs AIStudio预训练权重和日志:AIStudio预训练权重
数据集网站:MvTec数据集
AiStudio上的数据集:MVTec-AD
这里采用AiStudio上的数据集上的数据集,下载后用如下命令解压到自己指定的PATH/MVTec路径下:
tar xvf mvtec_anomaly_detection.tar.xz
-
硬件: Tesla V100 16G >= 1
-
框架:
- PaddlePaddle >= 2.2.0
# clone this repo
git clone git@github.com:CuberrChen/PaDiM-Paddle.git
cd PaDiM-Paddle
MVTec共有15个类别的子数据集,因此每个类别都需要单独训练一个模型;
在训练时,通过category参数来指定类别数据进行训练。data_path指定上述数据集路径PATH/MVTec 。
val表示是否在训练时开启指标计算。save_path指定模型保存路径,会在这个路径下生成category的目录。
seed表示随机数种子,这里根据给定参考项目取42
.
开始训练: 以carpet为例:
python train.py --data_path=PATH/MVTec/ --category carpet --val=True --save_path=./output --seed 42
注意:由于这个算法不需要优化,所有没有学习率和损失log。
需要指定训练好的模型参数路径model_path=output/carpet/best.pdparams
python val.py --data_path=PATH/MVTec/ --category carpet --model_path=./output/carpet/best.pdparams --save_picture=True --save_path=./output --seed 42
这里需要指定单张图片路径picture_path以及保存预测结果路径save_path,会在生成预测结果predict.png
python predict.py --picture_path=PATH/MVTec/carpet/test/color/000.png --category carpet --model_path=./output/carpet/best.pdparams --save_picture=True --save_path=predict.png --seed 42
如下:
详细日志在test_tipc/output
TIPC: TIPC: test_tipc/README.md
首先安装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'
TIPC结果:
tipc测试结果截图
- 预训练模型的静态图导出与推理测试:
python export_model.py --depth 18 --img_size=224 --model_path=./test_tipc/output/carpet/best.pdparams --save_dir=./test_tipc/output
注意:由于该算法并不训练模型,仅仅由预训练模型生成数据分布数据,因此导出分为两个部分,一部分是预训练模型(model.pdiparams,model.pdmodel
),一部分是分布数据(distribution
)。
python infer.py --use_gpu=True --model_file=./test_tipc/output/model.pdmodel --input_file=./test_tipc/data/capsule/test/crack/001.png --params_file=./test_tipc/output/model.pdiparams --category=carpet --distribution=./test_tipc/output/distribution
可正常导出与推理。
注意:
- 由于算法本身对于数据精度,也就是小数点位数异常敏感(不同小数点位数,算出来的分布匹配情况是不一样的,导致即使可以导出推理,backbone特征提取数据一致,后处理代码一模一样的情况下其结果会与动态图也不一致。因此该算法并不适合动静态转换)
- test_tipc时的infer,由于test_tipc限制了可视化环境。开启可视化会报错。注释掉infer 377行。
代码结构
├── data
├── datasets
├── models
├── logs
├── output
├── test_tpic
├── README.md
├── train.py
├── val.py
├── predict.py
├── export_model.py
├── infer.py
└── requirements.txt
相关信息:
信息 | 描述 |
---|---|
作者 | xbchen |
日期 | 2022年4月 |
框架版本 | PaddlePaddle==2.2.1 |
应用场景 | 异常检测 |
硬件支持 | GPU、CPU |
在线体验 | notebook |
- 感谢百度提供的算力支持。