Patchcore-原理学习

论文介绍了在大规模工业制造中检测缺陷部件的PatchCore方法,通过局部补丁特征聚合和核心集减小策略,结合预训练模型进行异常检测。后续还探讨了SA-PatchCore和FR-PatchCore的改进以及未来的研究方向,包括特征增强和CNN/Transformer融合等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

异常检测学习


摘要

这篇论文主要关注大规模工业制造中的关键组件——检测缺陷部件。主要解决了检测中冷启动问题,即仅使用正常(无缺陷)的示例图像来拟合模型。虽然每个类别都可以有手工制作的解决方案,但目标是构建能够同时在许多不同任务上自动工作的系统。最佳的方法是将ImageNet模型的嵌入与异常检测模型相结合。本文在此基础上进行了扩展,提出了PatchCore,它使用了一个最大代表性的记忆库来存储正常的补丁特征。


总体流程

Patchcore总体可以分为三个部分:

  1. 将局部补丁特征(local patch features )聚合到内存库中。
  2. 使用核心集缩减方法(coreset-reduction method)以提高效率
  3. 形成检测和定位决策的完整算法。
    在这里插入图片描述

part 1 Locally aware patch features 局部补丁特征聚合

该方法的主要思想是利用预训练的网络提取图像特征,使用一个记忆库M存储这些特征。

这种方法继承与SPADE与Padim,使用ImageNet上预训练的特征提取网络。如ResNet-50 / WideResNet-50

使用其中间层作为输入,原因是:
保留更多的信息
可以使在ImageNet上预训练的网络提取出来的特征不那么偏向原数据集

提取得到的特征,进行局部领域聚合操作,这是为了增加感受野的大小并且增加对小的空间变化鲁棒性,以下几个公式就是其操作步骤:
在这里插入图片描述
在这里插入图片描述
(1)表示一块大小p×p的邻域
在这里插入图片描述(2)
(2)表示第i张图输入到backbone后输入的第j层特征,这个特征及其在N_p上的领域进行了f_agg(某种聚集函数)操作,Patchcore中使用的是自适应平均池(adaptive average pooling)。

在这里插入图片描述
(3)表示局部特征集合
同时,还是用了第j+1层特征,使用双线性缩放使两个特征相匹配
在这里插入图片描述
(4)表示遍历所有数据集,形成记忆库M

part 2 Coreset-reduced patch-feature memory bank 核心集减小M大小

在这里插入图片描述
形成得到的记忆库M很大,希望一个寻找一个子集代替。之前的方法使用随机搜索的方法,patchcore提出贪婪核心集算法,上图表示两种方法效果,可见GC算法表示的更加均匀,效果更好。

算法流程图
在这里插入图片描述
其中最重要的是:
在这里插入图片描述
选择一个M_c,使得原始集中的任何实例与 M_c 中最近的实例的最大距离最小化

part 3 Anomaly Detection with PatchCore 计算得分

在这里插入图片描述
每个点先找最近的邻近区域,然后在这邻近区域中找最远的点的距离作为异常分数。
获取到全局得分并且之后,为了匹配原始输入分辨率,采用了双线性插值来放大结果。还使用了高斯滤波对结果进行了平滑处理。

算法改进

1 SA-PatchCore:

Anomaly Detection in Dataset With Co-Occurrence Relationships Using Self-Attention
引入只注意力机制,解决共现相关的异常的问题,自创数据集,如下
在这里插入图片描述

2 FR-PatchCore:

An Industrial Anomaly Detection Method for Improving Generalization
FR-PatchCore方法首先构建一个特征矩阵,然后将其提取到内存库中,并使用最优负余弦相似性损失进行持续更新。
同时其中的后处理方法(还没明白)值得学习。

之后的一些思路与方向

  1. 针对特征的增强,类似于图像增强技术,只不过其作用在特征提取之后特征上的,理论上其比针对图像的增强更具普遍性,相同的增强可能可以在不同的领域中应用,方法有一些。
  2. 提取特征时,利用的是j和j+1,j+1层特征还要上采样在于j层融合,可以考虑不同网络提取再做融合。
  3. 对cnn的特征提取器的转换,transformer的框架以及抗锯齿技术(anti-aliasing)。
### 如何复现 PatchCore-inspection 项目 #### 安装依赖环境 为了成功运行PatchCore-inspection项目,需先安装Python以及必要的库文件。推荐使用Anaconda来管理虚拟环境和包。 创建并激活一个新的Conda环境: ```bash conda create -n patchcore python=3.8 conda activate patchcore ``` 接着按照官方GitHub页面说明安装所需的软件包[^1]: ```bash pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113 pip install -r requirements.txt ``` #### 数据集准备 下载所需的数据集,并将其放置到指定目录下以便后续训练过程调用。通常情况下,数据应该放在`data`文件夹内,具体路径可以在配置文件中调整。 对于MVTec AD数据集而言,可以通过如下命令获取: ```bash wget http://ftp.mpi-inf.mpg.de/pub/cae/mvtec_anomaly_detection/mvtec_anomaly_detection.tar.xz tar -xf mvtec_anomaly_detection.tar.xz -C data/ ``` #### 训练模型 完成上述准备工作之后就可以开始训练模型了。进入源码根目录执行以下指令启动训练脚本: ```bash python train.py --config configs/default.yaml ``` 此操作会读取默认参数设置(`default.yaml`)来进行实验,默认会在CPU上运行;如果希望利用GPU加速,则需要修改相应的选项。 #### 测试与评估 当训练完成后可以加载保存下来的权重文件对测试样本进行预测分析。通过下面这条语句实现推理功能: ```bash python test.py --config configs/default.yaml --weights_path path_to_weights.pth ``` 这里需要注意的是替换实际存在的预训练模型地址给定的变量`path_to_weights.pth`。 #### 可视化结果 最后一步是对得到的结果做可视化处理,这有助于直观理解算法性能表现。查看README文档中的指导信息了解具体的展示方式。 ```python import matplotlib.pyplot as plt from PIL import Image import numpy as np def plot_images(images, titles=None): """Plot images with optional title.""" fig = plt.figure(figsize=(len(images)*5, 5)) for i, img in enumerate(images): ax = fig.add_subplot(1, len(images), i+1) if isinstance(img, str): img = Image.open(img).convert('RGB') plt.imshow(np.array(img)) if titles is not None and i < len(titles): ax.set_title(titles[i]) plt.show() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值