CVPR2019 无监督异常检测/定位数据集:MVTec AD

2023-10-31 15:40

本文主要是介绍CVPR2019 无监督异常检测/定位数据集:MVTec AD,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《MVTec AD:A Comprehensive Real-World Dataset for Unsupervised Anomaly Detection》

简介

MVTec AD是MVtec公司提出的一个用于异常检测的数据集,发布于2019CVPR。与之前的异常检测数据集不同,该数据集模仿了工业实际生产场景,并且主要用于unsupervised anomaly detection。数据集为异常区域都提供了像素级标注,是一个全面的、包含多种物体、多种异常的数据集。

训练集中只包含正常样本,测试集中包含正常样本与缺陷样本,因此需要使用无监督方法学习正常样本的特征表示,并用其检测缺陷样本。这是符合现实的做法,因为异常情况不可预知并无法归纳

数据集包含不同领域中的五种纹理以及十种物体,下图分别展示了这几类图片的正常样本与缺陷样本,以及缺陷样本中的缺陷特写。

论文介绍

2. Related Work

该段主要介绍了异常检测数据集以及用于异常检测的方法

Dataset:主要有两类

​ ① 异常图片分类,也就是说模型只需要输出该图片是否为异常样本。有种构造数据集的方法是在ImageNet上选出一部分类别图像作为训练集,用其他类别的图像作为测试集,但是因异常样本本身就已经属于不同类别,在它上面验证的方法无法评价其好坏。因此《Object-Centric Anomaly Detection by Attribute-Based Reasoning》从Pascal VOC中选取六类物体图片作为正常,然后在网上搜索一批该类别中奇形怪状的样本作为缺陷样本。尽管异常数据更接近训练数据模式,但异常检测还是基于整个图像,而不是发现图像中的异常部分(没有定位异常区域);

​ ② 异常区域分割,不仅需要判断是否异常,还需要找出异常区域。a) NanoTwice: 45张灰度图,5个无缺陷图像进行训练,剩余40张异常图像(包含灰尘或斑点等,只有一种纹理); b) DAGM: 包含10类缺陷(人工生成的灰度纹理,其缺陷以椭圆形式被弱注释),每类包括1000个正常区域用于训练,150个缺陷样本用于测试。

Nano Twice只包含单种缺陷纹理,无法准确验证方法性能;DAGM标注是粗糙的,并且是人工生成的缺陷,无法反映真实世界应用。

Methods:主要有以下四类

​ ① 生成对抗模型,训练时生成器生成假图像,以对抗的方式欺骗鉴别器。对于异常检测,模型在潜在空间中搜索样本(可迷惑鉴别器的样本,满足训练集分布),如果能找到一个合适的匹配即为正常,反之异常。对于异常分割,将重建图像与原始输入逐像素进行比较即可。

代码性文章为:Unsupervised Anomaly Detection with Generative Adversarial Networks to Guide Marker Discovery

​ ② 卷积自编码器,这是无监督异常检测中用的最多的方法。训练时自编码器通过潜在空间(latent space)重构正常样本,在测试时如果测试样本与训练样本分布不同,那么无法重现样本,这样可以检测出样本是否异常。然后通过对比输入样本与重构样本的像素级差异可以发现异常区域。

卷积自编码器CAE有很多变体,比如VAE变分自编码器,但是目前有论文提出从VAE或者其他深度生成模型获得的概率可能无法对训练数据的真实可能性(true likelihood)进行建模。

​ ③ 基于预训练神经网络特征,上面两种方法都是试图从提供的训练数据中学习特征表示,但目前有些方法直接使用某个训练好的CNN(在一个单独的图像分类任务上进行训练)的特征提取器来进行异常检测。

代表工作:Anomaly Detection in Nanofibrous Materials by CNN-Based Self-Similarity

​ ④ 传统方法,针对正常样本设计人工特征提取器。例如,通过高斯混合模型GMM建模特征分布,对于提取出来的特征在GMM获得较低概率的样本将会被认为是缺陷样本。

3. Dataset Description

