SimpleNet: A Simple Network for Image Anomaly Detection and Localization

原论文 链接:SimpleNet
源代码 链接:源码
出发点
- 不直接使用预训练特征,而是用特征适配器来生成面向目标的特征 ,以减少域偏差(图像局部偏见)。
- 由于缺陷在图像空间中可能没有太多共性,因此通过对特征空间 中的正常特征施加噪声来生成异常特征。
- 训练一个简单的判别器 以简化异常检测程序,比基于嵌入的方法采用的复杂统计算法的计算效率高得多。
贡献
- 在MVTecAD数据集上AUROC指标达到99.6%,同时与性能第二的模型相比,误差降低了55.5%。
- 在一张3080ti GPU上实现了77FPS的高帧推理速率。
- SimpleNet在one-class新颖的检测任务上的性能有显著提高。
- 提出了一个将在大型数据集上预训练的模型应用在目标数据集上进行实验的新视角,可弥合异常检测和定位方面的学术研究与工业应用之间的差距。
模型主体框架

SimpleNet由四个组件组成:(1)生成局部特征的预训练特征提取器 (2)将局部特征传输到目标域(工业映像通常具有与ImageNet不同的分布,源域数据是如 ImageNet 这样的自然图像数据集,目标域是工业图像所在的领域)的浅层特征适配器 (3)一个简单的异常特征生成器 ,通过向正常特征添加高斯噪声来伪造异常特征(4)区分异常特征和正常特征的二进制异常判别器 。
框架组成模块
1.特征提取器
特征提取器实现局部特征提取,本文所采用的方法来自此论文。
和
表示训练集和测试集,对于任一张图片
属于训练集和测试集的并集。预先训练好的网络Φ从不同的层次结构中提取特征,就像ResNet骨干网络做的那样。由于预训练的网络偏向于它训练的数据集,因此对于目标数据集来说,只选择一个级别的子集作为特征提取器是合理的(子集L、图片
)。l∈L级特征图可表示为
,对于在位置(ℎ,w)处的输入
,其patch大小为P的领域定义为:

在邻域
内用聚合函数
(使用自适应平均池化层)聚合特征,得到局部特征
:

为了连接来自不同层次结构的特征
,所有特征图被线性调整为相同大小
,按通道方式连接得到特征图
:

上述表达式简化为:

总结一句话:用类Resnet骨干网络提取了多个层级的特征,然后再聚合。
2.特征适配器
由于工业图像的分布通常与预训练骨干网络中使用的数据集不同,因此采用特征适配器
将训练特征转移到目标域。特征适配器
将局部特征
映射到适应特征
,得到:

特征适配器由简单的神经块组成,实验结果表明,单个全连接层具有良好的性能。

3.异常特征生成器
为了训练鉴别器来估计样本为正常的可能性,最简单方法是采样负样本(也就是缺陷特征)与正样本一起优化,然而缺陷的缺乏使得抽样分布难以进行,同时这种方法还依赖于额外的数据来合成缺陷图像。提出的异常特征生成器通过在特征空间的正常样本的特征上添加高斯噪声直接得到异常特征。 形式上,采样一个噪声向量
,每个项在一个高斯分布N(μ,σ^2)之后。异常特征
被表示为:

下图说明了异常特征对四类MVTec AD的影响。从图中不难看到,沿着适应特征的每个维度的标准偏差往往是一致的。因此,当区分异常特征和正常特征时,特征空间往往是紧凑的。

4.判别器
判别器
作为一个正态性评分器,可直接估计每个位置(ℎ,w)的正态性。负样本与正常特征
一起产生,在训练期间都被输入到判别器。判别器期望正常特征得到正输出,而异常特征得到负输出。文中判别器使用的是一个2层的多层感知器结构,评估正态性为
。

损失函数
简单的截断
损失为:



与
是截断项,目的防止过拟合。文中
与
分别设置为0.5和-0.5。所以训练的目标就是将正样本的判别器输出
接近0.5,而伪异常的判别器输出
接近-0.5。训练目标为:

训练过程伪代码为:

伪代码最后一行这里
,不难看出s 应该是
,
应该是
。所以由代码来看,我感觉倒数第二行应该是
,不然前后就矛盾了好像???
推理阶段
推理时丢弃异常特征生成器,其余模块堆叠至一个端到端网络中。对每个属于测试集的图片
经过特征提取器
与特征适配器
后,得到适配特征
,再由判别器
得到异常分数
(对于每个点计算异常得分)。 将推理过程中用于异常定位的异常图定义为

然后对
进行插值,得到输入样本的空间分辨率,并使用σ = 4对光滑边界进行高斯滤波。由于对于任何大小的异常区域都存在最具响应的点,因此将异常图的最大分数作为每幅图像的异常检测得分:
(异常定位由每个点得分插值到原图像大小后得到,异常得分为异常得分最大的像素点的异常得分)。
消融实验
文章研究了特征提取器中的邻域大小p、层级选择、适配器结构、噪声规模对性能的影响。
对邻域大小和层级分别进行了消融实验,最终选取p为3,选取WideResNet50的2+3层。

能看到复杂的适配器会迅速收敛,但实验发现复杂特征适配器会导致性能的显著下降。可能原因之一是复杂适配器可能会导致过拟合,在测试中降低了缺陷的泛化能力。
对于噪声规模σ,当大的σ值时,训练会导致宽松的决策边界,从而导致高假阴性。相反,如果σ很小,训练过程将不稳定,判别器不能很好地泛化到正常特征。
总结
主要贡献在于通过比较简单的网络实现了最先进的性能,主要创新在于在特征空间内加噪声来生成伪异常 。
复现结果

下载好代码后修改一下run.sh里的第一行和第十行路径就可以:

datapath下载的数据集存放的路径、results_path你想要存放结果的路径。
有理解错误的还请评论区指出,一起学习进步~
