计算机视觉异常检测——PatchCore面向全召回率的工业异常检测

news2024/11/24 15:47:32

1. 概述

异常检测问题在工业图像数据分析中扮演着至关重要的角色,其目的是从大量正常数据中识别出异常行为或模式。这一任务的挑战在于,正常数据的样本相对容易获取,而异常情况却因其稀有性和多样性而难以收集。为了解决这一问题,研究者们开发了多种方法,其中一种备受关注的方法是PatchCore模型。
PatchCore模型是一种先进的工业异常检测方法,它在MVTec数据集上取得了最先进的性能(State of the Art,简称SOTA。这个数据集是工业领域内公认的用于评估异常检测算法的标准数据集,包含了多种不同类别的工业产品图像,既有正常样本也有异常样本。
PatchCore的关键优势在于它的特征提取机制。传统的异常检测方法通常需要大量的标注数据来训练模型,以学习正常和异常图像之间的差异。然而,PatchCore采用了一种不同的策略,它利用了预训练模型(如WideResNet50)来提取图像特征。这种方法的优势在于,预训练模型已经在大型数据集(如ImageNet)上学习了丰富的视觉特征,因此可以直接应用于新的任务,而无需进行额外的特征提取训练。

源码地址:https://github.com/amazon-science/patchcore-inspection
论文地址:https://arxiv.org/abs/2106.08265

在这里插入图片描述

2. 算法实现

2.1 整体模型

PatchCore模型在工业异常检测领域中的一项重要创新是其能够评估图像中每个像素的异常程度。这种细致的异常评分机制不仅使得模型能够判断整个图像是否异常,还能够精确地定位到异常发生的具体区域。

在PatchCore模型中,首先会构建一个内存库(Memory Bank),该内存库包含了正常图像的特征向量。这些特征向量是通过预训练的神经网络模型从正常图像中提取出来的,它们有效地捕捉了正常样本的视觉特征。在模型训练阶段,PatchCore仅使用正常图像来构建这个内存库,不涉及任何异常样本。

当有新的测试图像进入模型时,PatchCore会从这些图像中提取特征向量,并与内存库中存储的正常特征向量进行比较。通过计算测试图像特征向量与内存库中最接近的特征向量之间的距离,模型可以评估测试图像的异常程度。这个距离越小,表明测试图像与正常样本越相似,越可能是正常图像;反之,距离越大,表明测试图像与正常样本的差异越显著,越可能是异常图像。

上图的左侧(蓝色虚线框)显示的是学习,右侧(绿色虚线框)显示的是推理流程。

在训练过程中,首先将正常图像通过一个预训练的卷积神经网络(CNN)模型,这个模型负责提取每个斑块的特征向量。这里的CNN模型可以是如WideResNet50这类在大型数据集上预训练过的网络,它们已经具备了强大的特征提取能力。接着,从这些特征向量中进行采样,选择最具代表性的一部分特征向量,将它们存储在记忆库中。

推理(Inference)阶段是PatchCore模型进行异常检测的关键时期。在这一阶段,新的测试图像同样通过训练有素的CNN模型来提取每个斑块的特征向量。这些特征向量代表了测试图像中每个斑块的视觉内容。

随后,模型会计算测试图像中每个斑块的特征向量与记忆库中存储的正常特征向量之间的距离。这个距离可以被视为异常程度的度量:距离越大,表明测试图像中的斑块与正常样本的差异越大,因此越可能是异常的。通过这种方式,模型能够评估整个图像的异常情况,并且能够对每个像素进行异常评分,从而精确地定位到异常区域。

2.2 局部感知

在PatchCore模型中,局部感知的补丁特征是通过从图像中提取逐个补丁的特征向量来实现的。这一过程首先利用了一个已经在ImageNet数据集上完成训练的卷积神经网络(CNN)模型。该模型在此任务中的作用是提取图像特征,而不是进行进一步的训练或调整。

随后,从预训练的CNN模型中得到的特征向量会经过自适应平均池化处理,这一步骤确保了不同尺寸的输入图像能够产生具有一致维度的特征向量,为后续的异常检测工作奠定了基础。
在这里插入图片描述
在选择合适的CNN模型层级来提取特征向量时,最后一层虽然提供了高度聚合和高抽象度的特征向量,但存在两个主要问题。首先,深层特征由于经过多次卷积和池化操作,分辨率较低,可能导致局部细节特征的丢失。其次,最后一层的特征向量可能受到原始训练任务——如ImageNet分类问题——的影响,从而在不同领域的异常检测任务中表现出偏差。

鉴于这些问题,本文提出了使用模型中间层的特征向量进行异常检测的方法。这样做可以在保持较高抽象水平的同时,减少预训练任务对特征向量的影响。实验结果表明,使用中间层特征向量的方法在异常检测任务中取得了很好的效果。

根据实验数据,特征向量的提取层级与异常检测任务的准确性之间存在一定的关系。图表显示,当使用模型的第二层(横轴表示层级编号,数字越小代表层级越浅)时,检测准确率非常高。这一结果证实了PatchCore模型确实从第二和第三层(即2+3)提取了特征向量【3】,这表明在保持特征的局部细节和减少预训练任务影响之间找到了一个平衡点。

2.3 补丁特征记忆库

其次是补丁特征记忆库(Coreset-reduced patch-feature memory bank),这部分是将得到的特征向量存储在Memory Bank中。随着训练数据数量的增加,更多的数据需要存储在记忆库中,这增加了评估测试数据所需的推理时间,并增加了存储的内存容量。因此,本文提出使用Coreset Sampling对得到的特征向量进行采样,并将其存储在Memory Bank中。

采样方法表示如下:其中M是采样前的特征向量集,MC是采样后的特征向量集。


上述公式意味着,进行抽样时,要使预抽样的特征向量(m)和后抽样的特征向量中的最大最小距离最小。

然而,这个优化问题是NP-hard,需要大量的计算时间来获得最优解。因此,在本文中,采用了以下两种创新方法,以更快地获得一个接近最优的解决方案。

  1. 贪婪法的逼近:以前的研究中使用的方法已经被采纳。
  2. 通过随机投影降低维度:降低特征向量的维度可以降低上述优化问题的计算复杂度,其依据是Johnson-Lindenstrauss补码,即降维可以实现良好的准确性。

下图将Coreset Sampling应用于虚拟数据,并将结果可视化。

下表比较了随机抽样和Coreset抽样在两个虚拟数据集(a)和(b)上的结果,其中Coverage代表从原始抽样数据中减少的百分比。可以看出,上面的Coreset采样比下面的随机采样更有效率。

下图还显示了每种维度压缩方法在异常检测任务中的还原率(横轴)和准确性(纵轴)之间的关系。

上图显示,在随机的情况下,当减少率达到约10-2时,准确率明显下降,而在Coreset(抽样)的情况下,准确率并没有下降那么多。因此,可以说Coreset Sampling是一种有效的抽样方法,可以减少数据的数量,同时保留异常检测所需的特征。

最后,到目前为止描述的存储库的整个算法显示如下:

2.4 用PatchCore进行异常检测。

第三种是用PatchCore进行异常检测,它使用获得的记忆库来计算要判别的图像(测试数据)的异常程度。最初,和训练时一样,测试数据图像通过训练好的CNN模型来获得每个补丁的特征向量。根据以下公式,异常情况是由每块测试数据的特征向量(mtest)和存储在记忆库中的特征向量(m)计算出来的。

3.实验

3.1 实验装置

本文在三个不同的数据集上测试了所提方法的有效性。
第一个是MVTec数据集。它被广泛用作基准,有15个类别,包括瓶子、电缆和电网。这个数据集是本研究的主要重点。
第二个是磁砖缺陷(MTD)数据集。其任务是检测瓷片图像中的裂纹和划痕。
第三个是迷你上海科技园区(mSTC)数据集[4],它由12个不同场景的行人视频组成,任务是检测异常行为,如打架或骑自行车。

3.2 估值指数

接收者操作曲线下的面积(AUROC)被用来作为区分正常和异常图像的性能指标。按像素计算的AUROC(pixelwise AUROC)和PRO被用作检测适当异常的性能指标,其中PRO对异常的大小不太敏感。

3.3 结果

我们从MVTec数据集的结果开始。
下表显示了在AUROC中与传统方法的比较结果。

此外,下表显示了按像素计算的AUROC的结果。

对于PatchCore,分别以25%、10%和1%来改变存储库的子采样,结果显示PatchCore对于AUROC和像素AUROC都更准确。还可以看出,当存储库中的子采样百分比降低时,准确度并没有下降很多。

mSTC和MTD的结果显示在下表中。这些数据集的结果也超过了传统方法的准确性。

3.4 推理时间

下表显示了每种方法在MVTec数据集上的准确性(AUROC、像素AUROC和PRO)和推理时间。

从PatchCore的结果,可以看出,推理时间因Coreset Sampling的百分比不同而有很大差异。特别是在1%的情况下,推理时间与100%的推理时间相差不大,这表明在保持比传统方法更高的精度的同时实现了快速推理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1591631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++类和对象】上篇

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

MDK平台 - Code, RO-data , RW-data, ZI-data详解

文章目录 1 . 前言2 . Code, RO-data , RW-data, ZI-data解析3 . RAM上电复位4 . 细节扩展5 . 总结 【全文大纲】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 1 . 前言 MDK编译后,会列出Code, RO-data , RW-data, ZI-data,以下解析…

YOLO-World: Real-Time Open-Vocabulary Object Detection 简介+安装+运行+训练(持续更新)

前言 YOLO_WORLD太牛了!!众所周知,传统是视觉目标检测一旦训练好后,如果我们需要增加新的识别目标的话,必须得重新训练模型。在生产中如果经常要新增检测目标,对时效性影响很大,而且随着数据量…

【前端面试3+1】12 toktn验证过程、面向对象特性、webpack和vite的区别、【字符串中的第一个唯一字符】

一、token验证过程 用户登录:用户提供用户名和密码进行登录。服务器验证:服务器接收到用户提供的用户名和密码,进行验证。生成token:如果用户名和密码验证通过,服务器会生成一个token,通常包含一些加密的信…

代码随想录阅读笔记-回溯【复原IP地址】

题目 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。 有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 . 分隔。 例如:"0.1.2.201…

最新AI模型与Python技术处理和分析气候数据:ChatGPT在大气科学领域建模、数据分析、可视化与资源评估中的高效应用及论文写作

本文深度探讨人工智能在大气科学中的应用,特别是如何结合最新AI模型与Python技术处理和分析气候数据。课程介绍包括GPT-4等先进AI工具,旨在帮助大家掌握这些工具的功能及应用范围。课程内容覆盖使用GPT处理数据、生成论文摘要、文献综述、技术方法分析等…

力扣2923、2924.找到冠军I、II---(简单题、中等题、Java、拓扑排序)

目录 一、找到冠军I 思路描述: 代码: 二、找到冠军II 思路描述: 代码: 一、找到冠军I 一场比赛中共有 n 支队伍,按从 0 到 n - 1 编号。 给你一个下标从 0 开始、大小为 n * n 的二维布尔矩阵 grid 。对于满足…

DNF手游攻略:2024新手攻略大全

在《DNF手游》的世界中,前期阶段对于新手玩家来说至关重要。以下是一份综合整理的新手攻略,帮助玩家快速适应游戏并取得进展。 1. 角色建立策略: 在前期,建议玩家建立3个角色,包括1个大号和2个小号。大号可以根据个人喜…

从电子病历(EMRs)构建医学知识图谱

从电子病历 EMRs 构建医学知识图谱 提出背景传统的三元组结构本研究采用的四元组结构第四元作用第四元类型以往的方法本研究的方法 大威天龙八 论文:Real-world data medical knowledge graph: construction and applications 提出背景 本研究在中国一家三甲医院的…

【GD32】MQ-5液化气检测传感器

2.33 MQ-5液化气检测传感器 MQ-5气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(Sno2)。当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为该气体浓度相对应的输出信号。…

ExpressLRS硬件实测性能分析

ExpressLRS硬件实测性能分析 1. 源由2. 远航测试3. 实验室测试3.1 芯片RSSI与实测功率差异3.2 SNR信噪比稳定3.3 140db衰减器衰减,40个频点信号稳定 4. 外场测试4.1 无屏蔽样品4.2 有屏蔽样品4.3 有屏蔽vs无屏蔽样品 5. 估算6. 总结7. 补充说明 -- 50mW视频 1. 源由…

1.3 字符设备驱动

1、字符设备驱动工作原理 2、file_operations结构体 struct file_operations { struct module *owner; //拥有该结构的模块的指针,一般为THIS_MODULES loff_t (*llseek) (struct file *, lof…

【日常记录】【CSS】生成动态气泡小球

文章目录 1、分析2、实现 1、分析 核心有两点&#xff0c;通过这两个不一样就可以实现每个小球的颜色、动画时间不一致 给每个元素都设置一个css 变量 bgc 用于控制每一个小球的颜色给每个元素都设置一个css 变量 duration 用于控制每一个小球的时间 2、实现 <!DOCTYPE ht…

java中的线程通讯和线程池,Callable任务

线程通讯&#xff1a; 在多线程中&#xff0c;某个线程进入“等待状态”时&#xff0c;需要某个线程来唤醒 等待方法&#xff1a; wait()//无线等待 wait(long 毫秒)//计时等待 注意&#xff0c;调用wait方法&#xff0c;会自动释放掉锁资源 处于wait状态只能由其他线程唤醒 唤…

信创产品适配的前因后果

“信创”的本意是指“信息技术应用创新”。这个概念最早来源于“信创工委会”&#xff08;信息技术应用创新工作委员会&#xff09;&#xff0c;一个由24家专业从事软硬件关键技术研究及应用的国内单位&#xff0c;在2016年共同发起成立的非营利性社会组织。近些年来&#xff0…

GitHub repository - commits - branches - releases - contributors

GitHub repository - commits - branches - releases - contributors 1. commits2. branches3. releases4. contributorsReferences 1. commits 在这里可以查看当前分支的提交历史。左侧的数字表示提交数。 2. branches 可以查看仓库的分支列表。左侧的数字表示当前拥有的分…

android studio 网络请求okhttp3、okgo

一、在build.gradle文件里添加 implementation com.squareup.okhttp3:okhttp:4.9.0 implementation com.squareup.okhttp3:okhttp:3.12.0 implementation com.squareup.okio:okio:1.17.4 implementation com.lzy.net:okgo:3.0.4 implementation com.alibaba:fastjson:1.2.57 i…

25、链表-环形链表

思路&#xff1a; 这道题就是判断链表中是否有环&#xff0c;首先使用集合肯定可以快速地解决&#xff0c;比如通过一个set集合遍历&#xff0c;如果遍历过程中有节点在set中已经存在那么说明存在环。 第二种方式就是通过快慢指针方式寻找环。具体思路就是一个慢指针每次直走一…

Android适配平板屏幕尺寸

一、划分手机和平板 人为判断方法: 大于6英寸的就是平板。小于6英寸的都是手机 平板尺寸&#xff1a; 6英寸、7英寸、10英寸、14英寸… Android系统支持多配置资源文件&#xff0c;我们可以追加新的资源目录到你的Android项目中。命名规范&#xff1a; 资源名字-限制符 l…

2024年MathorCup数学建模B题甲骨文智能识别中原始拓片单字自动分割与识别研究解题文档与程序

2024年第十四届MathorCup高校数学建模挑战赛 B题 甲骨文智能识别中原始拓片单字自动分割与识别研究 原题再现&#xff1a; 甲骨文是我国目前已知的最早成熟的文字系统&#xff0c;它是一种刻在龟甲或兽骨上的古老文字。甲骨文具有极其重要的研究价值&#xff0c;不仅对中国文…