原文: A practical guide to image-based anomaly detection using Anomalib
在工业生产中,质量保证是一个很重要的话题, 因此在生产中细小的缺陷需要被可靠的检出。工业异常检出旨在从正常的样本中检测异常的、有缺陷的情况。工业异常检测主要面临的挑战:
这些挑战使得很难使用传统的分类算法训练,需要提出特殊的方法来应对处理。
无监督异常检测和定位方法可以分为判别方法和生成方法。
判别方法尝试建模正常样本和异常样本的边界。这类方法首先从图片中生成嵌入特征,进而对比来自OK样本的嵌入。将特征的距离作为异常分数。这类方法能得到较好的结果但是经常缺乏可解释性,我们常常无法判断那一部分导致了异常。例如,当使用诸如SPADE方法。SPADE在测试时使用嵌入向量进行KNN聚类。这意味着推理复杂度规模随着训练集的尺寸增长。推理速度在工业生产中较为重要,因此此类方法降低了其实用性。
在PaDiM之前,一些判别式方法需要深度神经网络训练,或者在一个大的数据集上使用KNN,这些操作都极大的降低了推理速度。这也阻碍了在实际工业环境中的应用。 Patch Distribution Modeling (PaDiM) 旨在解决这一挑战。PaDiM使用在ImageNet分类中预先训练的CNN模型来进行特征嵌入。图像被划分为独立的Patches 并且对每个Patch 进行特征嵌入。PaDiM 使用CNN预训练的所有层。由于这样可能导致许多冗余的信息,在这里它们随机抽样选择嵌入。有趣的是, 这一工作和PCA降维一样好同时还更快。PaDiM假设所有的嵌入特征都服从多维高斯分布,并估计每个Patch的抽样均值和抽样误差参数。最后的结果为每个训练集图片Patch的多维高斯分布。
在推理阶段的异常得分基于测试图片的Patch和学习到的Patch之间的马氏距离给出。最后的异常得分是异常值map 的最大值。这个算法避免了KNN类算法因为训练集的增大导致算法复杂度的递增。
和PaDiM相似,PatchCore将图片单独拆分为patches. PatchCore的想法是如果一个单独的patch 是异常的那么整张图都将被分类为异常。PatchCore 也解决PaDiM面临相同的调整,其目标总结为以下三点:
在训练阶段,使用预训练的CNN提取特征嵌入,使用corest进行抽样,并且存入内存库。在测试阶段在内存库中使用最近邻搜索,网络结构如下:
生成类方法尝试从样本中建模每一个类别的真实分布,比如生成一张新的图片。此类方法基于一个想法,即:由于异常模式在训练集中不存在,所以这些异常模式难以被生成。Autoencoder-based方法尝试从自动编解码机中检测输入和输出的不同来进行异常区域检测。一个较高的重建误差区域标识着一个异常区域。GAN-based 类方法假定只有正样本能够被生成。景观这些生成类方法比较符合直观和可解释,但是它们的性能有限,因为一些异常的特征也能够被较好的重建。
目前为止,我们已经讨论了判别式方法。CFlow-AD是一类生成式方法。
CFLow-AD 基于一种条件归一化流网络。
Anomalib 是一个开源的异常检测python库,包含上述算法的实现。Anomalib包含一些列异常检测算法,这个库旨在提供为特定需求提供自定义的网络设计,实验跟踪,可视化和超参数优化,这些异常检测的需求。
一个工业生产相关的异常检测数据集是MVTec dataset. 包含5k 高分辨率图片并划分为10中不同的对象和物种纹理类型。每个类都都包含一个没有缺陷的训练集和一个包含各种缺陷的测试集。
评价指标主要是使用AUROC
官方给出的安装流程,可能会出现问题。对踩过的坑进行总结
pip uninstall -y torch torchvision torchtext
pip install torch==1.12.1+cu116 torchvision==0.13.1+cu116 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu116
相关链接: https://github.com/openvinotoolkit/anomalib/issues/792
如果重装后提示 anomalib 库找不到,可以注释掉 ./requirements/base.txt中的内容,再次执行:
pip install -e .