1、Background
现有的异常检测方法大致可以分为三类。基于重建的方法通过分析重建前后的残差图像来检测异常。基于嵌入的方法利用预训练的网络提取并压缩特征到一个紧凑的空间,从而在特征空间内将异常特征与正常聚类明显区分开来。这两类方法直接在原始正常样本上进行训练。基于合成的方法通常从正常样本合成异常,将异常区分信息引入检测模型以增强性能。
【基于合成的方法】一个常见的范式是图像级异常合成策略,如图1(a)所示,它在图像级别上显式模拟异常。尽管图像级异常合成提供了详细的异常纹理,但被认为是缺乏多样性和真实感。最近的方法基于特征级异常合成策略,如图1(b)所示,它在特征级别上隐式模拟异常。由于特征图的尺寸较小,特征级异常合成更加高效。然而,它也缺乏以可控的方式有方向地合成异常的能力,特别是对于近分布异常。
为了解决上述限制,提出了全局和局部异常共合成策略(GLASS),这是一个新颖的统一框架, 旨在在全局异常合成(GAS)的特征级和局部异常合成(LAS)的图像级分布约束下,合成更广泛的异常覆盖范围。
具体来说,提出了新的特征级GAS,如图1©所示,它利用梯度上升引导的高斯噪声。GAS以可控的方式在正常样本分布附近合成异常,从而实现更紧密的分类边界,进一步提高了弱缺陷检测。图像级LAS通过提供更多样化的异常合成范围进行改进。GAS在正常点周围合成弱异常,而LAS在远离正常点的地方合成强异常。
理论上,GAS合成的近分布异常是通过相对小的噪声和梯度上升从正常特征衍生而来的,而LAS合成的远离分布的异常是通过在正常图像上显著叠加纹理生成的。因此,图1中t-SNE可视化的右图显示,由梯度上升引导的异常主要定位在适当的分类边界附近。与基于高斯噪声的异常合成策略相比,我们的方法最小化了异常和正常样本之间的重叠,降低了将正常样本误分类为异常的风险
- (a) 图像级异常合成策略:
- 这种策略在图像级别上显式地模拟异常,通过复制和粘贴正常区域到随机位置(CutPaste),或者使用Poisson图像编辑无缝融合不同大小的图像块(NSA),来合成异常。
- 这种方法能够提供详细的异常纹理,但由于是在图像级别上操作,因此可能缺乏多样性,因为它受限于原始图像的内容和结构。
- (b) 特征级异常合成策略:
- 这种策略在特征级别上隐式地模拟异常,通过向正常特征添加高斯噪声(SimpleNet和UniAD)来合成异常。
- 这种方法比图像级合成更高效,因为它在特征空间中操作,特征图的尺寸通常比原始图像小。然而,它可能缺乏方向性,因为它不容易控制合成异常的方向和位置,尤其是在需要合成近分布异常时。
- © 本文提出的方法(GLASS):
- 本文提出的GLASS方法在图像和特征级别上控制合成异常的分布,通过使用梯度上升来实现。
- 在特征级别上,GLASS使用梯度上升引导的高斯噪声来合成全局异常,这种方法可以在正常样本分布附近有方向地合成异常,从而实现更紧密的分类边界,提高弱缺陷检测的性能。
- 在图像级别上,GLASS通过纹理叠加来合成局部异常,提供更多样化的异常合成范围。
- GLASS方法通过梯度上升控制合成异常的方向,使得合成的异常更有可能位于分类边界附近,从而减少正常样本和异常样本之间的重叠,降低误分类的风险。
supplement
**特征适配器(Feature Adaptor)**在GLASS框架中起到了桥梁的作用, 将预训练的特征提取器(Feature Extractor)的通用特征适配到特定的异常检测任务上
。通过减少域偏差、增强任务相关特征,并与异常检测网络一起进行端到端的训练,特征适配器有助于提高模型的性能和泛化能力。
特征适配器的工作原理
- 预训练特征提取:首先,使用一个预训练的特征提取器(例如,一个深度卷积网络)来处理输入图像。这个预训练网络通常在大规模数据集上进行训练,能够捕捉到丰富的视觉特征。
- 特征适配:预训练的特征提取器可能在不同的任务或数据分布上进行了优化,因此其输出的特征可能不完全适合当前的异常检测任务。特征适配器的作用是对这些预训练特征进行调整或适配,以更好地适应当前任务。
- 适配网络:特征适配器通常是一个较轻量的网络,如单层感知机或其他简单的神经网络。这个适配网络通过学习当前任务的数据分布,调整预训练特征的表示,使其更加适合异常检测。
特征适配器适配特征方法
- 减少域偏差:预训练的特征提取器可能在与当前任务不同的数据分布上进行了训练,因此其输出的特征可能包含与当前任务不相关的信息。特征适配器通过学习当前任务的数据分布,减少这种域偏差。
- 增强任务相关特征:特征适配器可以增强与异常检测任务更相关的特征,同时抑制那些不太重要的特征。这可以通过调整特征的权重或通过非线性变换来实现。
- 端到端训练:在GLASS框架中,特征适配器与后续的异常检测网络(如全局异常合成和局部异常合成网络)一起进行端到端的训练。这意味着特征适配器的参数可以根据异常检测任务的性能来优化。
- 提高泛化能力:通过适配预训练特征,特征适配器有助于提高模型在新的、未见过的数据上的泛化能力。这对于异常检测尤其重要,因为异常样本的多样性和复杂性可能远远超出了预训练模型的覆盖范围。
全局异常合成(GAS)旨在 通过梯度上升和截断投影的方法,从正常特征合成全局异常特征。
梯度上升(Gradient Ascent)
梯度上升是一种优化算法,通常用于最大化一个函数。在机器学习和深度学习中,它经常用于最大化模型的损失函数,以便找到使模型输出尽可能远离正常分布的输入样本(即异常样本)。
在GLASS框架中,梯度上升用于指导高斯噪声添加的方向,以便在特征空间中合成异常特征。具体步骤如下:
- 高斯噪声添加:首先,向正常特征添加高斯噪声,生成初始的异常特征。
- 梯度计算:计算损失函数(例如,与正常特征的欧氏距离)关于这些初始异常特征的梯度。
- 特征更新:根据梯度的方向更新异常特征,使得它们在特征空间中远离正常特征分布的中心,即朝着增加异常分数的方向移动。
截断投影(Truncated Projection)
截断投影是一种约束技术,用于限制梯度上升的步幅,确保合成的异常特征不会偏离正常特征分布太远,从而保持异常检测的可控性和准确性。
在GLASS框架中,截断投影的步骤如下:
- 梯度上升距离计算:计算梯度上升后的异常特征与原始正常特征之间的距离。
- 距离约束:如果这个距离超过了预设的阈值(例如,超过了流形或超球体的边界),则通过截断投影将异常特征投影回一个合理的范围内。这通常通过缩放梯度上升的距离来实现,使其落在一个安全的区间内。
- 特征投影:将更新后的异常特征投影回正常特征分布的边界内,确保它们既不会太靠近正常特征(以避免误分类),也不会太远(以保持异常特征的多样性)。
结合梯度上升和截断投影技术,GLASS框架合成全局异常特征的流程如下:
- 正常特征提取:使用特征提取器从正常样本中提取特征。
- 高斯噪声添加:向这些特征添加高斯噪声,生成初始的异常特征。
- 梯度上升:计算损失函数的梯度,并根据梯度方向更新异常特征,使其远离正常特征分布。
- 截断投影:对梯度上升后的异常特征进行截断投影,确保它们位于一个合理的范围内。
- 全局异常特征获取:经过截断投影后的异常特征即为全局异常特征,它们在特征空间中分布,用于训练异常检测模型。
2、Method
GLASS框架主要包含三个分支:正常分支(Normal branch)、全局异常合成(GAS)分支和局部异常合成(LAS)分支。
- 正常分支(Normal branch):
- 这个分支负责处理正常样本,通过特征提取器(Eϕ)和特征适配器(Aφ)获取适应性的正常特征。
- 特征提取器使用预训练的网络来提取图像的特征图,然后通过特征适配器对这些特征进行适配,以减少预训练特征提取器带来的潜在域偏差。
- 全局异常合成(GAS)分支:
- GAS分支旨在通过梯度上升和截断投影的方法,从正常特征合成全局异常特征。
- 首先,通过向正常特征添加高斯噪声来模拟异常。然后,利用梯度上升方法引导异常特征的合成方向,使其更接近正常样本分布,从而实现对弱缺陷的检测。
- 为了控制梯度上升的范围,使用截断投影技术,确保合成的异常特征既不会太远也不会太近。
- 局部异常合成(LAS)分支:
- LAS分支负责在图像级别上合成局部异常,通过纹理叠加的方法生成更多样化的异常。
- 首先,使用Perlin噪声生成掩模来确定异常区域的形状。然后,从纹理数据集中随机选择图像,并应用一系列增强方法来生成异常纹理图像。
- 最后,将增强的异常纹理与正常图像融合,生成局部异常图像,并通过特征提取器和特征适配器处理以获得局部异常特征。
在训练阶段,这三个分支的特征被联合输入到一个分割网络(Dψ)中,该网络使用三种损失函数进行端到端的训练。在推理阶段,仅使用正常分支的框架来处理测试图像,以实现异常检测和定位。
GLASS方法的核心思想是通过在特征级别和图像级别上协同工作,以可控的方式合成更广泛的异常样本
。这种方法特别关注于检测那些与正常区域非常相似的弱缺陷。通过全局和局部异常合成的结合,GLASS能够在保持高检测性能的同时,提高对弱缺陷的检测能力。此外,该方法还通过在线硬例挖掘(OHEM)和焦点损失(Focal loss)来处理类别不平衡问题,进一步提高了异常检测的准确性。
GLASS算法流程:
训练阶段:
- 特征提取和适配
- 使用预训练的特征提取器(Eϕ)处理输入的正常样本图像,得到特征图。
- 通过特征适配器(Aφ)对特征图进行适配,以减少预训练模型的潜在域偏差,并获取适应性的正常特征。
- 全局异常合成(GAS)
- 利用梯度上升和截断投影技术,在特征级别上合成全局异常特征。
- 高斯噪声添加:向正常特征添加高斯噪声,生成初始的异常特征。
- 梯度上升:计算损失函数的梯度,并根据梯度方向更新异常特征,使其远离正常特征分布。
- 截断投影:对梯度上升后的异常特征进行截断投影,确保它们位于一个合理的范围内,避免偏离正常特征分布太远。
- 局部异常合成(LAS)
- 在图像级别上合成局部异常图像,通过纹理叠加的方法生成更多样化的异常。
- 异常掩模生成:使用Perlin噪声生成掩模,确定异常区域的形状和位置。
- 异常纹理合成:从纹理数据集中随机选择图像,并应用图像增强技术生成异常纹理。
- 纹理叠加:将增强的异常纹理与正常图像融合,生成局部异常图像。
- 联合训练
- 将正常分支、GAS分支和LAS分支生成的特征联合输入到一个分割网络(Dψ)中。
- 使用三种损失函数(二元交叉熵损失、全局异常特征损失、局部异常特征损失)进行端到端的训练。
- 应用在线硬例挖掘(OHEM)和焦点损失(Focal loss)来处理类别不平衡问题。
推理阶段:
- 特征提取
- 使用与训练阶段相同的特征提取器(Eϕ)和特征适配器(Aφ)处理测试图像,获取适应性的特征。
- 异常检测和定位
- 将适应性特征输入到训练好的分割网络(Dψ)中,获取异常分数图。
- 通过上采样和高斯平滑处理异常分数图,以获得像素级别的异常定位结果。
- 结果输出
- 输出图像级别的异常分数(SAD)用于异常检测。
- 输出像素级别的异常分数(SAL)用于异常定位。
pseudo-code
# 导入必要的库
import numpy as np
from some_deep_learning_framework import FeatureExtractor, FeatureAdapter, SegmentationNetwork
# 初始化模型组件
feature_extractor = FeatureExtractor(pretrained=True)
feature_adaptor = FeatureAdapter(input_dim, output_dim)
segmentation_network = SegmentationNetwork(input_dim)
# 定义全局异常合成(GAS)函数
def gas(normal_features):
gaussian_noise = np.random.normal(0, noise_std, normal_features.shape)
initial_anomaly_features = normal_features + gaussian_noise
gradient_ascent_direction = compute_gradient(initial_anomaly_features)
truncated_anomaly_features = truncate_projection(initial_anomaly_features, gradient_ascent_direction, bounds)
return truncated_anomaly_features
# 定义局部异常合成(LAS)函数
def las(normal_images):
anomaly_masks = generate_perlin_noise_masks(normal_images.shape)
anomaly_textures = sample_and_augment_textures()
local_anomaly_images = overlay_textures(normal_images, anomaly_masks, anomaly_textures)
return local_anomaly_images
# 定义训练过程
def train(model, data_loader, optimizer):
for images, _ in data_loader:
normal_features = feature_extractor(images)
adapted_features = feature_adaptor(normal_features)
# 全局异常合成
gas_features = gas(adapted_features)
# 局部异常合成
las_images = las(images)
# 联合训练分割网络
loss = compute_loss(adapted_features, gas_features, las_images, segmentation_network)
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 定义推理过程
def infer(model, test_image):
test_features = feature_extractor(test_image)
adapted_features = feature_adaptor(test_features)
anomaly_scores = segmentation_network(adapted_features)
return anomaly_scores
# 主程序
if __name__ == "__main__":
# 初始化优化器和数据加载器
optimizer = SomeOptimizer(model.parameters())
train_loader = DataLoader(train_dataset, batch_size, shuffle=True)
# 训练模型
for epoch in range(num_epochs):
train(model, train_loader, optimizer)
# 推理和评估
test_images = ... # 加载测试图像
anomaly_scores = infer(model, test_images)
evaluate(anomaly_scores, ground_truth) # 评估模型性能
3、Experiments
🐂🐎。。。
4、Conclusion
- 提出了一个新颖的图像异常检测框架GLASS,通过GAS和LAS的协同训练,以可控的方式在流形和超球体假设下合成更广泛的异常覆盖范围。
- 具体来说,提出了基于梯度上升和截断投影的GAS。GAS具有定量合成弱缺陷的能力,解决了高斯噪声中随机合成方向的问题。LAS通过提供更多样化的异常合成范围进行改进。