当前位置: 首页 > news >正文

PatchCore 异常检测算法的原理

1. 算法概述与核心思想

PatchCore 是一种基于 内存库局部特征 的异常检测与定位方法。它在 2021 年被提出,并在当时的 MVTec AD 等公开数据集上达到了最先进的性能。

它的核心思想非常直观:

一个正常的物体,其所有局部区域的视觉特征都应该与训练集中大量正常样本的对应局部特征相似。如果某个局部区域的特征在正常样本的记忆库中“找不到邻居”,那么这个区域就很可能是异常的。

简单来说,PatchCore 为正常样本建立了一个非常庞大且具有代表性的 “正常模式记忆库”。在测试时,它会将待测图像的每个局部特征与这个记忆库进行比对,通过计算相似度来发现异常。


2. 关键动机与核心问题

在 PatchCore 之前,已经有很多基于深度特征的异常检测方法,但它们普遍存在两个问题:

  1. 全局特征 vs. 局部缺陷:很多方法使用整张图像的全局特征向量进行比对。但对于微小的、局部的缺陷(如划痕、斑点),全局特征的变化可能非常微小,容易被淹没在正常的整体结构信息中,导致漏检。
  2. 预训练模型的偏差:直接在 ImageNet 上预训练的模型,其特征可能并不完全适用于特定工业领域的纹理和结构。直接使用高层特征可能会引入与任务无关的偏差。

PatchCore 的设计就是为了解决这两个核心问题:

  • 针对问题1:它摒弃了全局特征,专注于 极致的局部特征(Image Patches)
  • 针对问题2:它使用 中层网络特征,这些特征既保留了足够的空间和细节信息,又具备一定的语义抽象能力,非常适合用于描述局部区域。

3. 算法详细原理与步骤

PatchCore 的流程可以分为两个主要阶段:离线构建记忆库在线异常检测

阶段一:离线构建正常样本的记忆库

这一步是整个算法的基础,只在正常的训练集上进行。

步骤 1: 提取局部特征图

  • 输入:所有正常的训练图片。
  • 网络 backbone:使用一个在 ImageNet 上预训练的卷积神经网络(如 WideResNet-50),但不进行微调。
  • 提取层级:并非使用最后一层的输出,而是选择 网络的中层特征层。通常选择多个层(如 layer2layer3),将它们提取的特征图进行融合。这样做的好处是:
    • 中层特征 具有较高的空间分辨率,能保留更多的细节和位置信息,这对于精确定位小缺陷至关重要。
    • 相比底层特征,它又有一定的语义信息,抗噪声能力更强。
  • 输出:对于每一张正常训练图片,我们得到一个三维的 特征图 F ∈ R^(C×H×W)。这个特征图可以看作是 H×WC 维的特征向量,每个向量都对应原始图像上的一个局部区域(Receptive Field)。

步骤 2: 构建 Patch-Feature Memory Bank

  • 核心操作:将上一步得到的所有训练图片的特征图 F 中的 每一个空间位置上的 C 维特征向量 都取出来。
  • 为什么叫 “Patch”:每个特征向量都对应原始图像上的一个图像块,因此这些特征向量被称为 “Patch Features”。
  • 结果:最终,我们得到一个巨大的集合,称为 记忆库 M
    M = {m₁, m₂, m₃, ..., m_N}
    其中,N = (训练图片数量) × H × Wm_i ∈ R^C
    这个记忆库 M 本质上是一个巨大的矩阵,它密集地、无遗漏地记录了所有正常训练样本中所有可能的局部外观模式。

步骤 3: 核心集子采样

  • 问题:直接使用完整的记忆库 M 会非常庞大(可能包含数百万个特征向量)。在测试时与如此庞大的库进行最近邻搜索,计算成本会非常高,无法满足实时需求。
  • 解决方案:PatchCore 采用了一种称为 Coreset Selection(核心集选择) 的算法。其目标是从庞大的 M 中选取一个很小的子集 M_Coreset,使得这个子集能够最大限度地保留原始记忆库的分布和代表性。
  • Coreset 算法:通常使用一种迭代的贪心算法(如 k-Center Greedy 算法,也称为 Minibatch K-Means++ 的初始化步骤)。该算法会尽量选择那些能“覆盖”整个特征空间的特征向量作为代表,避免冗余。
  • 最终记忆库:经过 Coreset 采样后,我们得到一个规模小得多但代表性极强的记忆库 M_Coreset。这大大加速了后续的推理过程,是 PatchCore 能实现高效检测的关键。
阶段二:在线异常检测与定位

当有一个新的测试图像需要判断时,执行以下步骤:

