R&D
CENTER

只看良品就能找出异常:异常检测与 PatchCore

不良样品难以收集,而且明天就可能出现从未见过的不良。本课以最广泛使用的 PatchCore 为例,说明只用良品图像训练、找出“与正常不同之处”的异常检测原理。

入门7 分钟1 浏览
本课要点
  1. 异常检测不学习不良,只学习正常。因此训练时没见过的新不良,也能以“与正常不同”检出。
  2. 结果是逐像素的异常度热力图,以及代表整张图像的一个分数。分数达到阈值及以上即为 NG。
  3. PatchCore 把良品图像小块(patch)的特征存放在内存中,通过新 patch 与最接近的正常 patch 相距多远来衡量异常度。
  4. 设置两个阈值会形成 OK / Gray / NG 三个区间,模棱两可的 Gray 由人工确认后再反馈到训练中。

检测的三代技术

第 1 代 · 基于规则 第 2 代 · 监督学习 第 3 代 · 正常样本学习
训练数据 无(由人设计规则) 数千张不良图像 + 标注 数十~数百张良品图像,无需标注
从未见过的不良 规则中没有就放行 对训练时没见过的类型较弱 以“与正常不同”检出
部署周期 数周(专家调参) 数周~数月(收集不良) 数天

制造现场的不良率通常很低。要收集数千张不良图像需要等待很久,而且在收集期间还会出现新的类型。异常检测把这个问题反过来处理:只要让模型充分看过正常样本,偏离正常的一律视为异常。 也有少则从 2~30 张良品图像起步的 few-shot 方式。

通用处理流程

fineAi AD Workbench 的 11 种算法都遵循相同的框架。各算法不同的只有 ③ 和 ④。

① 输入原始图像 ② 预处理正方形填充 ③ 特征提取CNN · ViT ④ 异常度距离 · 概率 ⑤ 异常图上采样·平滑 ⑥ 分数max · 前 q% ⑦ 判定score≥thr→NG 各算法不同的部分
② 预处理会在保持比例的前提下填充成正方形。即使是 5:1 这类细长零件也不会被压扁,缺陷形状得以保留。

PatchCore:正常小块的记忆

PatchCore 精度高,是 AD Workbench 默认推荐的算法。原理出乎意料地简单。

训练:收集正常 patch

  1. 将良品图像输入用大规模图像预训练的神经网络(WideResNet50-2),取出中间层(layer2、layer3)的特征图。特征图中的一格,就是把原始图像中的一个小块(patch)概括成数字向量的结果。
  2. 将所有良品图像的所有 patch 向量收集到**记忆库(memory bank)**中。
  3. 记忆库太大会使检索变慢,因此只挑选能代表整体分布的一部分(coreset 采样)。

不会重新训练神经网络的权重。只是把良品图像过一遍并收集起来,因此训练只需数秒~数分钟即可完成。

检测:与最接近的正常样本之间的距离

  1. 对新图像用相同方式提取 patch 向量。
  2. 针对每个 patch,在记忆库中找出**最接近的 k 个正常 patch(k=3)**并测量距离。
  3. 与正常相似的 patch 距离小;有划伤的 patch 找不到相似的正常 patch,距离就大。这个距离就是该位置的异常度。
  4. 把各 patch 的异常度放大到原始尺寸并做平滑处理,就得到热力图;把热力图的最大值(或前百分之几的平均值)归一化到 0~1,就是图像分数。
记忆库(正常 patch 特征) 正常 patch → 距离小 划伤 patch → 连最接近的正常样本也很远 热力图 · score 0.71 ≥ 0.50 → NG
异常度是“与最相似的正常 patch 有多大不同”。即使是训练时从未见过的缺陷,距离也会很大。

阈值与 Gray 区间

得到分数后,与阈值比较进行判定。降低阈值可以减少漏掉不良的情况(漏检),但把良品判为不良的情况(误判)会增加;提高阈值则相反。这种平衡在 模型评估与现场运维 课程中讲解。

fineAi 使用双阈值。

  • 分数低于低阈值为 OK
  • 高于高阈值为 NG
  • 介于两者之间为 Gray — 由人工确认。

人工对 Gray 图像做出的判定会再次成为训练数据。这是一种运行越久、Gray 越少的机制。

异常检测不太适用的情况

  • 正常样本本身差异很大的对象 — 像形状各异的农产品这样“正常”范围很宽时,难以与缺陷区分。
  • 需要缺陷名称和位置时 — 异常检测能告诉你“哪里异常”,但不会分类出“这是划伤”。这时请搭配 目标检测 一起使用。

11 种算法中该选哪一种,将在下一课 选择异常检测算法 中讲解。