AdneneBoumessouer / MVTec-Anomaly-Detection学习笔记
GitHub: https://github.com/AdneneBoumessouer/MVTec-Anomaly-Detection
本项目提出了一种基于深度学习的图像半监督异常检测和分割的端到端框架。
方法概述
该方法利用重建图像与输入图像之间的阈值差进行异常定位。
The threshold is determined by first using a subset of anomalous-free training images, i.e validation images, to determine possible values of minimum area and threshold pairs followed by using a subset of both anomalous-free and anomalous test images to select the best pair for classification and segmentation of the remaining test images.
本文在很大程度上受到了论文“MVTec AD — A Comprehensive Real-World Dataset for Unsupervised Anomaly Detection”(https://openaccess.thecvf.com/content_CVPR_2019/papers/Bergmann_MVTec_AD_--_A_Comprehensive_Real-World_Dataset_for_Unsupervised_Anomaly_CVPR_2019_paper.pdf)和“Improving Unsupervised Defect Segmentation by Applying Structural Similarity to Autoencoders”(https://arxiv.org/abs/1807.02011)的启发。该方法分为三个步骤:训练、微调和测试。
注意:为什么是半监督(Semi-Supervised)而不是非监督(Unsupervised)?
在MVTec论文中提出的方法是无监督的,因为在验证步骤中使用一个只包含无异常训练图像的子集(验证集)来确定测试图像分类和分割的阈值。但是,该验证算法是基于用户输入参数(最小缺陷面积),在上述MVTec AD文章中定义既不清楚,也没有解释。由于这个参数的选择可以极大地影响分类和分割结果,极大地影响自动化过程的努力,并删除所有用户输入的需要,我们开发了一个微调算法,计算对应于一个广泛的离散最小缺陷区域的验证集的不同阈值。随后利用测试集的小部分异常图像和无异常图像(微调集)来选择最佳的最小缺陷面积和阈值,最终用于对剩余测试图像进行分类和分割。由于我们的方法依赖于测试图像进行微调,我们将其描述为半监督。
数据集
该框架已在MVTec数据集(https://www.mvtec.com/company/research/datasets/mvtec-ad/)成功测试。
模型
本项目实现的基于卷积自动编码器(Convolutional Auto-Encoder, CAE)架构的模型共有5个:
- mvtecCAE: 是MVTec论文中实现的模型
- baselineCAE: 灵感来自https://github.com/natasasdj/anomalyDetection
- inceptionCAE: 灵感来自https://github.com/natasasdj/anomalyDetection
- resnetCAE: 灵感来自https://arxiv.org/pdf/1606.08921.pdf
- skipCAE: 灵感来自https://arxiv.org/pdf/1606.08921.pdf
注意:mvtecCAE、baselineCAE和inceptionCAE在性能上具有可比性。
警告:resnetCAE和skipCAE仍在测试中,因为它们容易过度拟合,这在卷积自动编码器的情况下是通过复制其输入而不过滤出缺陷区域来实现的。
预备知识
依赖关系
本项目中使用的主要库及其对应版本如下:
tensorflow == 2.1.0
ktrain == 0.21.3
scikit-image == 0.16.2
scikit-learn == 0.23.2
有关更多信息,请参阅requirement.txt。
安装
在安装依赖项之前,我们强烈建议设置一个虚拟环境(例如,anaconda环境)。
确保pip是最新的:pip install -U pip。
如果TensorFlow 2还没有安装,请安装它(例如,pip Install TensorFlow ==2.1)。
安装ktrain:pip安装ktrain。
安装scikit-image:pip install scikit-image。
安装scikit-learn:pip install scikit-learn。
以上就是Linux系统和云计算环境,如谷歌Colab和AWS EC2下所有你需要的主要库。
如果您在Windows计算机上使用ktrain,可以按照https://github.com/amaiya/ktrain/blob/master/FAQ.md#how-do-i-install-ktrain-on-a-windows-machine提供的更详细的说明进行操作,其中包括一些额外的步骤。
注意:安装ktrain时需要额外较大的库有:scikit_learn、transformers、sentencepiece、tokenizers、jieba。
下载数据集
- 在https://www.mvtec.com/company/research/datasets/mvtec-ad/下载mvtec数据集,并将其保存到您选择的目录中(例如在/Downloads中)。
- 解压压缩的图像文件。
- 在项目目录中创建一个文件夹来存储图像文件。
- 将提取的图像文件移动到该文件夹。
使用mvtec数据集的目录结构
为了让脚本正常工作,包含训练和测试图像的文件夹需要有特定的结构。
在使用mvtec数据集的情况下,下面是一个目录结构应该是什么样的示例:
使用自己数据集的目录结构
要使用自己的数据集进行训练,您需要有一个可比较的目录结构。例如:
使用方法
Training (train.py)
在训练期间,CAE只训练无缺陷的图像,并学习重建(预测)无缺陷的训练样本。
用法:train.py [-h] -d [-a] [-c] [-l] [-b] [-i]
可选参数:
- -h, --help:显示帮助信息并退出;
- -d, --input-dir:包含训练图像的目录;
- -a, --architecture:用于训练的模型架构:'mvtecCAE', 'baselineCAE', 'inceptionCAE' or 'resnetCAE';
- -c, --color:训练前预处理图像的颜色模式:'rgb' or 'grayscale';
- -l, --loss:训练时使用的损失函数:'mssim', 'ssim'(只适用灰度图像) 或 'l2';
- -b, --batch:用于训练的批大小;
- -i, --inspect:训练后生成检查图。
使用示例:
python3 train.py -d mvtec/capsule -a mvtecCAE -b 8 -l ssim -c grayscale
注意:由于训练过程实现了一种早期停止策略,因此用户不需要输入epochs。
Finetuning (finetune.py)
这个脚本使用了一个无缺陷训练图像的子集以及一个包含有缺陷和无缺陷测试图像的子集来确定最小缺陷面积的良好值和阈值参数对,这些参数将在分类和分割测试期间使用。
用法:finetune.py [-h] -p [-m] [-t]
可选参数:
- -h, --help:显示帮助信息并退出;
- -p, --path:模型的保存路径;
- -m, --method:生成重映射的方法:'ssim' or 'l2';
- -t, --dtype:处理重映射的数据类型:'float64' or 'uint8'。
使用示例:
python3 finetune.py -p saved_models/mvtec/capsule/mvtecCAE/ssim/13-06-2020_15-35-10/mvtecCAE_b8_e39.hdf5 -m ssim -t float64
Testing (test.py)
这个脚本使用最小缺陷区域和阈值对测试图像进行分类。
用法:test.py [-h] -p [-s]
可选参数:
-h, --help:显示帮助信息并退出;
-p, --path:模型的保存路径;
-s, --save:保存分割后的图像。
使用示例:
python3 test.py -p saved_models/mvtec/capsule/mvtecCAE/ssim/13-06-2020_15-35-10/mvtecCAE_b8_e39.hdf5
项目组织
├── mvtec <- folder containing all mvtec classes.
│ ├── bottle <- subfolder of a class (contains additional subfolders /train and /test).
| |── ...
├── autoencoder <- directory containing modules for training: autoencoder class and methods as well as custom losses and metrics.
├── processing <- directory containing modules for preprocessing images and before training and processing images after training.
├── results <- directory containing finetuning and test results.
├── readme.md <- readme file.
├── requirements.txt <- requirement text file containing used libraries.
├── saved_models <- directory containing saved models, training history, loss and learning plots and inspection images.
├── train.py <- training script to train the auto-encoder.
├── finetune.py <- approximates a good value for minimum area and threshold for classification.
└── test.py <- test script to classify images of the test set using finetuned parameters.
作者
AdneneBoumessouer:https://github.com/AdneneBoumessouer
许可证
该项目在MIT许可证下获得许可。参见LICENSE.md文件查看详情。
致谢
- Paul Bergmann, Michael Fauser, David Sattlegger和Carsten Steger:他们是MVTec论文的作者,该项目受到了他们的启发。
- Francois Chollet:Keras的作者。
- Aurelien Geron:Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition的作者。
- Arun S. Maiya:ktrain深度学习库的作者。
- Adrian Rosebrock是计算机视觉网站pyimagesearch的创始人。