工业异常检测:从前沿到落地

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

  • 前言
  • 一、前沿技术:SimpleNet
    • 1. 任务分类:分隔
    • 2. 性能对比:faster&higher
    • 3. 研究背景
      • 困难:
      • 方案:无监督
      • 数据集:MVTec AD
        • 性能对比:
        • 速度对比:
  • 二、代码实战
    • 1.引入库
    • 2.读入数据
  • 总结


前言

工业异常检测是一个比较古老的话题,从传统的图像处理到现在引入深度模型的深度视觉识别,也就短短十几年的时间。这样的提升主要体现在几个方面:1、检测能力越来越强大,从单一的异常检测到现在的多种类检测;2、模型越来越强大,从几个文件几张图片到现在大模型上万张图像。即使如此,在边缘GPU的加持下,深度模型取得了检测速度和检测精度的双平衡,这篇文章将从:1、原理解读,2、动手实践两个部分进行展开,恪守知行合一的原则,为有强迫症的读者带来酣畅的体验。


一、前沿技术:SimpleNet

图1 在工业异常数据集MVTec AD上的实测效果图

1. 任务分类:分隔

我们可以看到该技术提供了以下功能:1、生产的异常图可以叠加在原图上;2、异常区域的热力图显示,橙色表示得分高的异常区域;3、异常区域的边界用红色划分出来。因此,我们不难发现,工业异常检测的任务可以归类到图像分割中,如果能够指出是哪种异常,那么更具体到实例分割的任务中。

2. 性能对比:faster&higher

工业异常检测:从前沿到落地_第1张图片

图2 在检测速度与检测精度面板上的性能对比

通过图2,我们不难发现该方法在取得接近80FPS(帧每秒)的前提下,还取得了超过99.5的分割准确率(I-AUROC)。这种又快又好的检测器,难道不是一把解决行业需求的利器吗?

但是,有一个待解决的问题:以上方法只给出了检测的异常位置,但是属于哪种异常,是钢件上异常还是丝绸的呢?这个方法并没有给出。如果在某种材料上的异常不确定时,还能检测出来吗?所以,至少两个问题还需要进一步研究:1、实例分割;2、迁移分割或者鲁棒性检测。

3. 研究背景

困难:

在工业场景下,异常检测与定位特别难,因为异常样本很少,而异常类型多,比如从细小的划痕到大结构缺失等。更多的样例可参考图1。这样让基于有监督的训练比较难执行。

方案:无监督

当前的方法为了解决这个问题,主要采用无监督的方式,即只采用正常样本来训练,只在测试过程中加入异常样本。比较常见的无监督方法有三种趋势:

  1. 重构的方法;它假设深度网络在只接受正常数据训练的情况下,不能准确地重构出异常,重构错误的像素被当成异常。但是,这样的假设不可能总成立,因为有时候网络泛化很好,往往也能重构出异常像素,导致误检。
  2. 合成的方法;它通过在无异常的数据上产生异常来训练网络,进而估计异常区域的边界。但是,合成的图片不够真实的话,产生的特征可能会偏离真实特征非常远,使用这样的负样本来训练可能会导致一个松散的有界正常特征空间。
  3. 嵌入(embedding)的方法;这类方法当前获得SOTA的性能。它一般采用在ImageNet上预训练的模型来提取通用的正常特征,然后采用统计算法比如多参高斯分布,归一化流和内存银行(memory bank)去嵌入正常的特征分布。通过比对输入特征与学习到的分布或者记忆到的特征来检测异常。但是,工业异常图片通常与ImageNet的分布不同。直接使用这些带有偏置的特征可能会导致不匹配的问题。并且,这些统计算法都需要高计算复杂度或者高消耗内存。

为了解决上述问题,作者提出一个SimpleNet,能够利用合成和嵌入方法的优点,获得以下提升:

  1. 与直接使用预训练的特征不同,作者提出使用一个特征适配器来产生针对目标的特征,以减少领域偏见。
  2. 与直接合成异常样本不同,作者提出通过放置噪声到特征空间的正常特征中来产生异常特征。作者认为通过适当校准噪声的尺度,能够产生一个紧密有界的正常特征空间。
  3. 通过训练一个简单的判别器能够简化异常检测过程,这将比在嵌入方法中使用复杂统计算法更加高效运算。
    具体说,就是SimpleNet利用预训练的骨架来提取正常特征,然后进行判别。判别器的结构非常简单,仅由MLP构成。作者的框架如下所示:
    工业异常检测:从前沿到落地_第2张图片
    |图3 SimpleNet的框架|
    |–|

数据集:MVTec AD

它是一个非常流行的数据集,在异常检测与定位方面。它包含5中纹理,和10个物体分类,总共包含5354张图片。这个数据集通常由正常样本的训练集,和异常正常兼有的测试集构成。并且,它还提供了像素级别的标注用于异常图片测试。在作者的文中,它将所有类别当成一个分类,也就是所谓的冷启动异常测试,即作者在对应的正常训练样本上为每一个分类训练一个单分类器。没有使用数据增强,每一张图片都被归一化到256x256,中心切割224x224。

性能对比:

下图展示了当前数据集上的领先方法对比性能:
工业异常检测:从前沿到落地_第3张图片

图4 SimpleNet与当前领先方法的性能对比
速度对比:

作者在a Nvidia GeForce GTX 3080ti GPU and an Intel®和Xeon® CPU E5-2680 [email protected]的CPU上跑出了比PatchCore几乎快8倍的性能。

图5 更多的分割效果

二、代码实战

1.引入库

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

主要对SimpleNet进行了原理解读,和效果分析。通过解读,我们知道当前主流的数据集,和任务,这给我们后续做检测提供了一个方向。

你可能感兴趣的:(AI,&,Computer,Vision,1024程序员节,计算机视觉)