论文笔记 SimpleNet A Simple Network for Image Anomaly Detection and Localization
背景
对于工业场景上的异常检测和定位任务, 由于零件的异常情况具有多样性和随机性, 所以很难用有监督的方式来解决; 目前用的最多的是用无监督的方式, 在训练过程中只使用正常样本进行训练, 目前无监督解决异常检测任务的三个趋势是基于重建的方法, 基于合成的方法以及基于嵌入的方法;
- 基于重建的方法: 对于只使用正常样本训练的深度网络; 我们假设他无法对一个异常样本进行良好的重建其异常区域; 基于这个假设, 我们逐像素的重建误差作为用于异常定位的异常分数; 然后这个假设并不是一直成立, 有时深度网络会有良好的"泛化"能力, 从而也可以很好地重建异常区域, 从而导致误检;
- 基于合成的方法: 通过在正常样本上合成异常来进行训练, 从而找出异常检测的决策边界; 然而人工合成的异常图像不够逼真, 来自合成的样本的特征可能会距离正常样本特征很远, 从而产生具有松散边界的正常特征空间;
- 基于嵌入的方法: 这是目前性能最好的方法, 通过使用ImageNet预训练的卷积网络来提取正常样本的特征; 然后采用多变量高斯分布, 归一化流, 记忆库等统计算法来嵌入正常特征分布; 通过将输入特征与学习的分布或者记忆的特征进行比较来检测异常情况; 先不论ImageNet和工业图像之间分布的不同从而造成的领域偏差; 统计算法的高计算复杂性和高内存消耗不太容易应用到现实使用;
模型介绍
- SimpleNet结合了基于合成的方法和基于嵌入的方法;
- 首先, SimpleNet并不直接使用预处理的特征, 而是使用一个特征适配器来产生面向目标的特征, 这可以减小领域偏差
- 比起在图像上直接合成异常, SimpleNet提出通过在特征空间对正常特征施加高斯噪声来生成异常特征, 通过控制噪声的尺度便可以训练出一个紧密结合的正常特征空间
- 最后SimpleNet通过训练一个简单的判别器来简化异常检测程序, 这比基于嵌入的方法中复杂的统计计算效率要高得多;
- 总的来说, SimpleNet通过一个预训练好的主干backbone来提取正常特征, 然后利用特征适配器把特征转移到目标域; 然后向适应的特征中加入高斯噪声来生成异常特征; 用正常特征和异常特征训练判别器;
网络细节
特征提取器
- SimpleNet使用在ImageNet上预训练的wideresnet50模型来提取特征, 此后该主干会一直冻结, 不再进行训练; 并且在训练SimpleNet时会挑选wideresnet50模型中的某几层抽取特征, 代码中是layer2和layer3;
- 使用聚合函数fagg聚合邻域得到局部特征, 代码是使用了自适应平均池化来实现的; 为了组合来自不同层次的特征, 把所有特征图调整为(H, W)的大小, 然后简单地按照通道连接所有特征图;
特征适配器
SimpleNet使用的是线性层(Projection)映射, 将提取处理的特征进行线性映射, 是特征转移到目标域中; 该特征适配器可以由简单的神经块组成,例如全连接层或多层感知机(MLP)。作者实验发现,单个全连接层可以产生良好的性能。
异常生成器
SimpleNet在正常特征上添加高斯噪声来生成异常特征
异常鉴别器
鉴别器Discriminator是一个正态性评分器, 直接评估每个位置的正态性分数; 训练鉴别器时会把正常特征和合成的异常特征都送去鉴别器训练, 正常的输出正, 异常的输出负; 而且鉴别器也很简单吗, 使用一个双层MLP结构即可;
损失函数
先设计一个简单的截断L1损失函数: l = max(0, th+ - D(q+)) + max(0, th- + D(q-))
th+和th-是防止过拟合的截断项, 默认设置为0.5和-0.5; D(q+)和D(q+)分别鉴别器对正常特征和异常特征得出的分数;
训练目标是最小化所有正常样本的损失函数的平均值; 简单来说,这个损失函数鼓励判别器对正常特征给出高分,对异常特征给出低分。截断项则用来限制判别器输出,避免对某一类特征过度自信。