首页 > 编程语言 >无监督异常检测算法

无监督异常检测算法

时间:2024-10-31 10:34:44浏览次数:1  
标签:CoreSet PatchCore 特征 检测 监督 patch 算法 图像 异常

1、概述

  无监督异常检测方法有重建类、特征类、流模型和教师学生网络这几种,之前了解过重建模型,重建模型大多采用VAE+Diffusion+Transformer类模型,对缺陷特征进行创建,本次总结主要分析特征类的鼻祖模型PatchCore,并找到其论文和源码,了解其工作原理的一些细节。

  图1描述了PatchCore模型的原理,出自论文《Towards Total Recall in Industrial Anomaly Detection》,也是网上介绍PatchCore原理文章中,引用率最高的一幅图。

图1 PatchCore模型原理

       PatchCore的核心思想是把一幅图像切分为一系列的小块(patch),然后根据一定的计算规则,计算出每个patch的异常值(可以理解为偏离正常图像的程度,偏离越大,异常值越大),然后对每个patch的异常值进行bilinear插值,便可得到原图像每个像素点的异常值,再根据对异常值设定的域值,超过该域值的像素点,便认为是异常点,最终便可得到所有异常像素点。

  PatchCore需要提前预处理某场景正样本,便可对某场景的异常值进行检测,换句话说,PatchCore只支持对已知场景进行异常检测,如果输入未知场景的图像,检测效果是未知的,一般效果不会太好,因为PatchCore的原理是学习场景的正样本,然后拿负样本和正样本进行比对,从而找出正负样本不一样的地方,所以如果输入未知场景的负样本,由于没有对应场景的正样本,模型自然也无法知道图像的哪些地方是异常部分。

  图2是两个数据异常点分布的样例,非常形象地展示了PatchCore的原理, PatchCore就是把图像中所有像素点的偏离值找出来,偏离值大的便是异常点,绘制为拆线图后,便是图2中展示的图形那样。

图2 数据异常点分布示例

 

2、PatchCore原理

   PatchCore包含训练和推理两个阶段,下面分别对训练和推理进行叙述。

2.1 PatchCore训练框架

  图3为论文中展示的PatchCore训练框架,大体流程为图像先经由Pretrained Encoder进行特征提取,然后PatchCore对Encoder产生的特征层序列,掐头去尾并提取中间特征层,PatchCore将中间特征层通过特征聚合操作融合在一起,以输入原图224*224为例,会输出一张28*28的patch图像,共计28*28=784个patch向量,出于计算效率和存储空间的考虑,PatchCore会从784个patch向量中,提取出若干能代表该图像的特征patch向量,构成 coreset,并存入Memory bank,一种内存向量数据库,至此训练阶段的主流程就走完了。

图3 PatchCore训练框架

2.1.1 Pretrained Encoder

  Pretrained Encoder是一种预训练模型,通常作为backbone,以辅助PatchCore提取图像特征,可以作为Pretrained Encoder的模型有很多,比如Vgg、Resnet、EfficientNet等都可以,也可以是自定义的模型,只要效果OK就行。

  图4为PatchCore特征融合功能流程示意图,1张224*224的图像经由Backbone/Encoder一系列提取特征的操作后,会生成若干层的特征图,PatchCore丢弃第1层和最后一层的特征图,只保留中间若干特征层,因为第1层这类浅层特征层,提取的特征太过局部且通用,而最后一层这类深层特征,又太过倾向于ImageNet数据集特征,非常不通用,而中间特征层感受野大小适中且特征知识也比较通用,所以PatchCore只保留中间特征层作为Patch产生的来源。

  之后,PatchCore会对挑选出的若干中间层进行Patch化,每一个特征层Patch化的过程,也是特征融合的过程。

图4 PatchCore特征融合

  特征融合体现在2个层面上,第1个层面是特征图内部的特征融合,第2个层面是特征层间的特征融合,且第2个层面的特征融合,是基于第1个层面特征融合的结果上,做了进一步高层抽象的信息融合。

  • 特征图内的特征融合

  图5描述了特征层内特征融合的完整流程,一张28*28*512的特征图,会经由kernel size为3*3的unfold核逐一抽取[3, 3, 512]区域内的特征,然后flatten为3*3*512的向量,3*3*512的向量进一步做AdaptiveAvgPool的均值化操作,从而将[3, 3, 512]区域内的特征融合为一个3*3*output_dim的向量,最后对3*3*output_dim向量进行fold操作,还原回28*28中的一个特征点,该特征点的深度为output_dim。

图5 特征层内特征融合全景图

  • 特征层间的特征融合

   图6描述了特征层间特征融合流程,更深层的中间层,先双向线性插值对齐第一个中间层的尺寸,然后各特征层经concat结合为一个特征层,该特征层再经由AdaptiveAvgPool对所有特征层进行融合,即得到patch特征的最终表达。

