草庐IT

无监督异常检测(MVTec)

视觉菜鸟Leonardo 2023-04-07 原文

(排名第1)Towards Total Recall in Industrial Anomaly Detection (PatchCore)

面向工业异常检测的全召回

MVTec AD数据集上排名第一,检测准确率为99.1%,分割准确率为98.1%

        缺陷检测是工业制造中的关键组成部分,最主要的解决方法是仅使用无缺陷的示例图像来拟合模型。将ImageNet模型的嵌入与异常值检测模型相结合。提出了PathCore,使用了名义补丁特征的内存库。在MVTecAD上,AUROC得分99.6%。        

        1.引言

        应用“cold-start”异常检测,工业缺陷很可能从细微的变化到较大的结构缺陷,现有的异常检测主要依赖于自编码器模型、GAN和其他无监督适应方法
 

 MVTec 基准数据集的示例。叠加在图像上的是来自 PatchCore 的分割结果。橙色边界表示实际分割图的异常轮廓,例如碎玻璃、划痕、烧伤或蓝橙色渐变中的结构变化。

         本文执行步骤:

(1)最大化测试时可用的标称信息

(2)减少对ImageNet类的偏差

(3)保持高推理速度,将PathCore作为一种有效的补救措施

        一旦单个补丁异常,图像就会被归类为异常,PatchCore 通过利用本地聚合的中级特征补丁来实现这一点。

注:标称数据:一般在有限的数据中取,而且只存在‘是’和‘否’两种不同的结果(一般用于分类)

 数值数据:连续值。可以从无限的数值集合中取值,如:0.1、45.5 等(主要用于回归)

        为了更好的估计标称特征分布:基于高斯混合模型的扩展 、生成对抗训练目标、对预定义物理增强的不变性 、隐藏特征对重新引入重建的鲁棒性、原型记忆库 、注意力引导 、结构目标或受限表示空间 

PatchCore 变得不那么依赖图像对齐,同时还使用更大的标称上下文来估计异常,利用局部感知的补丁特征分数来解释局部空间方差并减少对ImageNet类的偏差。

文章对PatchCore的介绍分为三部分:

(1)聚合到内存库中的局部补丁特征

(2)提高效率的核心集缩减方法

(3)到达检测和定位的完整算法决定

         Xn为正常图像集合, yx ∈ {0, 1} 表示x是正常还是异常,Xt为测试时的样本集,PatchCore继续使用在ImageNet上与训练的网络φ,因为存在着特定网络结构中的特征起着重要作用,使用 φi,j = φj(xi) 表示图像 xi ∈ X(第几张图片)和预训练网络 φ 的层次级别 j (网络中的第几层)的特征,继续使用ResNet。

        使用中间部分的补丁(像素)级特征的记忆库M,利用上下文信息,避免特征过于通用或者过于偏向ImageNet,

        文章使用核心集子采样机制来减少内存消耗,

有关无监督异常检测(MVTec)的更多相关文章

  1. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  2. ruby-on-rails - Rails - 乐观锁定总是触发 StaleObjectError 异常 - 2

    我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd

  3. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  4. ruby - 在 Ruby 中重新分配常量时抛出异常? - 2

    我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案

  5. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  6. ruby - 如何捕获 ruby​​ 中的所有异常? - 2

    我们如何捕获或/和处理ruby​​中所有未处理的异常?例如,这样做的动机可能是将某种异常记录到不同的文件或发送电子邮件给系统管理。在Java中我们会做Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandlerex);在Node.js中process.on('uncaughtException',function(error){/*code*/});在PHP中register_shutdown_function('errorHandler');functionerrorHandler(){$error=error_

  7. ruby - Sinatra 中的全局救援和日志记录异常 - 2

    如何在出现异常时指定全局救援,如果您将Sinatra用于API或应用程序,您将如何处理日志记录? 最佳答案 404可以在not_found方法的帮助下处理,例如:not_founddo'Sitedoesnotexist.'end500s可以通过调用带有block的错误方法来处理,例如:errordo"Applicationerror.Plstrylater."end错误的详细信息可以通过request.env中的sinatra.error访问,如下所示:errordo'Anerroroccured:'+request.env['si

  8. ruby - 检测由 RSpec、Ruby 运行的代码 - 2

    我想知道我的代码是否在rspec下运行。这可能吗?原因是我正在加载一些错误记录器,这些记录器在测试期间会被故意错误(expect{x}.toraise_error)弄得乱七八糟。我查看了我的ENV变量,没有(明显的)测试环境变量的迹象。 最佳答案 在spec_helper.rb的开头添加:ENV['RACK_ENV']='test'现在您可以在代码中检查RACK_ENV是否经过测试。 关于ruby-检测由RSpec、Ruby运行的代码,我们在StackOverflow上找到一个类似的问题

  9. ruby - 使用 Ruby Daemons gem 检测停止 - 2

    我正在使用rubydaemongem。想知道如何向停止操作添加一些额外的步骤?希望我能检测到停止被调用,并向其添加一些额外的代码。任何人都知道我如何才能做到这一点? 最佳答案 查看守护程序gem代码,它似乎没有用于此目的的明显扩展点。但是,我想知道(在守护进程中)您是否可以捕获守护进程在发生“停止”时发送的KILL/TERM信号...?trap("TERM")do#executeyourextracodehereend或者你可以安装一个at_exit钩子(Hook):-at_exitdo#executeyourextracodehe

  10. 多种方法期间的 Ruby 救援异常 - 2

    我构建了一个简单的银行应用程序,它能够执行通常的操作;充值、提现等我的Controller方法执行这些操作并拯救由帐户或其他实体引发的异常。以下是Controller代码中使用的一些方法:defopen(type,with:)account=createtype,(holders.findwith)addaccountinit_yearly_interest_foraccountboundary.renderAccountSuccessMessage.new(account)rescueItemExistError=>messageboundary.rendermessageendde

随机推荐