转载:https://mp.weixin.qq.com/s/CcppITsiOy-NfgvFrfSGcA
论文题目:《MuSc: Zero-Shot Industrial Anomaly Classification and Segmentation with Mutual Scoring of the Unlabeled Images》
论文链接:https://arxiv.org/pdf/2401.16753.pdf
项目地址:https://github.com/xrli-U/MuSc
觉得不错的话请给github项目点个star吧(∠・ω< )⌒☆
此项目会持续更新…
有什么关于该论文或代码的问题尽管在issue里提,作者一定会回复的,除非没看见 …
作者要是不回复的话请通过470467854@qq.com狠狠地骚扰作者QAQ
还有什么要说的呢…请给github链接点个star吧QAQ
工业异常检测
制造业是我国实体经济的基础,也是科技创新的主战场,我国制造业总体规模已连续14年位居全球第一。目前,所有制造类企业都面临着一个核心共性需求,即对工业制品的品质检测、质量监测。近年来,随着计算机视觉技术的快速发展,采用工业异常检测技术进行产品的瑕疵检测已获得广泛应用。工业制品的瑕疵又常被称为“工业缺陷”、“工业异常”等,它们具有相同的概念内涵,建立在正常工业产品之上,将破坏正常产品规则的部分判定为瑕疵(异常)。因此,工业异常是一种宏观概念,不同工业产品上的异常会截然不同,包括结构异常、逻辑异常等各类型的瑕疵。
工业异常检测的常见范式
无监督工业异常检测(Unsupervised Industrial AD):搜集一批与测试集图片同源的正常图片,基于这些正常图片训练得到异常检测模型,用于对测试集图片进行异常检测和分割,该类方法的核心思路是:不符合正常图片数据分布规律的图像区域即判定为异常,近年来,该类方法获得了长足的发展。但是,我们发现,在出现跨产品、跨产线、跨时间、跨视角等常见生产条件变化的情况下,该类方法均需要重新搜集正常样本进行异常检测模型训练,其迁移性能受限,大大限制了其实用价值。
少样本异常检测(Few-Shot Industrial AD):搜集少量的与测试集图片同源的正常图片,训练得到少样本异常检测模型,用于对测试集图片进行异常检测和分割。其存在的问题是少量样本往往无法充分描述正常样本的特性,其次,该类方法依然面临着上述迁移性的问题。
零样本工业异常检测(Zero-Shot Industrial AD):设计一种模型或者方法,在不需要针对任何同源数据进行训练的情况下,可直接对给定的一组无标签测试图像进行异常检测和分割。由于去掉了前述范式的训练样本搜集和模型训练的过程,零样本工业异常检测具有天然的迁移性优势,很适合于当前工业生产场景中生产环境多变的需求。
当前零样本方法的局限
当前零样本工业异常检测方法依赖于在自然场景图像中预训练的大模型,如利用CLIP视觉语言模型的图文对齐能力(如下图(b)所示),亦或是利用SAM大模型的提示工程。经过实验分析,我们发现了两个核心难点:(1)自然图像与工业图像之间存在较大差距,相比自然场景中的“猫”、“狗”等具体强语义物体,工业场景中“异常”、“缺陷”等具有典型的抽象弱语义特性,大部分是由局部图像纹理区域构成,缺乏独立语义,因此建立图文对应关系的难度较大。(2)在工业异常领域中,除了外观缺陷,例如划痕等,还存在大量的逻辑缺陷,例如某个产品器件在产品中缺少了,这种情况只有参考正常图片,才能对其进行定位。现有零样本异常检测方法没有引入任何正常样本信息,因此对于逻辑类缺陷尚无法有效处理。
因此如何设计一种既能引入正常样本信息作为参考,也不需要任何模型训练的高精度零样本异常检测方法,成为了工业界的迫切需求。
零样本异常检测新视角
我们发现,无标签测试图像本身隐含着丰富的正常先验信息,而当前方法尚未将其很好地利用。经统计,在MVTec AD数据集的测试图像中正常像素占比97.26%,在VisA数据集中占比99.45%,如此多正常像素都可以作为先验信息辅助进行异常检测。并且我们发现不同图像的正常区域彼此间相似度较高,而异常区域由于其随机性和多样性,无论是与正常区域还是异常区域相比都具有较低的相似度,即便这些异常区域是属于同一个异常类别。
由此,我们提出了无标签图片互打分(MuSc)的工业异常检测与分割新方法(如上图(c)所示),其核心思想是基于正常区域与正常区域较为相似,异常区域与大多数区域都不相似的内蕴数据分布规律,将正常与异常进行区分。MuSc利用无标签测试图像中的隐式正常先验信息辅助检测异常,摆脱了基于正常样本训练异常检测模型的依赖,实现了利用正常样本信息作为参考的零样本工业异常检测,规避了跨模态工业异常检测中对齐性受限的困境,也使得零样本逻辑异常检测成为可能。基于上述特点,MuSc获得了大幅精度提升,且具有良好的迁移性能。与当前国际领先的零样本方法相比,MuSc在MVTec AD上实现了21.1%的PRO提升,在VisA上实现了19.4%的分割AP提升。此外,MuSc也优于大多数少样本方法,并且与一些无监督方法性能相当。
方法详解
我们的方法由四部分组成,如上图所示,我们首先使用特征提取器提取每个无标签图像的图像级特征和区域级特征;然后将区域级特征输入到多聚合度邻域聚合模块(LNAMD)中,提高特征对不同大小异常区域的表达;之后我们提出了互打分模块(MSM),无标签测试图像彼此间进行相互打分,得到异常分割结果和粗异常分类结果;最后,我们提出了一个通用的分类优化模块RsCIN对粗异常分类结果进行优化。
多聚合度邻域聚合模块(LNAMD)
为了提高特征对不同大小异常的表达能力,我们提出了多聚合度邻域聚合模块(LNAMD),通过聚合1×1、3×3和5×5三种不同大小的邻域特征,以获得对不同大小异常区域的表达,具体而言,小邻域聚合适合分割较小的异常区域(如上图(a)),大邻域聚合适合完整分割较大的异常区域(如上图(c)),多种大小邻域聚合特征的组合能够适应不同大小的异常区域。
我们定义无标签测试集为 D u = { I i , i = 1 , … , N } D_u=\{I_i,i=1,…,N\} Du={Ii,i=1,…,N},使用特征提取器(默认为ViT)提取图像 I i I_i Ii的patch tokens为 F i ∈ R M × C {F}_{i} \in \mathbb{R}^{M \times C} Fi∈RM×C,其中 M为patch的数量。然后我们将 F i F_i Fi转换为 M × M × C \sqrt{M} \times \sqrt{M} \times C M×M×C的形状,对于每一个patch token,我们按照[1]中的方法使用自适应平均池操作聚合它的 r × r r \times r r×r邻域,得到聚合后的特征为 F ^ i r ∈ R M × M × C \hat{F}_{i}^r \in \mathbb{R}^{\sqrt{M} \times \sqrt{M} \times C} F^ir∈RM×M×C, r r r为不同的聚合度,如上图左侧所示。我们将形状还原回 M × C M \times C M×C,并定义每个聚合后的patch token为 p ^ i , l m , r ∈ R 1 × C \hat{p}_{i,l}^{m,r} \in \mathbb{R}^{1 \times C} p^i,lm,r∈R1×C,其中 m ∈ [ 1 , M ] m \in [1, M] m∈[1,M],我们将ViT划分为 L L L个块, l ∈ { 1 , 2 , . . . , L } l \in \{1,2,...,L\} l∈{1,2,...,L}。这些不同聚合度的特征将在下节中介绍如何进行融合。
互打分模块(MSM)
作为我们MuSc方法的核心,我们提出的互打分模块基于“不同图像的正常区域较为相似,异常区域不相似”的事实,其他图像将为当前图像的每个区域分别进行打分,然后使用分数最低的30%进行区间平均得到每个区域的异常分数。由此获得异常分割结果和粗分类结果。
互打分过程可分为三个阶段,第一阶段,我们使用
{
D
u
\
I
i
}
\{D_{u} \backslash I_i\}
{Du\Ii}中的每张图像
I
j
I_j
Ij对测试图像
I
i
I_i
Ii的每个聚合后的patch token进行打分,计算公式如下:
a
i
,
l
m
,
r
(
I
j
)
=
min
n
∥
p
^
i
,
l
m
,
r
−
p
^
j
,
l
n
,
r
∥
2
a_{i,l}^{m,r}(I_j) = \min_{n} \Vert \hat{p}_{i,l}^{m,r}-\hat{p}_{j,l}^{n,r}\Vert_2
ai,lm,r(Ij)=minn∥p^i,lm,r−p^j,ln,r∥2
如果
I
i
I_i
Ii的patch token
p
^
i
,
l
m
,
r
\hat{p}_{i,l}^{m,r}
p^i,lm,r与
I
j
I_j
Ij中的任意patch token
p
^
j
,
l
n
,
r
\hat{p}_{j,l}^{n,r}
p^j,ln,r比较相似,则
I
j
I_j
Ij将给
p
^
i
,
l
m
,
r
\hat{p}_{i,l}^{m,r}
p^i,lm,r一个较低的分数,如上图(a)所示,大部分正常patch被赋予了一个小于0.4的较低的分数,而上图(b)显示了大部分异常patch都被赋予了一个大于0.4的较高的分数。
在互打分过程的第二阶段中,我们注意到一些正常的patch由于在不同的图像上具有少量的表观差异,导致上图(c)中0.2~0.4区间内出现的异常分数重叠现象。为增大对正常区域与异常区域的判别,我们采用区间平均公式:
a
‾
i
,
l
m
,
r
=
1
K
∑
k
∈
[
1
,
K
]
a
i
,
l
m
,
r
(
I
‾
k
)
\overline{a}_{i,l}^{m,r} = \frac{1}{K} \sum_{k \in [1,K]} a_{i,l}^{m,r}(\overline{I}_k)
ai,lm,r=K1∑k∈[1,K]ai,lm,r(Ik)
其中
I
‾
\overline{I}
I为给图像
I
i
I_i
Ii的patch token
p
^
i
,
l
m
,
r
\hat{p}_{i,l}^{m,r}
p^i,lm,r打分最低的30%图像,
K
K
K为这些图像的数量。使用区间平均后(如上图(d)所示)正常与异常区域分数的重叠区域变少了。
在互打分过程的第三阶段,我们使用如下公式将所有聚合度
r
r
r和所有ViT块
L
L
L的分数进行平均。
a
i
m
=
1
L
∑
l
∈
{
1
,
.
.
.
,
L
}
1
3
∑
r
∈
{
1
,
3
,
5
}
a
‾
i
,
l
m
,
r
\textbf{a}_{i}^{m} = \frac{1}{L} \sum_{ \tiny l \in \{1,...,L\}} \frac{1}{3} \sum_{r \in \{1, 3, 5\}} \overline{a}_{i,l}^{m,r}
aim=L1∑l∈{1,...,L}31∑r∈{1,3,5}ai,lm,r
定义
A
i
=
[
a
i
1
,
.
.
.
,
a
i
M
]
⊤
\mathcal{A}_{i} = [\textbf{a}_i^1, ..., \textbf{a}_i^M]^{\top}
Ai=[ai1,...,aiM]⊤,将其转换到
M
×
M
×
1
\sqrt{M} \times \sqrt{M} \times 1
M×M×1形状后上采样到原图大小得到图像
I
i
I_i
Ii的异常分割结果,定义图像
I
i
I_i
Ii的粗异常分类结果为
c
i
=
max
(
a
i
1
,
.
.
.
,
a
i
M
)
c_i = \max(\textbf{a}_{i}^{1},...,\textbf{a}_{i}^{M})
ci=max(ai1,...,aiM),则
D
u
D_u
Du中所有图像的粗异常分类结果为
C
=
[
c
1
,
.
.
.
,
c
N
]
⊤
\mathbf{C} = [c_1, ..., c_N]^{\top}
C=[c1,...,cN]⊤。
分类优化模块(RsCIN)
基于流形学习的思想,我们设计了一种通用的分类优化模块,对粗分类结果进行优化。根据ViT提取的图像级特征计算所有图像间的相似度矩阵,然后使用多窗口掩膜操作限制粗分类异常分数沿流形传播的范围。该分类优化模块即插即用,在one-class、zero-shot、few-shot设定下的多个方法上均能起到优化分类性能的效果,详见上表。
受到流形学习方法[2]的启发,我们设计了如下的分类优化模块RsCIN。我们定义所有图像彼此间的相似度矩阵
W
W
W,图像
I
i
I_i
Ii与图像
I
j
I_j
Ij的相似度定义为图像
I
i
I_i
Ii的图像级特征
F
i
\mathcal{F}_i
Fi与图像
I
j
I_j
Ij的图像级特征
F
j
\mathcal{F}_j
Fj间的向量内积,即
W
i
,
j
=
F
i
⋅
F
j
{W_{i,j} = \mathcal{F}_{i} \cdot {\mathcal{F}_{j}}}
Wi,j=Fi⋅Fj。对
W
W
W使用多窗口掩膜操作限制互优化的范围,二值化的窗口掩膜
M
k
M_k
Mk如下:
其中
N
k
\mathcal{N}_{k}
Nk表示与
I
i
I_i
Ii最相近的
k
k
k个样本,利用多个
k
k
k来形成多窗口掩膜
M
‾
=
{
M
k
1
,
.
.
,
M
k
K
}
\overline{M}=\{M_{k_1},.., M_{k_K}\}
M={Mk1,..,MkK},其中
k
∈
{
k
1
,
.
.
,
k
K
}
k \in \{{k_1},.., {k_K}\}
k∈{k1,..,kK},
K
K
K为窗口掩膜的数量。我们使用如下公式优化粗异常分类结果:
C
^
=
(
∑
M
k
∈
M
‾
(
D
−
1
(
M
k
⊙
W
)
C
)
+
C
)
/
(
K
+
1
)
\hat{\textbf{C}} = (\sum^{}_{M_{k} \in \overline{M}}({D^{-1}}(M_{k} \odot W)\textbf{C})+\textbf{C}) / (K+1)
C^=(∑Mk∈M(D−1(Mk⊙W)C)+C)/(K+1)
其中
C
\textbf{C}
C为优化前的分类异常分数,
C
^
∈
R
N
×
1
{\hat{\textbf{C}} \in \mathbb{R}^{N \times 1}}
C^∈RN×1为优化后的分类异常分数,
D
D
D为对角矩阵,
D
(
i
,
i
)
=
∑
j
=
1
N
M
k
⊙
W
(
i
,
j
)
{D(i, i)}=\sum_{j=1}^N{{M_k}{\odot}W(i,j)}
D(i,i)=∑j=1NMk⊙W(i,j),
⊙
{\odot}
⊙表示逐元素相乘。
实验设置
我们使用OpenAI预训练的ViT-L/14-336作为我们默认的特征提取器(我们的代码兼容CLIP、DINO和DINO_v2的vision transformer),它一共有24层,我们将其均匀划分为4个块,即 L = 4 L=4 L=4。我们在MVTec AD和VisA两个数据集上进行了实验,输入图像的分辨率默认为518×518。在RsCIN模块中,多窗口大小在MVTec AD数据集上设置为 k ∈ { 2 , 3 } k \in \{2,3\} k∈{2,3},在VisA数据集上设置为 k ∈ { 8 , 9 } k \in \{8,9\} k∈{8,9}。
结果分析
定量结果分析
相比于之前的零样本方法,我们的MuSc获得了显著的提升,在MVTec AD数据集上,MuSc获得了21.1%的PRO提升和21.9%的AP分割性能提升;在VisA数据集上,我们获得了19.4%的AP分割性能提升,14.7%的AUROC分类性能提升。我们的方法甚至优于部分少样本异常检测方法。
定性结果分析
相比其它零样本和少样本方法,我们的方法能够检测较小的异常(如cashew上的划痕),也能将较大的异常区域完整分割出来(如bottle上的破损),对于逻辑异常(如metalnut的翻转异常和pipe_fryum的增生异常)也具有显著的分割效果提升。
*都看到这了,麻烦给github项目点个star吧 (๑•́ ₃ •̀๑)エー
https://github.com/xrli-U/MuSc
参考文献
[1] Karsten Roth, Latha Pemula, Joaquin Zepeda, Bernhard Scholkopf, Thomas Brox, and Peter Gehler. Towards total recall in industrial anomaly detection. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition, pp. 14318–14328, 2022.
[2] Jiayan Jiang, Bo Wang, and Zhuowen Tu. Unsupervised metric learning by self-smoothing operator. In 2011 International Conference on Computer Vision, pp. 794–801. IEEE, 2011.