如上表与第一节的图例所示,数据集一共包含15个类别,其中3629张图片用于训练与验证,1725张用于测试,其中训练集只包含正常样本。其中5类为纹理类数据,包含规律的纹路(毛毯、网格)以及随机纹路(皮革、瓷砖、木材);剩下的10类为物体类数据,包含刚性的、特定外观的物体(瓶,金属螺母),可变形物体(电缆)或包括自然变化物体(榛子),并且某部分获取的物体处于大致对齐位置(e.g. 牙刷,胶囊和药丸),其他为随机摆放(e.g. 金属螺母,螺丝和榛子)。测试集中包含73种不同的异常,例如物体表面缺陷(e.g.划痕,凹痕)、结构缺陷(e.g.物体出现部分扭曲)或者由于缺少某些物体组成部件而表现出来的缺陷。

所有图像的尺寸在700x700 ~ 1024x1024之间,其中网格、拉链以及螺丝为灰度单通道图像。数据集为所有的缺陷区域均提供了像素级标注区域,总共包含接近1900个标注区域。

4. Benchmark

选取第2节所介绍的一些SOTA方法在该数据集上进行验证,作为未来方法的Baseline。

具体的模型参数设置与训练细节,可以参照原文,这里不再叙述

进行评估的模型包含AnoGAN、L2/SSIM CAE、CNN feature dictionary、GMM-based Texture Inspection Model以及Variation Model

数据增广:对于纹理类的图片,对提取出的矩形Patch进行随机裁剪+旋转;对于物体类图片,应用随机平移+旋转。对某些类别图片进行额外的旋转操作,最后每一类包含10000个训练patch。

评价指标:分类任务采用准确率;分割任务采用IoU,以及引入阈值无关的指标:AUC,其中TPR表示被正确识别为异常类像素的百分比,TNR表示被错误识别为异常类像素的百分比。

在评估的模型中,除了GMM可以提供一个阈值,其他模型的阈值都需要设。关于阈值的设定,作者明确定义了一种方法:从训练集中随机抽取一批数据作为验证集,在这上面确定阈值。

具体做法:首先对每一类定义一个最小缺陷区域(minimum defect area),在模型输出的异常图(Anomaly Map)中如果有连通区域大于该区域就会被识别为异常区域。然后在验证集(全为正常样本)上提高阈值,直到异常图中的连通区域刚好都小于定义的缺陷区域(即验证集中没有被误识别的样本),就以该阈值作为测试的阈值。

测试结果:异常分类与分割的测试结果分别为以下两张表所示

第一行和第二行分别表示在测试集上正常样本与异常样本的分类准确率

第一行和第二行分别表示在测试集上的IoU以及AUC

从测试集结果来看,所选取的这些代表性方法中没有一个在所有类别上都表现的很好。

具体实验的分析这里也不过多赘述,只提一个结论:AUC与Overlap(IoU)没有重合,这也凸显出在无异常样本上确定阈值是非常困难的,这也就说明无监督异常检测的可发展空间之大。
在这里插入图片描述

上图给了一些可视化结果,具体分析课件原文4.4节

这篇关于CVPR2019 无监督异常检测/定位数据集:MVTec AD的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/316378

相关文章

MySQL InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

《MySQLInnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据》mysql的ibdata文件被误删、被恶意修改,没有从库和备份数据的情况下的数据恢复,不能保证数据库所有表数据... 参考:mysql Innodb表空间卸载、迁移、装载的使用方法注意!此方法只适用于innodb_fi

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespace id不一致处理

《mysql8.0无备份通过idb文件恢复数据的方法、idb文件修复和tablespaceid不一致处理》文章描述了公司服务器断电后数据库故障的过程,作者通过查看错误日志、重新初始化数据目录、恢复备... 周末突然接到一位一年多没联系的妹妹打来电话,“刘哥,快来救救我”,我脑海瞬间冒出妙瓦底,电信火苲马扁.

golang获取prometheus数据(prometheus/client_golang包)

《golang获取prometheus数据(prometheus/client_golang包)》本文主要介绍了使用Go语言的prometheus/client_golang包来获取Prometheu... 目录1. 创建链接1.1 语法1.2 完整示例2. 简单查询2.1 语法2.2 完整示例3. 范围值

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2

Python使用Pandas对比两列数据取最大值的五种方法

《Python使用Pandas对比两列数据取最大值的五种方法》本文主要介绍使用Pandas对比两列数据取最大值的五种方法,包括使用max方法、apply方法结合lambda函数、函数、clip方法、w... 目录引言一、使用max方法二、使用apply方法结合lambda函数三、使用np.maximum函数

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略