图6 特征层间特征融合

 2.1.2 CoreSet降采样

  由2.1.1节得到的原始patch特征,其数量是非常多的,由于PatchCore采用KNN算法对图象patch块进行比对,其计算效率其实是非常低下的,虽然PatchCore采用了三方工具Faiss实现的KNN功能及向量匹配工具。

       为了提高计算效率和减轻存储负担,PatchCore提出了CoreSet思想,简单说就是从原始的patch特征向量集中,挑选出一定比例(作为超参数)的patch特征向量,用这些挑选出来的部分patch特征向量,代表原来的patch特征向量全集,从而提高了计算效率。

       图7展示了均匀分布数据下的CoreSet效果,可见CoreSet均匀分布在整个数据集空间中,贪心算法产生的CoreSet比随机采样效果更好,所谓的贪心即图8中算法流程的min、max操作。

图7 均匀分布数据下的CoreSet效果(红点为CoreSet,蓝点为原始数据集)

       图8描述了CoreSet的生成规则,算法中,M代表内存银行,也就是向量数据库,其一开始存储了所有的patch特征向量,Mc代表CoreSet,算法的大致思想:在寻找新的核心集patch特征向量时,先计算M中所有patch特征向量与Mc中所有向量的Euclidean距离,然后在M中每个点到Mc所有距离中,挑选Euclidean距离最小的,再然后对M中每个点到Mc最小距离中,又再挑选出最小距离最大的,其对应的patch特征向量,即为选入CoreSet的patch向量。

  

图8 CoreSet生成规则

       PatchCore计算Euclidean距离的方法有点意思,直接采用公式a2-2ab+b2的矩阵版本,如图9所示。

      

图9 计算Euclidean距离代码

 2.1.3 Memory Bank

  Memory Bank字面意思是内存银行,从PatchCore设计思想和代码来看,Memory Bank更像是一种数据库,或者向量数据库,PatchCore采用三方库Faiss提供的Memory Bank及向量检索功能。

       2.1.2小节产生的CoreSet(核心集),需持久化保存到Memory Bank,以供测试阶段使用,用于提供正样本的比较基准,让PatchCore知道测试样本距离正样本的偏离值有多大,如果太大,则存在异常点。

       至此,训练阶段的主要概念就介绍完了。

2.2 PatchCore测试框架

  图10描述了PatchCore测试框架的主要流程,一幅测试图像进来,经由Encoder提取出其patch特征后,经由faiss的KNN搜索功能后,找到每个patch与其距离最近的Memory Bank中的点,该距离作为每个patch的异常值,这些patch异常值中的最大者,即Image Level的异常值,如果异常值超过一定范围,说明图像中真的有异常,然后可通过segment操作,基于patch异常值,做bilinear插值,得到一张和原图尺寸一样的异常分布图像,对该异常分布图像进行域值处理,便可得到分割异常的mask图像。

  

图10 PatchCore测试框架

2.2.1 Image Level异常值

  图12为PatchCore推理流程较详细的示例,图像经由Encoder提取特征、特征聚合后,形成形如图11所示的图像Patches,Patch化的步骤也叫作Embedding,比如将[3, 3, 512]区域的特征映射到图11左侧所示的Patches矩阵,方格深度为1024。

图11 图像Patch化示例

       之后将图11的patches与Memory Bank中的向量进行KNN比对,以patch最近的邻居的Euclidean距离作为patch的异常值,便得到每个patch的异常值,所有patch异常值中的最大者,即为Image Level的异常值,图11右侧Patches异常值矩阵,其Image Level的异常值为9.3。

2.2.2 获取异常mask  

  计算得到测试图片的异常值矩阵后,便可依据异常值矩阵,进行bilinear插值,将矩阵尺寸还原为测试图片的尺寸,从而得到测试图片每一个像素点的异常值,对异常值做过滤处理,便可得到异常mask,完整流程可参照图12所示。

图12 PatchCore推理流程示例

3、特征类异常检测的其他框架

3.1 CFA

  CFA在PatchCore的基础上,做了进一步的优化,它认为PatchCore使用Encoder提取的中间层特征,富含Encoder训练数据的特征,但这些数据特征对工业领域还不是非常合适,需要使这些特征在工业数据上做一定的适配训练,使其更适合工业领域的特征提取,这就是域迁移的思想,即图13中的Patch descriptor模块的功能。

  

图13 CFA框架

4、总结

  异常检测类算法发展到现在,包含重建类、特征类、教师学生蒸馏等方式,特征类算法可以凭借少量具有代表性的正样本的学习,即可对负样本中的所有缺陷做召回,是一种非常值得借鉴的一种思想,在实际使用时,需注意训练样本的采样,采样需尽量覆盖任务的所有场景。

 

