paper地址Uninformed Students: Student-Teacher Anomaly Detection with Discriminative Latent Embeddings
代码地址
GitHub - denguir/student-teacher-anomaly-detection: Student–Teacher Anomaly Detection with Discriminative Latent Embeddingsg
本文分成两部分,论文解析以及实验复现日志。
目录
一、论文解析
1、简介:
2、构建teacher网络
3.构建student网络
4.计算异常
二、实验复现日志
参考文献
这篇论文主要介绍了一个用于异常检测的架构。主要分为构建teacher网络、构建student网络以及计算异常三部分
首先训练一个只使用卷积和最大池化层的网络,将确定大小的图像P嵌入到维数d的度量空间中,通过的确定性的网络变换(该变换如参考文献[1]直接中所述) 实现从到T的转换,转换后的网络T可以实现对整个输入图像的快速密集局部特征提取。
创建一个预训练网络P,代码中采用了ResNet-18网络,先将该网络在数据集上进行训练。
通过将预训练网络P的输出与输出的描述符的解码版本进行匹配,将一个强大的预训练网络P的知识提取到中:
D表示一个全连接网络,它将的d维输出的维度转换,使其和预训练网络P的输出维度相同。
在一小批输入p中最小化描述符之间的相关性,以增加描述符的紧密度并消除不必要的冗余:
其中cij表示在当前小批量中的所有描述符(p)上计算的相关矩阵的条目。
训练M≥1个随机初始化的学生网络S,代码中训练了3个,他们具有与教师T相同的网络结构。
L是学生网络loss损失函数,w、h分别为输入图像的宽和高, 表示第i个学生网络在r行c列的输出向量。同理 表示网络T在r行c列的输出。和分别表示教师网络对所有图像的输出向量的均值和标准差。表示求该向量的l2范数。
利用这个loss函数,在无异常图像上训练学生网络,使其能回归教师网络的输出。
(1)首先计算学生网络的混合均值对教师网络输出向量的回归误差,作为评价异常程度的第一个衡量指标。
M表示学生网络的个数。显然,即M个学生网络对某一点输出向量的平均值。
学生网络只在无异常图像上训练过,所以在无异常的地方这个回归误差会很小,但在有异常的地方这个回归误差会很大。
(2)异常程度的第二个衡量指标。
由于学生网络在无异常区域被训练过,所以我们假设他们在无异常区域之间的输出差异不大,而在没有训练过的异常区域差距会比较大。从而用以下方式计算出的所谓的“预测不确定性(predictive uncertainty )”得以作为一个异常衡量指标
在以上介绍过的符号含义这里不再介绍。
想复现一下这个论文中的实验,然后看到了现成的代码,但是在运行代码的过程中还是出现了一些问题,写个简单的日志记录一下,也能帮助像我一样的小白避坑。
0.阅读readme文件,按照文件指引运行项目。在pycharm中的terminal中运行命令。
刚开始运行不了sh文件,后来改了一下设置,(这个git是之前下的,没下过的可以先下好这个)就可以运行了.
在执行 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,去掉就可以正常运行了。