论文地址:https://arxiv.org/abs/2011.11108
官方代码地址:https://github.com/Niousha12/Knowledge_Distillation_AD
论文提出目前无监督的异常检测是现在比较流行的方法,对于异常检测,有两个问题是需要解决的:
- 样本量小,如何通过现有的技术学到丰富的知识
- 训练时使用的是正常样本,那最后如何区分正常和异常的样本
本文作者选择了知识蒸馏的方法,但是不同于前人,作者认为前人使用知识蒸馏,只对最后一层进行蒸馏,而作者却使用了中间多个层进行蒸馏。 另外,使用了Loss的梯度变化进行异常定位。并且在MNIST, F-MNIST, CIFAR-10, MVTecAD, Retinal-OCT等数据集上得到了很好的性能
具体来讨论一下论文使用的方案:
- 论文中teacher使用了VGG16在ImageNet上的pre-trained网络,student选择了VGG16的简化模型,考虑到网络中每一层提取特征都不太一样,浅层更加关注边缘、纹理等细节,深层更加关注语义等信息,所以选用了中间多个层进行知识蒸馏。
- 损失函数包括两项:
(1)欧氏距离损失
(2)方向损失
结合论文可知,欧氏距离相同,但是方向不一定相同,可以仔细看一下论文中的例子。
总之,利用知识蒸馏的方法,对于teacher来说,并不需要能够非常好的识别出正常样本具体长什么样,毕竟是在ImageNet上预训练过的,有一定的泛化能力,而且目标是让student学到正常数据该有的知识,所以teacher也是可以理解为一个参照物。
- 对于anomaly localization,异常区域就是Loss的梯度变化比较大的地方,这里也是比较好理解的。因为在测试时,如果输入的是异常数据,那么student和teacher学到的特征就不一样,Loss如果进行反向传播,梯度变化就会比较大。
- 作者尝试了一些消融实验
(1)使用多个中间层相对于只使用最后一层去做蒸馏的性能比较
(2)关于student网络,是相对于teacher一样大,还是相对小一点的性能好
(3)关于是否使用方向损失的讨论
(4)关于异常定位的可解释性算法讨论,