Generating and Reweighting Dense Contrastive Patterns for Unsupervised Anomaly Detection
1、Background
图像异常检测在各个领域扮演着至关重要的角色,包括工业产品缺陷检测、医学图像病变检测、使用X光图像的安全检查以及视频监控。
然而,由于无法覆盖足够多样化的潜在异常模式范围,获取用于训练的真实世界异常数据通常是具有挑战性和稀缺的。因此,一类学习设置,即仅使用正常样本进行模型训练,已被证明更适合大多数工业异常检测任务。
近年来,许多高准确率的工业异常检测方法严重依赖于在辅助数据集上预训练的特征提取器,例如ImageNet。然而,这种依赖可能会限制它们在ImageNet预训练特征信息不足的场景中的泛化能力,或者在其他类型的图像数据上。
此外,一些方法在不使用预训练特征提取器的情况下,在MVTec AD上取得了不错的结果。这些方法使用人工选择的外部非分布内(OOD)数据集或精心设计的异常模拟数据来采样异常模式。
然而,以前的异常获取策略可以被认为是依赖于先验或测试图像的视觉检查的临时解决方案,例如在MVTec AD中,大多数异常是低级结构异常(例如,划痕、凹陷和污染)。这种依赖可能导致这些策略在检测其他类型的异常时失败,例如最近在MVTec LOCO中提出的逻辑异常。这些逻辑异常被表示为图像中逻辑约束的违反,这不仅挑战了基于异常模拟的方法,也挑战了辅助数据集的预训练表示。
因此,有必要设计独立于预训练的Imagenet特征提取器和临时异常获取策略的图像异常检测技术。在本文中,我们引入了一个名为GRAD(生成和重权密集对比模式以进行无监督异常检测)的新颖框架,它在异常检测准确性和推理运行时间方面均实现了最先进的性能。
我们首先提出了一个新颖的异常生成范式:保留每个小图像块内的结构信息,同时忽略整个图像的全局结构信息。基于这个范式,我们设计了一个名为PatchDiff的异常生成器。该生成器对扩散模型的感受野大小施加了约束,并去除了DDPM中使用的自注意力层,从而确保只保留每个块内的局部结构,同时丢弃全局结构。通过设置不同大小的感受野,PatchDiff可以生成多样化的密集对比模式,涵盖MVTec LOCO中提出的结构和逻辑异常等异常类型。随后,我们期望利用生成的局部异常模式来学习块级异常检测器。然而,由PatchDiff生成的对比模式也可能是正常的,我们无法为它们提供逐块的真实标签。因此,生成的对比模式是未标记的。
此外,正常和生成数据中的局部模式通常是长尾的。考虑到前两点,我们引入了一个自监督重权机制来减轻假异常块(没有有效异常模式的块)和不平衡分布的负面影响。该机制利用检测器在训练阶段提取的特征的密度信息,为对比块分配不同的权重。它过滤掉假异常块,并重新平衡对比块的分布。
最后,为了获得更适合实际工业场景的高吞吐量异常检测模型,我们设计了一个轻量级的基于全卷积网络(FCN)的块级检测器,它仅包含8个卷积层,但与更大的模型在工业异常检测中的表现相当。此外,为了处理涉及混合级别异常的任务,我们还可以集成具有不同感受野的多个检测器。我们的经验发现,单级检测器足以在MVTec AD数据集上实现竞争性准确性,而三个检测器可以集成以处理MVTec LOCO中的结构和逻辑异常。
2、Method
GRAD方法是主要可以分为两个阶段:
(1)基于我们新提出的异常生成范式生成多样化的对比图像,以覆盖感兴趣的异常模式。
(2)使用我们提出的重权机制训练轻量级块级检测器,充分利用未标记和长尾生成的对比模式
异常图像生成
PatchDiff如何通过限制U-Net的感受野来生成只包含局部结构的对比模式,这些模式可以用来训练异常检测模型,以识别和定位图像中的各种异常。通过调整感受野的大小,PatchDiff能够生成不同级别的对比模式,从而帮助模型捕捉从简单到复杂的多种异常类型。
-
PatchDiff与常规扩散模型的对比:
- 与常规的扩散模型(如DDPM)相比,PatchDiff在去噪过程中对U-Net的感受野进行了限制。这意味着PatchDiff在生成图像时只保留了局部结构信息,而忽略了全局结构信息。
-
局部结构的保留:
- PatchDiff的设计目的是在去噪过程中只关注局部结构,而不是整个图像的全局结构。这种设计使得PatchDiff能够生成包含局部异常模式的图像,这些模式可以用于训练异常检测模型。
-
生成更高级别的视觉结构:
- 通过重组特定级别的局部结构,PatchDiff能够有效地产生更高级别的新颖视觉结构。这些结构可能包含在正常图像中不存在的异常模式,有助于异常检测模型学习识别这些异常。
-
多级密集对比模式的生成:
- PatchDiff可以通过使用不同大小的感受野来生成多级密集对比模式。这些对比模式有助于暴露不同级别的异常,例如MVTec LOCO数据集中的结构异常和逻辑异常。
-
多级异常的检测:
- 结构异常通常指的是图像中的物理损坏或变形,而逻辑异常则是指违反图像中逻辑约束的异常。PatchDiff能够生成包含这些不同级别异常的对比模式,使得异常检测模型能够同时检测结构异常和逻辑异常。
异常图像判别
训练块级检测器时主要涉及的两个组件:训练集的组成和重权机制。
- 训练集组成(Training Set):训练集由一种类型的正样本(positive patch)和两种类型的负样本(negative patches)组成。
- 正样本:这些是来自正常图像的补丁,被认为是没有异常的样本。
- 负样本:这些是来自生成的对比图像的补丁,可能包含异常模式。负样本有两种类型:
- 一种是直接从生成样本中裁剪出来的补丁,这些补丁可能包含真实的异常模式。
- 另一种是来自正常样本但与错误的坐标映射结合的补丁,这些补丁被认为包含“假”的异常模式,因为它们破坏了补丁内容和位置之间的正常依赖关系。
- 重权机制(Reweighting Mechanism):重权机制包含两个部分,用于处理训练数据中的假异常模式和长尾分布问题。
- 过滤假异常模式(Mechanism (a)):这个机制的目的是要识别并减少那些不包含有效异常信息的负样本(即“假”异常模式)对训练过程的影响。这是通过比较负样本的特征与正样本特征集的相似度来实现的,如果负样本的特征与正样本特征集过于接近,则会降低其权重。
- 重新平衡长尾训练数据(Mechanism (b)):这个机制旨在解决训练数据中某些特征过于常见而其他特征很少见的问题,即长尾分布问题。通过降低高密度区域样本的权重,并增加低密度区域样本的权重,可以使模型不会忽视那些罕见但重要的异常模式。
总的来说,训练块级检测器时,先处理训练样本,并通过重权机制来提高模型对异常模式的识别能力,同时减少假阳性的影响,并平衡训练数据的分布,以便更有效地学习异常检测任务。
pseudo-code
# 导入必要的库
import torch
import torch.nn as nn
import torch.optim as optim# 定义PatchDiff模型,用于生成对比模式
class PatchDiff(nn.Module):def __init__(self):super(PatchDiff, self).__init__()# 初始化U-Net模型,限制感受野大小,移除自注意力层# ...(此处省略U-Net的具体实现)def forward(self, x):# 前向传播,生成对比模式# ...(此处省略具体实现)return contrastive_pattern# 定义块级检测器
class PatchLevelDetector(nn.Module):def __init__(self):super(PatchLevelDetector, self).__init__()# 初始化全卷积网络(FCN)# ...(此处省略FCN的具体实现)def forward(self, x):# 前向传播,输出异常分数# ...(此处省略具体实现)return anomaly_score# 定义重权机制
def reweighting_mechanism(features, positive_features, negative_features):# 根据特征密度信息,为对比补丁分配不同的权重# ...(此处省略具体实现)return reweighted_features# 训练PatchDiff模型
def train_patch_diff(model, dataloader, epochs):optimizer = optim.Adam(model.parameters(), lr=1e-3)for epoch in range(epochs):for data in dataloader:# 生成对比模式contrastive_pattern = model(data)# ...(此处省略训练步骤)# 训练块级检测器
def train_detector(detector, dataloader, epochs):optimizer = optim.Adam(detector.parameters(), lr=1e-3)for epoch in range(epochs):for data, contrastive_data in dataloader:# 计算异常分数anomaly_score = detector(data)# 应用重权机制reweighted_features = reweighting_mechanism(detector.features, detector.positive_features, detector.negative_features)# ...(此处省略损失计算和优化步骤)# 主函数
def main():# 初始化模型patch_diff_model = PatchDiff()detector_model = PatchLevelDetector()# 训练PatchDiff模型train_patch_diff(patch_diff_model, train_dataloader, epochs=10000)# 生成对比模式contrastive_patterns = patch_diff_model(test_data)# 训练块级检测器train_detector(detector_model, train_dataloader, epochs=2000)# 评估模型性能# ...(此处省略评估步骤)if __name__ == "__main__":main()
3、Experiments
4、Conclusion
- 提出了一个新颖的无监督异常检测框架GRAD,通过生成和重权密集对比模式。
- 提出的生成方法PatchDiff能够生成多级对比模式,暴露出一系列局部异常模式。
- 提出的重权策略充分利用了未标记和长尾的对比模式,帮助块级异常检测器更好地学习暴露出的局部异常模式。