前言
排名第二(这是papers with code统计的发表在MVTec数据集的论文排名。)
思想:以往采用的记忆库的方式做异常检测都采用预训练网络,CFA也是,但同时也会有针对正常数据集的训练,这样可以避免预训练网络范化性太强带来的偏差。还提出了一种记忆库的制作方法,可拓展到任意大小的记忆库。
耦合超球体的含义可以从这篇论文中理解到,相当于那种电子原子结构,原子是记忆库,电子是训练集或测试集。
迁移学习:ResNet是在大的自然数据集上训练出来的,具备了先验知识,可以提取得到图像的先验特征。就是个预训练网络提取特征,叫迁移学习是做个包装罢了。
文中出现的量按官方给的取,比如张量,CNN的选择等,这样想着能好理解一些。
之前的操作
正常图像数据集经ResNet网络提取特征,形成三个张量[4,64,56,56],[4,128,28,28],[4,256,14,14],每个张量经平均池化,后两个张量再经上采样,三个张量合并后形成张量[4,448,56,56]。
Patch descriptor
构建两个张量xx/yy:[4,1,56,56],内部数值(0~55)如下,yy张量相当于xx的转置。再将内部的每个数值除55乘2减1,合并到张量[4,448,56,56]形成[4,450,56,56]。经卷积形成张量[4,448,56,56],取名为A1。
一个batch为4,可以形成A1,将所有的A1求平均形成张量[1,448,56,56],再转化为张量[448,3136],取名为B1。
上面是源码中的一个方法,原论文还介绍了一种数据库更新方法,也在源码中有体现,但默认没使用。
A1张量转化形状[4,3136,448]后,其中每个值求平方再在维度层面相加形成张量A2[4,3136,1];B1张量每个值求平方再在维度层面相加形成张量B2[1,3136]。A2与B2相乘再乘2(可以想象一下两个矩阵的相乘,相当于每张图的像素值与总体图的像素值乘了一下。)形成张量C1[4,3136,3136],A2与B2相加(以矩阵相乘的形式相加)形成张量C2。
C2-C1形成D1,D1求根号以行为方向每个像素位置处返回最小的K(3)个值(形成超球),通过softmin为这三个值加权,再取第一个值形成张量D2[4,3136,1],形成分数图S[4,1,56,56]。
上面的操作返回6个,选前3个 使用损失函数(Euclidean distance),选后3个使用损失函数(Hard negative features)。
用两个损失函数,一个从圈(超参数r)外让超球逼近r,一个从圈内让超球逼近r,两者结合再利用超参数限制一下,达到训练效果。
在一个像素位置会产生许多超球,这里只是选择最小的三个值构成超球,在这三个值中,任何一个都可能在后三个超球里,这样不就在检测异常区域时使得该区域检测不稳定了,所以加入后三个值的训练使这个模糊的值也限制住(理解的,不一定对...)。
对比实验:在MVTec和RD-MVTec(数据增强后的)数据集上用不同模型做实验。
消融实验:使用不同损失函数/不同的记忆库大小/不同的backbone。
补充
PatchCore/PaDiM/SPADE(采用类似的记忆库的方法。)
问题(请教请教啊,搞不懂--_--)
Patch descriptor 里的维度增加了两个由448到500,那个操作是为了什么呢?