步骤 1: 提取测试特征

  • 使用和训练阶段完全相同的 Backbone 和特征层,提取测试图片的特征图 F_test ∈ R^(C×H×W)

步骤 2: 局部最近邻搜索

  • 对于测试特征图 F_test 上的每一个空间位置 (i, j),取其对应的 C 维特征向量 f_{i,j}
  • 在缩减后的记忆库 M_Coreset 中,为 f_{i,j} 寻找最相似的 K 个近邻(通常 K=1,即最近邻)。
  • 计算它们之间的 距离(通常使用余弦距离或欧氏距离的倒数来衡量相似度)。这个距离反映了该测试局部特征与“正常模式”的偏离程度。
    s_{i,j} = distance(f_{i,j}, NN(f_{i,j}, M_Coreset))
    距离越大,说明该局部区域越异常。

步骤 3: 生成异常分数图

  • 将所有空间位置 (i, j) 上计算得到的距离值 s_{i,j} 组合起来,形成一个二维的 异常分数图 S_map ∈ R^(H×W)
  • 这个分数图 S_map 已经粗略地定位了图像中哪些区域可能是异常的。

步骤 4: 后处理与结果输出

  • 异常定位:将 S_map 上采样到原始测试图像的尺寸,即可得到像素级的异常分割图。分数高的区域即为疑似缺陷区域。
  • 图像级异常分数:对整个图像计算一个总的异常分数。通常有两种简单有效的方法:
    1. 取最大值Score_image = max(S_map)。这种方法对即使是很小的异常也非常敏感。
    2. 取Top-K均值Score_image = mean(top-k values in S_map)。这种方法对大面积的异常更鲁棒。
  • 最终决策:将 Score_image 与一个预设的阈值进行比较,超过阈值则判定该测试图像为异常图像。

4. 为什么 PatchCore 如此有效?—— 优势总结

  1. 对局部缺陷高度敏感:通过比对局部特征,即使是微小的缺陷,只要其特征与记忆库中所有正常模式都不匹配,就能被有效地检测出来。
  2. 无需模型微调:直接利用强大的预训练模型特征,避免了在小数据集上微调可能导致的过拟合问题,也简化了训练流程。
  3. 极强的代表性记忆库:通过密集采样和中层特征,记忆库 M 几乎涵盖了所有可能的正常模式变体。Coreset 子采样在保证效率的同时,最大限度地保留了这种代表性。
  4. 简单而强大:算法的核心就是最近邻搜索,没有复杂的概率建模或神经网络训练,方法非常直观且稳定,不容易出现难以调试的失败情况。

总结

PatchCore 的成功在于它回归了一个朴素而强大的理念:通过建立一个详尽且高效的“正常记忆”,然后将待测样本的每个部分与这个记忆进行最直接的比对来发现异常。它通过 “中层局部特征”“核心集记忆库” 这两个关键技术,完美地平衡了检测精度、定位能力和推理速度,成为了工业异常检测领域一个非常重要的基准算法。

http://www.dtcms.com/a/538025.html

相关文章:

  • opencart网站搜索引擎营销成功的案例
  • 从零开始的C++学习生活 16:C++11新特性全解析
  • 单位门户网站建设方案初创公司 建网站
  • wordpress建站位置课件ppt模板免费下载
  • maven的基本概念与使用
  • 大良招聘网站建设天眼查企业查询入口
  • 如何在互联网推广自己的产品seo和网络推广哪个好
  • 北京网站建设的公网站设计案例分析
  • 做3d ppt模板下载网站泰州网站建设公司哪个好
  • 常州企业微信网站建设常用网站代码
  • 网站建设法律法规西安住房和城乡建设部网站
  • 网站制作的流程微信怎么做捐钱的网站
  • 安卓做网站怎么自学电商运营
  • 【STM32项目开源】STM32单片机智能台灯系统
  • 福建网站开发企业合作社做网站有用吗
  • 太原网站推广优化设计师服务平台鱼巴士官网
  • 2025 备考信创中级认证包含哪几个专业方向?
  • 莱芜聊城网站建设wordpress 修改文章内容
  • 什么叫宣传类网站百度对 wordpress 排名
  • 网站后台界面设计网站建设系统
  • 天津网站建设推广服务出国用哪个地图app好
  • 中国商标注册网官方网站做彩票网站需要什么收钱的
  • 做网站记者好吗基层网站建设存在困难
  • 建设网站公司地址北京建设网网站
  • 切换C++编译器 报告总结
  • 操作系统5.3.3 减少磁盘延迟时间的方法
  • php小型网站源码山东微道商网络技术有限公司
  • 手机微信网站开发关键词排名优化
  • 做网站之前需要准备什么条件江苏省住房和城乡建设部网站
  • 学习Linux——用户管理