核心思想
本文提出一种基于自相似度的异常检测方法,核心思想在于正常样本图像之间的相似性更大,而缺陷样本和正常样本之间的相似性更小,如果某个样本与正常样本之间的最小距离都超过一个阈值时,就判定为异常样本。首先利用一个在ImageNet数据集上预训练好的特征提取网络对正常样本进行特征提取,然后对特征向量进行PCA降维,降维后再进行K-means聚类,每个类别中距离聚类中心最近的样本就作为这个类别的代表,所有类别代表构成一个正常样本字典。然后测试时用测试样本分别计算与字典中所有类别代表之间的欧氏距离,并计算其中距离最小的m个距离的平均值,如果这个平均值大于阈值就认为该样本属于缺陷样本,距离值的大小也就表示了它“不正常的程度”。
首先,对图像样本按照固定尺寸和步长进行分割,得到大小相同的图块。这种情况下许多像素点可能同时属于多个图块,对于每个像素点的“不正常程度”可以通过计算他所属的多个图块的“不正常的程度”的平均值得到。
然后,使用一个在ImageNet数据集上预训练得到的ResNet-18网络作为特征提取网络,用于特征提取,每个图块
P
t
P_t
Pt输出
N
N
N个特征向量
f
t
f_t
ft。经过主成分分析PCA降低维度到
M
M
M个特征向量,并对这M个特征向量进行规范化处理
将整个数据集的特征向量进行K-means聚类,得到
k
k
k个类别和对应的类别中心,每个类别选择与类别中心距离最近的那个样本的特征向量作为类别代表,添加到正常样本字典中,因此字典中包含
k
k
k个类别样本对应的特征向量。整个字典构建过程如下图所示
接下来是阈值的设定,与先前将阈值作为一个超参数进行人为设定的方式不同,本文利用验证集(均是正常样本,但与训练集不重叠)来计算阈值。对验证集图像进行相同的处理:图块分割,特征提取,规范化。然后计算其与字典中各个类别特征向量之间的欧氏距离,并选择其中距离最近的
m
m
m个样本,计算平均距离
d
d
d。最后计算整个验证集
V
T
V_T
VT距离
d
d
d的均值
μ
d
\mu _d
μd和方差
σ
d
\sigma _d
σd,并按照以下方式计算阈值
t
h
th
th
其中
α
\alpha
α作为一个调整参数,用于调节阈值的边界范围,
α
\alpha
α越小,表示该系统更倾向于提高召回率。测试时,计算测试样本与字典中正常样本之间的欧式距离,同样取最近的
m
m
m个样本计算平均值
d
t
e
s
t
d_{test}
dtest表示该图块的“不正常程度”,当该值大于阈值时即判定为异常样本。
实现过程
网络结构
采用ResNet-18网络,只需要利用特征提取部分,输出conv5_x或average_pool的结果作为特征向量。
创新点
- 提出一种基于自相似度的异常检测算法,通过构建正常样本字典,然后比对测试样本与正常样本之间的距离,来计算测试样本的不正常程度
- 通过计算验证集与字典中样本之间的距离分布来设定阈值
算法评价
本文的方法还是一种基于正向样本的检测方法,但这里不存在一个训练的过程,其实只是利用卷积神经网络作为一个特征描述器,而且正向样本其实并不存在明确的类别关系,而只是依靠特征向量的相似程度进行聚类,最后通过比对样本特征向量之间的欧氏距离来判断该样本是否属于异常样本。该方法本质上应该是属于传统方法的范畴,在特征提取网络可靠的前提下,我觉的该方法还是有一定的实际价值的,但还有一个重要的问题就是这个方法的计算速度实在是比较慢,一张图片要处理数十秒中,在一些实时性要求高的领域中就无法应用了,感觉优化解决这个问题也是一个不错的点。
如果大家对于深度学习与计算机视觉领域感兴趣,希望获得更多的知识分享与最新的论文解读,欢迎关注我的个人公众号“深视”。