PaDiM: a Patch Distribution Modeling Framework for Anomaly Detection and Localization
1、Background
在单类学习(仅使用正常数据(即“单一类”)来训练模型)环境中的异常检测和定位任务方法中,要么需要深度神经网络训,要么在测试时使用K-最近邻(K-NN)算法对整个训练数据集进行操作。K-NN算法的线性复杂度随着训练数据集的大小而增加,增加了时间和空间复杂度。
基于重建的方法通常使用自动编码器(AE)、变分自动编码器(VAE)或生成对抗网络(GAN)等神经网络架构,仅训练正常类图像。因此,异常图像由于无法良好地重建而被识别为异常。常用的方法包括使用重建误差作为异常分数,虽然基于重构的方法非常直观且可解释,但由于 AE 有时也会对异常图像产生良好的重构结果,因此其性能受到限制。
基于嵌入相似度的方法利用深度神经网络提取有意义的特征向量,这些向量用于检测整个图像的异常。异常分数通常是测试图像嵌入向量与正常参考向量之间的距离。这些方法在检测精度上表现良好,但通常缺乏对异常区域的可解释性。推理复杂度与数据集的规模成线性关系。这可能会阻碍该方法的工业应用。
为了解决上述问题,提出了 PaDiM(Patch Distribution Modeling) 方法,利用预训练的卷积神经网络(CNN)进行嵌入提取,并具有以下两个特性:
(1)每个补丁位置由多元高斯分布描述;
(2)PaDiM 考虑了预训练CNN不同语义层次之间的相关性。
2、Method
PaDiM 算法 利用预训练的卷积神经网络(CNN)进行补丁嵌入,并使用多元高斯分布来获得正常类的统计表示,并利用CNN不同语义层次之间的相关性来更好地定位异常。
- 预训练的CNN用于特征提取
- PaDiM使用预训练的CNN模型(如ResNet、Wide-ResNet或EfficientNet)来提取图像特征。这些模型已经在大规模数据集(如ImageNet)上进行了训练,能够学习到丰富的视觉特征。
- 在训练阶段,将正常图像输入到CNN中,提取特定层的激活图(feature maps)。这些激活图包含了图像的多尺度和多语义层次的特征。
- 补丁嵌入提取
- 从CNN的激活图中,将图像划分为多个小块(补丁),每个补丁对应于激活图中的一个区域。
- 每个补丁的激活向量被提取出来,这些向量包含了该补丁的视觉特征。通过从不同层次的激活图中提取特征并进行拼接,可以获得包含不同语义信息的嵌入向量。
- 多元高斯分布建模
- 对于训练集中的每个补丁位置,收集来自多个正常图像的嵌入向量,形成一个嵌入向量的集合。
- 假设这些嵌入向量的集合遵循多元高斯分布。计算该分布的参数,即均值向量(µ)和协方差矩阵(Σ)。均值向量是所有嵌入向量的平均值,协方差矩阵描述了向量之间的线性关系和变异程度。
- 正则化处理
- 为了避免协方差矩阵不可逆的问题,引入一个小的正则化项(ϵI),其中I是单位矩阵,ϵ是一个小的常数。这确保了协方差矩阵始终是满秩的,可以进行逆运算。
- 异常检测和定位
- 在测试阶段,对于输入的测试图像,重复上述的补丁嵌入提取过程。
- 使用马氏距离(Mahalanobis distance)来计算测试图像中每个补丁与学习到的多元高斯分布之间的距离。马氏距离考虑了数据的协方差结构,能够更准确地反映数据点与分布中心的相似度。
- 根据马氏距离的大小,生成异常图(anomaly map),图中的高值区域表示可能的异常位置。
pseudo-code
# 伪代码:PaDiM方法实现
# 从图像中提取所有补丁 extract_patches(image)
# 使用CNN提取补丁的特征嵌入 extract_embeddings(cnn, patch)
# 计算嵌入向量的均值 calculate_mean(embeddings)
# 计算嵌入向量的协方差矩阵 calculate_covariance(embeddings, mean)
# 计算马氏距离 calculate_mahalanobis_distance(embedding, mean, covariance)
# 更新异常图 update_anomaly_map(anomaly_map, position, score)
# 显示异常图 display_anomaly_map(anomaly_map)
# 步骤1: 预训练CNN模型加载
pretrained_cnn = load_pretrained_cnn()
# 步骤2: 训练阶段 - 正常图像特征提取
for each normal_image in normal_images_dataset:
patches = extract_patches(normal_image)
for patch in patches:
embeddings = extract_embeddings(pretrained_cnn, patch)
store_embedding(patch_position, embeddings)
# 步骤3: 计算每个补丁位置的均值和协方差
for each patch_position in patch_positions:
embeddings = get_embeddings_for_position(patch_position)
mean = calculate_mean(embeddings)
covariance = calculate_covariance(embeddings, mean)
store_normal_model(patch_position, mean, covariance)
# 步骤4: 测试阶段 - 异常检测和定位
for each test_image in test_images_dataset:
patches = extract_patches(test_image)
anomaly_map = initialize_anomaly_map(test_image)
for patch in patches:
embedding = extract_embeddings(pretrained_cnn, patch)
for each patch_position in patch_positions:
mean = get_mean_for_position(patch_position)
covariance = get_covariance_for_position(patch_position)
mahalanobis_distance = calculate_mahalanobis_distance(embedding, mean, covariance)
anomaly_score = update_anomaly_map(anomaly_map, patch_position, mahalanobis_distance)
display_anomaly_map(anomaly_map)
3、Experiments
good…
4、Conclusion
提出了一个新的单类学习环境中的异常检测和定位的补丁分布建模框架 PaDiM 。
[REFERENCE]
精读:PaDiM: a Patch Distribution Modeling Framework for Anomaly Detection and Localization