赞
踩
使用PaDiM网络跑自己的数据集,除去测试时读入dataloader的时间,每张图片测试时间在20-30ms,精度比较高,图像分类准确率99-100,像素分割准确率97以上,但是最大的问题是需要通过分割好的label来确定阈值选取(这一点必定要改过来)。以下为配合论文和代码的理解:
将数据集加载到Dataloader中(数据集代码不做解释)
创建字典,用来保存eff网络中每一层所提取的特征
如果没保存pkl文件,开始训练
tqdm显示读入图片的进度条,feats代表从eff网络中提取的三层特征,下图为feats中的数据:
for循环内的二次for循环:在tqdm的for循环中,每一次代表一轮batch(文章设置batchsize=32),每一轮读取32张图片,k代表layer1、layer2、layer3,v代表对应层数据,feats为从网络中提取到的每层数据。
此时一个batch的for循环结束,每层特征都被存储到了相应list中,重复将每个batch提取完,就组成了所有图像的三个不同层特征的集合。
进行下一步
之前的集合都是list,数据需要交给torch就要先转换为tensor(里面的数据没变化,只是格式变了)
进行特征拼接,这里是官方自己写的拼接函数:
将所有特征拼接到一起,并将size统一设置为56×56,也就是第一层网络的输出大小,对应到论文里:
这里注意:每一张图片的三层特征拼接为一个特征向量,N张图片对应的是N个特征向量。
拼接完后:
B为图片数量,C为通道数,H和W表示特征图大小
对于通道的理解:卷积网络中的通道(Channel)和特征图 - 韩昊 - 博客园
拼接完后的特征向量需要进行多维高斯分布,文章通过均值和协方差实现对应的论文内容如下:
因为要求每个像素点的位置,需要改下张量格式
求协方差逆矩阵:
mean为[248,3136]
cov_inv为[248,248,3136]
[:,:,i]表示第一维全选,第二维全选,第三维选取第i列,文章通过添加正则项I来保证协方差矩阵是满秩且可逆的,完成后每个像素位置上都有了一个多维高斯分布,矩阵格式为:
文章协方差还在对角线上加了小操作,使协方差矩阵能够满秩且可逆。协方差还使得不同维度的特征关联起来,实验证明这种关联的信息有助于检测效果。
以上便是训练需要做的事
测试:
与训练一样,导入进网络提取出对应层特征
引入训练时创建的mean和cov_inv
计算马氏距离:
注意:python中有一个distance包里面含有马氏距离计算函数,但是不要用!不要用!不要用!计算时间超级长,强烈建议自己写一个或者去git一个
delta是,cov_inv为协方差逆矩阵,这一步完成后每个像素点与训练中的每个特征对应的马氏距离就全部算出来了,存储在dist_list中
进行矩阵转置并恢复56×56格式
进行上采样到224×224,恢复输入图像时大小:
此时任意查看某一张图片中的score分布:
进行高斯滤波:
归一化:
选取最高得分和最低得分,对所有图像,所有像素得分进行归一化处理
没有归一化之前,某个像素点得分:
归一化之后:
计算图像级检测得分:
只选取score中第一维(图像级)的得分情况(选取每张图片的最高得分)
马氏距离越近(数越小),样本之间的相似度越高
马氏距离结果越大表示的两样本矩阵的相似度越小么?马氏距离的几何意义是什么?_百度知道
事先标注好的图像分类标签:(好的为0,坏的为1)
通过混淆矩阵计算真阳率和假阳率
利用一幅图像中数值最大的马氏距离作为评分(评分越高说明越有可能异常),判断图像是否存在异常
这里的fpr、tpr和img_thresholds个数都为6,表示测试图像共有6个类别
根据标签与预测匹配程度计算准确率:
计算使得tpr和fpr均衡(距离最小)的值:
机器学习 - 模型评估(TPR、FPR、K1、ROC、AUC、KS、GAIN、LIFT、GINI、KSI)_JeffyBeh的博客-CSDN博客_机器学习ks
最好的情况是tpr=1,fpr=0
np.argmin选取最小值的索引,定位到thresholds里
计算像素点之间的查准率和召回率:
三个参数个数:
threshold表示每个像素的阈值
计算F1分数
机器学习分类问题指标评估内容详解(准确率、精准率、召回率、F1、ROC、AUC等)_Emins的博客-CSDN博客_准确率召回率f1分数
查准率表示误检,召回率表示漏检,在实验中需要保证二者比例平衡
取使得F1最大的索引对应的threshold,F1分数置于[0,1]间,越接近1是越好的,没有例外。
参考:
论文阅读 -- PaDiM: a Patch Distribution Modeling Framework for Anomaly Detection and Localization_团长sama的博客-CSDN博客_padim PaDiM【异常检测:Embedding-based】_太简单了的博客-CSDN博客_padim 异常检测
如何更好的确定阈值?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。