Uninformed Students: Student-Teacher Anomaly Detection with Discriminative Latent Embeddings论文复现及解析

paper地址Uninformed Students: Student-Teacher Anomaly Detection with Discriminative Latent Embeddings

代码地址

GitHub - denguir/student-teacher-anomaly-detection: Student–Teacher Anomaly Detection with Discriminative Latent Embeddings​​​​​​g

本文分成两部分,论文解析以及实验复现日志。

目录

一、论文解析

1、简介:

2、构建teacher网络

 3.构建student网络

 4.计算异常

二、实验复现日志

参考文献


一、论文解析

1、简介:

这篇论文主要介绍了一个用于异常检测的架构。主要分为构建teacher网络、构建student网络以及计算异常三部分

2、构建teacher网络

首先训练一个只使用卷积和最大池化层的\widehat{T}网络,将确定大小的图像P嵌入到维数d的度量空间中,通过的确定性的网络变换(该变换如参考文献[1]直接中所述) 实现从\widehat{T}到T的转换,转换后的网络T可以实现对整个输入图像的快速密集局部特征提取。

创建一个预训练网络P,代码中采用了ResNet-18网络,先将该网络在数据集上进行训练。

通过将预训练网络P的输出与\widehat{T}输出的描述符的解码版本进行匹配,将一个强大的预训练网络P的知识提取到\widehat{T}中:

 D表示一个全连接网络,它将\widehat{T}的d维输出的维度转换,使其和预训练网络P的输出维度相同。

 在一小批输入p中最小化描述符之间的相关性,以增加描述符的紧密度并消除不必要的冗余:

其中cij表示在当前小批量中的所有描述符(p)上计算的相关矩阵的条目。 

 3.构建student网络

训练M≥1个随机初始化的学生网络S,代码中训练了3个,他们具有与教师T相同的网络结构。

L是学生网络loss损失函数,w、h分别为输入图像的宽和高,\mu _{(r,c)}^{S_{i}} 表示第i个学生网络S_{i}在r行c列的输出向量。同理y_{(r,c)}^{T} 表示网络T在r行c列的输出。\mu\sigma分别表示教师网络对所有图像的输出向量的均值和标准差。\left \| ... \right \|_{2}表示求该向量的l2范数。

利用这个loss函数,在无异常图像上训练学生网络,使其能回归教师网络的输出。

 4.计算异常

(1)首先计算学生网络的混合均值\mu _{(r,c)}对教师网络输出向量的回归误差,作为评价异常程度的第一个衡量指标。

M表示学生网络的个数。显然\mu _{(r,c)}= \frac{1}{M}\sum_{i=1}^{M}\mu _{(r,c)}^{S_{i}},即M个学生网络对某一点输出向量的平均值。

学生网络只在无异常图像上训练过,所以在无异常的地方这个回归误差会很小,但在有异常的地方这个回归误差会很大。

(2)异常程度的第二个衡量指标。

由于学生网络在无异常区域被训练过,所以我们假设他们在无异常区域之间的输出差异不大,而在没有训练过的异常区域差距会比较大。从而用以下方式计算出的所谓的“预测不确定性(predictive uncertainty )”得以作为一个异常衡量指标

 在以上介绍过的符号含义这里不再介绍。

二、实验复现日志

想复现一下这个论文中的实验,然后看到了现成的代码,但是在运行代码的过程中还是出现了一些问题,写个简单的日志记录一下,也能帮助像我一样的小白避坑。

0.阅读readme文件,按照文件指引运行项目。在pycharm中的terminal中运行命令。

  1. 执行./mvtec_dataset.sh文件

刚开始运行不了sh文件,后来改了一下设置,(这个git是之前下的,没下过的可以先下好这个)就可以运行了.

Uninformed Students: Student-Teacher Anomaly Detection with Discriminative Latent Embeddings论文复现及解析_第1张图片

在执行 mvtec_dataset.sh文件的时候

在Downloading MVTec dataset...时

遇到./mvtec_dataset.sh: line 40: wget: command not found的问题

原因没有安装wget命令

解决方式;手动下载MVTec dataset放到data文件下面(后来又自己安装上wget命令)

2.执行teacher_training.py时报错

raise RuntimeError('Attempting to deserialize object on a CUDA '

RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False. If you are running on a CPU-only machine, please use torch.load with map_location=torch.device('cpu') to map your storages to the CPU.

尝试在 CUDA设备上反序列化对象时,但是torch.cuda.is_available() is False, 如果您在仅 CPU 的机器上运行,请使用带有 map_location=torch.device('cpu') 的 torch.load 将您的存储映射到 CPU。

解决方式,找到运行中使用到的utils.py文件的torch.load函数加入map_location=torch.device('cpu')参数。

原因应该是我的电脑上没有独显。(说起来这台电脑也够老的,早晚给他换咯)

3.开始训练teacher时发现没有csv文件,之后发现在第一步执行./mvtec_dataset.sh文件时

python3 mvtec_dataset.py $DATASET这句命令没有执行。

解决方法 改为python mvtec_dataset.py $DATASET

Data子目录中每个文件下都有了csv文件但是继续运行提示img下没有img.csv

猜想程序将csv放错了位置

将carpet.csv文件复制一份命名为img.csv放入carpet/img/中

显示 No such file or directory: '../data/carpet/img\\img\\train_good_080.png'

有两层img路径,猜测是程序逻辑出了问题:

 File "G:\1python\myproject\download\student-teacher-anomaly-detection-master\src\AnomalyDataset.py", line 31, in __init__

    self.frame_list = self._get_dataset(self.csv_file, constraint)

 File "G:\1python\myproject\download\student-teacher-anomaly-detection-master\src\resnet18_training.py", line 55, in train

dataset = AnomalyDataset(root_dir=f'../data/{args.dataset}/img',

这两个地方加了两层img,去掉下面一层进行尝试

尝试运行resnet18_training.py成功

打开teacher_training.py找到和resnet18_training.py类似的Load training data的地方

发现dataset = AnomalyDataset(root_dir=f'../data/{args.dataset}',这里并没有带/img,判断应该是resnet18_training.py中多加的/img,去掉就可以正常运行了。

参考文献

[1] Christian Bailer, Tewodros A Habtegebrial, Kiran Varanasi, and Didier Stricker. Fast Dense Feature Extraction with CNNs that have Pooling or Striding Layers. In British Machine Vision Conference (BMVC) , 2017.

你可能感兴趣的:(异常探测,图像处理,python,深度学习,图像处理)