工业视觉异常检测:PatchCore与EfficientAD原理、实战与调优一、为什么异常检测是工业视觉的「最后一公里」去年参与一个 PCB 检测项目时,我被一个现实打脸:缺陷样本根本不够。产线上每天流转数十万块板子,但真正的缺陷品一个月不到 200 块——其中 80% 还集中在 3 种缺陷类型上,剩下 20 种缺陷类型合起来不到 40 个样本。传统的监督学习(分类 / 目标检测)在这个数据分布面前直接崩溃:类别极度不均衡,稀有缺陷甚至只有 1-2 张训练图。更棘手的是「开放集问题」——产线随时可能出现训练集中从未见过的缺陷形态。你永远不知道明天操作工会不会搞出一种新的焊接不良。这种情况在纺织、玻璃、金属表面、医药包装等行业普遍存在。这就是**异常检测(Anomaly Detection)**的用武之地。它的核心思路很巧妙:只学「正常长什么样」,凡是偏离正常的都是异常。不需要缺陷样本,不需要标注,天然适配工业场景。近年工业异常检测的 SOTA 方法可以归为几大范式:范式代表方法核心思想推理速度特征嵌入 + 记忆库PatchCore, PaDiM提取正常特征 → 构建 memory bank → 测试时查最近邻⭐⭐教师-学生网络EfficientAD, STFPM学生网络只学「正常」的输出,异常输入会产生大的 feature discrepancy⭐⭐⭐重构模型DRAEM, AutoEncoder只重构正常图像,异常区域重构误差大⭐⭐归一化流FastFlow, CFlow将正常特征分布建模为高斯,异常偏离该分布⭐⭐⭐本文聚焦工业界落地效果最好的两种方法——PatchCore(检测精度天花板)和EfficientAD(速度与精度的完美折中),从原理到代码到调优,一杆子捅到底。二、PatchCore:特征记忆库 + 核心集采样2.1 直觉理解PatchCore 的核心思想朴素但有效:用预训练 CNN 提取正常图像的特征 → 存到记忆库 → 测试时,对测试图像的每个 patch 特征,在记忆库里找最近的正常 patch → 距离越大,越可能是异常。可以类比为:「我有一本正常产品的相册,现在来了一个新样品,我把它拆成小区域逐一比对——哪个区域在相册里找不到类似的,哪个区域就有问题。」2.2 核心原理拆解Step 1:特征提取使用在 ImageNet 上预训练的 WideResNet-50 作为 backbone,取第 2 层和第 3 层的输出。为什么不用最后一层?因为浅层特征保留更多空间细节,对定位小缺陷至关重要。对于一张输入图像X ∈ R H × W × 3 X \in \mathbb{R}^{H \times W \times 3}X∈RH×W×3,提取到的特征图:ϕ i j = f θ ( X ) ∈ R H ′ × W ′ × C \phi_{ij} = f_\theta(X) \in \mathbb{R}^{H' \times W' \times C}ϕij=fθ(X)∈RH′×W′×C其中C CC是通道数(WideResNet-50 的 layer2+layer3 拼接后通常为 1024 或 1536 维)。Step 2:构建记忆库把所有N NN张正常图像的 patch 特征拉平成N × H ′ × W ′ N \times H' \times W'N×H′×W′个C CC维向量,得到记忆库M ∈ R ∣ M ∣ × C \mathcal{M} \in \mathbb{R}^{|\mathcal{M}| \times C}M∈R∣M∣×C。但如果正常图像很多(几百张),记忆库会膨胀到几百万个向量,推理时做最近邻搜索会非常慢。PatchCore 的关键创新在这里:核心集采样(Coreset Subsampling)。Step 3:核心集采样目标:从M \mathcal{M}M中选出一个子集M c \mathcal{M}_cMc,使得M c \mathcal{M}_cMc能「代表」整个记忆库,同时大幅缩小尺寸。PatchCore 采用greedy coreset via minimax facility location:随机选一个种子点放入M c \mathcal{M}_cMc迭代:每次选M \mathcal{M}M中到M c \mathcal{M}_cMc最近距离最大的那个点加入M c \mathcal{M}_cMc重复直到达到目标采样率(默认 10%,即∣ M c ∣ = 0.1 × ∣ M ∣ |\mathcal{M}_c| = 0.1 \times |\mathcal{M}|∣Mc∣=
工业视觉异常检测:PatchCore与EfficientAD原理、实战与调优
发布时间:2026/6/3 16:59:07
工业视觉异常检测:PatchCore与EfficientAD原理、实战与调优一、为什么异常检测是工业视觉的「最后一公里」去年参与一个 PCB 检测项目时,我被一个现实打脸:缺陷样本根本不够。产线上每天流转数十万块板子,但真正的缺陷品一个月不到 200 块——其中 80% 还集中在 3 种缺陷类型上,剩下 20 种缺陷类型合起来不到 40 个样本。传统的监督学习(分类 / 目标检测)在这个数据分布面前直接崩溃:类别极度不均衡,稀有缺陷甚至只有 1-2 张训练图。更棘手的是「开放集问题」——产线随时可能出现训练集中从未见过的缺陷形态。你永远不知道明天操作工会不会搞出一种新的焊接不良。这种情况在纺织、玻璃、金属表面、医药包装等行业普遍存在。这就是**异常检测(Anomaly Detection)**的用武之地。它的核心思路很巧妙:只学「正常长什么样」,凡是偏离正常的都是异常。不需要缺陷样本,不需要标注,天然适配工业场景。近年工业异常检测的 SOTA 方法可以归为几大范式:范式代表方法核心思想推理速度特征嵌入 + 记忆库PatchCore, PaDiM提取正常特征 → 构建 memory bank → 测试时查最近邻⭐⭐教师-学生网络EfficientAD, STFPM学生网络只学「正常」的输出,异常输入会产生大的 feature discrepancy⭐⭐⭐重构模型DRAEM, AutoEncoder只重构正常图像,异常区域重构误差大⭐⭐归一化流FastFlow, CFlow将正常特征分布建模为高斯,异常偏离该分布⭐⭐⭐本文聚焦工业界落地效果最好的两种方法——PatchCore(检测精度天花板)和EfficientAD(速度与精度的完美折中),从原理到代码到调优,一杆子捅到底。二、PatchCore:特征记忆库 + 核心集采样2.1 直觉理解PatchCore 的核心思想朴素但有效:用预训练 CNN 提取正常图像的特征 → 存到记忆库 → 测试时,对测试图像的每个 patch 特征,在记忆库里找最近的正常 patch → 距离越大,越可能是异常。可以类比为:「我有一本正常产品的相册,现在来了一个新样品,我把它拆成小区域逐一比对——哪个区域在相册里找不到类似的,哪个区域就有问题。」2.2 核心原理拆解Step 1:特征提取使用在 ImageNet 上预训练的 WideResNet-50 作为 backbone,取第 2 层和第 3 层的输出。为什么不用最后一层?因为浅层特征保留更多空间细节,对定位小缺陷至关重要。对于一张输入图像X ∈ R H × W × 3 X \in \mathbb{R}^{H \times W \times 3}X∈RH×W×3,提取到的特征图:ϕ i j = f θ ( X ) ∈ R H ′ × W ′ × C \phi_{ij} = f_\theta(X) \in \mathbb{R}^{H' \times W' \times C}ϕij=fθ(X)∈RH′×W′×C其中C CC是通道数(WideResNet-50 的 layer2+layer3 拼接后通常为 1024 或 1536 维)。Step 2:构建记忆库把所有N NN张正常图像的 patch 特征拉平成N × H ′ × W ′ N \times H' \times W'N×H′×W′个C CC维向量,得到记忆库M ∈ R ∣ M ∣ × C \mathcal{M} \in \mathbb{R}^{|\mathcal{M}| \times C}M∈R∣M∣×C。但如果正常图像很多(几百张),记忆库会膨胀到几百万个向量,推理时做最近邻搜索会非常慢。PatchCore 的关键创新在这里:核心集采样(Coreset Subsampling)。Step 3:核心集采样目标:从M \mathcal{M}M中选出一个子集M c \mathcal{M}_cMc,使得M c \mathcal{M}_cMc能「代表」整个记忆库,同时大幅缩小尺寸。PatchCore 采用greedy coreset via minimax facility location:随机选一个种子点放入M c \mathcal{M}_cMc迭代:每次选M \mathcal{M}M中到M c \mathcal{M}_cMc最近距离最大的那个点加入M c \mathcal{M}_cMc重复直到达到目标采样率(默认 10%,即∣ M c ∣ = 0.1 × ∣ M ∣ |\mathcal{M}_c| = 0.1 \times |\mathcal{M}|∣Mc∣=