关注更多安卓开发、AI技术、股票分析技术及个股诊断等理财、生活分享等资讯信息,请关注本人公众号(木圭龙的知识小屋)

 

标签:CoreSet,PatchCore,特征,检测,监督,patch,算法,图像,异常
From: https://www.cnblogs.com/tgltt/p/18517081

相关文章

  • 写分布式机器学习算法,哪种编程接口比较好
    写分布式机器学习算法,比较好的编程接口:1、Python;2、ApacheSpark;3、ApacheFlink;4、ApacheHadoop;5、TensorFlow。其中,Python是一种通用编程语言,广泛用于数据科学和机器学习领域。1、PythonPython是一种通用编程语言,广泛用于数据科学和机器学习领域。它具有简单易学、可读性......
  • 骑电动车戴头盔智能检测识别系统
    骑电动车戴头盔智能检测识别系统利用AI人工智能机器视觉分析识别技术,骑电动车戴头盔智能检测识别系统通过路口网络摄像头采集的视频,系统使用AI算法进行分析,准确识别出骑行者的安全隐患行为,如农用车载人、三轮车载人、三轮车不戴头盔、电瓶车不戴头盔、摩托车不戴头盔、电瓶车载人/......
  • 基于深度学习的舆论分析与检测系统应用与研究
    【1】系统介绍研究背景随着互联网技术的迅猛发展和社会媒体平台的普及,信息传播的速度和范围达到了前所未有的水平。这一变化不仅极大地丰富了人们的社交生活,也为社会科学研究提供了新的视角和工具。舆论分析作为社会科学研究的一个重要分支,其目的是通过收集和分析网络上的......
  • 2024_10_30_2_hyperNeat进化神经网络算法
    原文地址:HyperNEATExplained:AdvancingNeuroevolutionExpandingNeuroEvolutionLastweek,IwroteanarticleaboutNEAT(NeuroEvolutionofAugmentingTopologies)andwediscussedalotofthecoolthingsthatsurroundedthealgorithm.Wealsobrieflytouc......
  • yolov8+多算法多目标追踪+实例分割+目标检测+姿态估计(代码+教程)
    #多目标追踪+实例分割+目标检测YOLO(YouOnlyLookOnce)是一个流行的目标检测算法,它能够在图像中准确地定位和识别多个物体。在这里插入图片描述本项目是基于YOLO算法的目标跟踪系统,它将YOLO的目标检测功能与目标跟踪技术相结合,实现了实时的多目标跟踪。在目标......
  • 自动驾驶热成像物体检测- YOLOv9 - YOLOv8 - YOLOv5 - YOLOv7
    标签-物体检测filadataset-模型在这里插入图片描述类别(4)-自行车-汽车-狗-人在这里插入图片描述度量指标-平均精度均值(mAP):88.8%-准确率(Precision):92.0%-召回率(Recall):78.9%尝试此模型-上传一张图片或者从您的设备中选择在这里插......
  • 代码随想录算法训练营day31| 56. 合并区间 738.单调递增的数字
    学习资料:https://programmercarl.com/0056.合并区间.html#算法公开课贪心PART5over学习记录:56.合并区间(也是找重叠区间,但是是跟result[-1]比,只用比右边界;更新result[-1][1]为更大值)点击查看代码classSolution(object):defmerge(self,intervals):"""......
  • 代码随想录算法训练营第十二天| 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大
    226.翻转二叉树题目链接:.-力扣(LeetCode)文章讲解:代码随想录视频讲解:听说一位巨佬面Google被拒了,因为没写出翻转二叉树|LeetCode:226.翻转二叉树_哔哩哔哩_bilibili《代码随想录》算法公开课开讲啦!快来打卡!本期视频的文字讲解版在「代码随想录」刷题网站:programmercarl.com......
  • 代码随想录算法训练营第十三天| 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子
    110.平衡二叉树题目链接:.-力扣(LeetCode)文章链接:代码随想录视频链接:后序遍历求高度,高度判断是否平衡|LeetCode:110.平衡二叉树_哔哩哔哩_bilibili《代码随想录》算法公开课开讲啦!快来打卡!本期视频的文字讲解版在「代码随想录」刷题网站:programmercarl.com,这里刷题顺序,详......
  • 《算法导论》Ch.4_学习笔记
    <分治策略>分治策略三步骤:分解:将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小。解决:递归地求解出子问题,如果子问题地规模足够小,则停止递归,直接求解。合并:将子问题地解组合成原问题地解。递归情况:子问题足够大,需要递归求解。基本情况:子问题足够小,不再需要递归......