【图像异常检测】 Anomalib

news2025/10/20 9:14:05

原文: A practical guide to image-based anomaly detection using Anomalib

1. 简介

在工业生产中,质量保证是一个很重要的话题, 因此在生产中细小的缺陷需要被可靠的检出。工业异常检出旨在从正常的样本中检测异常的、有缺陷的情况。工业异常检测主要棉铃的调整:

  1. 难以获取大量异常样本
  2. 正常样本和异常样本差异较小
  3. 异常的类型不能预先得知

这些挑战使得很难使用传统的分类算法训练,需要提出特殊的方法来应对处理。

2. 相关工作

无监督异常检测和定位方法可以分为判别方法和生成方法。

2.1 判别方法

判别方法尝试建模正常样本和异常样本的边界。这类方法首先从图片中生成嵌入特征,进而对比来自OK样本的嵌入。将特征的距离作为异常分数。这类方法能得到较好的结果但是经常缺乏可解释性,我们常常无法判断那一部分导致了异常。例如,当使用诸如SPADE方法。SPADE在测试时使用嵌入向量进行KNN聚类。这意味着推理复杂度规模随着训练集的尺寸增长。推理速度在工业生产中较为重要,因此此类方法降低了其实用性。

2.1.1 PaDiM

在PaDiM之前,一些判别式方法需要杯中的深度神经网络训练,或者在一个大的数据集上使用KNN,这些操作都极大的降低了推理速度。这也阻碍了在实际工业环境中的应用。 Patch Distribution Modeling (PaDiM) 旨在解决这一挑战。PaDiM使用在ImageNet分类中预先训练的CNN模型来进行特征嵌入。图像被划分为独立的Patches 并且对每个Patch 进行特征嵌入。PaDiM 使用CNN预训练的所有层。由于这样可能导致许多冗余的信息,在这里它们随机抽样选择嵌入。有趣的是, 这一工作和PCA降维一样好同时还更快。PaDiM假设所有的嵌入特征都服从多为高斯分布,并估计每个Patch的抽样均值和抽样误差参数。最后的结果为每个训练集图片Patch的多为高斯分布。
在这里插入图片描述
在推理阶段的异常得分基于测试图片的Patch和学习到的Patch之间的马氏距离给出。最后的异常得分是异常值map 的最大值。这个算法避免了KNN类算法因为训练集的增大导致算法复杂度的递增。

2.1.2 PatchCore

和PaDiM相似,PatchCore将图片单独拆分为patches. PatchCore的想法是如果一个单独的patch 是异常的那么整张图都将被分类为异常。PatchCore 也解决PaDiM面临相同的调整,其目标总结为以下三点:

  1. 最大化获取在测试时的正常信息。PaDiM局限于通过马氏距离检测Patch级别异常检测。在PatchCore 中,在训练阶段的提取的特征将保存在一个内存库中,在测试时也可以同等获取。
  2. 减少与ImageNet 分类任务的偏差。与PaDiM相似,同样采用在ImageNet上的预训练模型。为了减少异常检测任务和分类任务的偏差,只是用作为低级特征的中层特征具有更强的泛华性而高级特征更加偏向于ImageNet分类任务。
  3. 保持较高的推理效率,PatchCore引入了coreset子采样即:近似源数据集结构的同时大大减少了其大小。

在训练阶段,使用预训练的CNN提取特征嵌入,使用corest进行抽样,并且存入内存库。在测试阶段在内存库中使用最近邻搜索,网络结构如下:
在这里插入图片描述

2.2 生成类方法

生成类方法尝试从样本中建模每一个类别的真实分布,比如生成一张新的图片。此类方法基于一个想法,即:由于异常模式在训练集中不存在,所以这些异常模式难以被生成。Autoencoder-based方法尝试从自动编解码机中检测输入和输出的不同来进行异常区域检测。一个较高的重建误差区域标识着一个异常区域。GAN-based 类方法假定只有正样本能够被生成。景观这些生成类方法比较符合直观和可解释,但是它们的性能有限,因为一些异常的图也能够被较好的重建。

2.2.1 CFlow-AD

目前为止,我们已经讨论了判别式方法。CFlow-AD是一类生成式方法。
CFLow-AD 基于一种条件归一化流网络。
在这里插入图片描述

3. 性能测试

3.1 Anomalib

Anomalib 是一个开源的异常检测python库,包含上述算法的实现。Anomalib包含一些列异常检测算法,这个库旨在提供为特定需求提供自定义的网络设计,实验跟踪,可视化和超参数优化,这些异常检测的需求。

3.2 Dataset

一个工业生产相关的异常检测数据集是MVTec dataset. 包含5k 高分辨率图片并划分为10中不同的对象和物种纹理类型。每个雷暴都包含一个没有缺陷的训练集和一个包含各种缺陷的测试集。

3.3 评价指标

评价指标主要是使用AUROC

3.4 Anomalib 安装

官方给出的安装流程,可能会出现问题。对踩过的坑进行总结

  • RuntimeError: CUDA error: no kernel image is available for execution on the device
    这个错误是因为官方给出的 setup.py 提供的pytorch 安装有问题,重装pytorch即可:
pip uninstall -y torch torchvision torchtext
pip install torch==1.12.1+cu116 torchvision==0.13.1+cu116 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu116

相关链接: https://github.com/openvinotoolkit/anomalib/issues/792
如果重装后提示 anomalib 库找不到,可以注释掉 ./requirements/base.txt中的内容,再次执行:

pip install -e .

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

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

相关文章

构建工具tsup入门第四部分

🎄Hi~ 大家好,我是小鑫同学,一位长期从事前端开发的编程爱好者,我将使用更为实用的案例输出更多的编程知识,同时我信奉分享是成长的唯一捷径,在这里也希望我的每一篇文章都能成为你技术落地的参考~ 目录&am…

哈夫曼树、带权路径长度、前缀编码 的概念

文章目录一、基本概念1.1带权路径长度(WPL)1.2哈夫曼树二、哈夫曼树的构造三、哈夫曼树的应用3.1哈夫曼编码与前缀编码一、基本概念 1.1带权路径长度(WPL) 路径长度: 经历的边数 结点的带权路径长度: 从树…

创建线程的三种模式

进程,是对运行时程序的封装,是系统进行资源调度和分配的基本单位,实现了操作系统的并发。 线程,是进程的子任务,是CPU调度和分派的基本单位,实现了进程内部的并发。 线程在进程下运行。 进程之间不会影响…

从0到1一步一步玩转openEuler--09 openEuler基础配置--设置日期和时间

文章目录9 设置日期和时间9.1 使用timedatectl命令设置9.1.1 显示日期和时间9.1.2 通过远程服务器进行时间同步9.1.3 修改日期9.1.4 修改时间9.1.5 修改时区9.2 使用date命令设置9.2.1 显示当前的日期和时间9.2.2 修改时间9.2.3 修改日期9.3 使用hwclock命令设置9.3.1 硬件时钟…

QT之OpenGL深度测试

QT之OpenGL深度测试1. 深度测试概述1. 1 提前深度测试1.2 深度测试相关函数2. 深度测试精度2.1 深度冲突3. Demo4. 参考1. 深度测试概述 在OpenGL中深度测试(Depth Testing)是关闭的,此时在渲染图形时会产生一种现象后渲染的会把最先渲染的遮挡住。而在启用深度测试…

浏览器的底层运行机制

一、复习 1.进程和线程 进程:指一个程序(或浏览器打开一个页面就是开辟一个进程)* 线程:程序中具体执行任务的一个进程中可能包含一到多个线程!!* 单线程:同时只能处理一件事,上一件事处理完,…

ASEMI三相整流模块MDS55-16特征,MDS55-16应用

编辑-Z ASEMI三相整流模块MDS55-16参数: 型号:MDS55-16 最大重复峰值反向电压(VRRM):1600V 最大RMS电桥输入电压(VRMS):1700V 最大平均正向整流输出电流(IF&#xf…

MySQL架构图

MySQL架构图 Mysql逻辑架构图主要分三层: 1) 第一层负责连接处理,授权认证,安全等等 每个客户端连接都会在服务器进程中拥有一个线程,服务器维护了一个线程池,因此不需要为每一个新建的连接创建或者销毁线程。 当客户…

看板管理对项目管理有什么帮助?

在目前市面上的项目管理工具中,项目看板功能基本上成为了标配。看板作为敏捷的项目管理工具,可以帮助我们将项目工作可视化展现。项目看板的作用1,提高团队信息流动性:看板工具可以及时的传递项目工作中的最新讯息,保证…

Mapper文件注入问题

Mapper文件注入问题UserMapper that could not be found.原因分析解决方案程序正常运行,但是注入类爆红问题原因分析解决方法UserMapper’ that could not be found. 原因分析 撰写了mapper文件,但是没有注入spring容器 解决方案 添加mybatis.mapper-…

DVWA—CSRF-Medium跨站请求伪造中级

注意: 1、这里对XSS(Stored)关卡不熟悉的可以从这里去看http://t.csdn.cn/ggQDK 2、把难度设置成 Medium 一、这一关同样我们需要埋下伏笔,诱使用户点击来提交,首先从XSS(Stored)入手。 注意:在前面介绍…

黑马】后台项目171集

将近一个月没有练习了,找到之后果然打不开出了问题【问题】运行代码打开网页后,发现不能正常登录,一开始还以为是密码记错了,后来发现是数据库没有正常启动,phpstudy中的数据库一直是启动状态,关闭不了。【…

这个神器,让 Python 爬虫如此简单

相信大家应该都写过爬虫,简单的爬虫只需要使用 requests 即可。遇到复杂的爬虫,就需要在程序里面加上请求头和参数信息。类似这种: 我们一般的步骤是,先到浏览器的网络请求中找到我们需要的请求,然后将请求头和参数信…

【运筹优化】带时间窗约束的车辆路径规划问题(VRPTW)详解 + Python 调用 Gurobi 建模求解

文章目录一、概述1.1 VRP 问题1.2 CVRP 问题1.3 VRPTW 问题二、VRPTW 的一般模型三、Python 调用 Gurobi 建模求解3.1 Solomn 数据集3.2 完整代码3.3 运行结果展示3.3.1 测试案例:c101.txt3.3.2 测试案例:r101.txt一、概述 1.1 VRP 问题 车辆路径规划问…

一场深度的IT效率革命:低代码市场加速嬗变

尽管IT技术支撑了全球的信息化浪潮,然而困扰行业已久的软件开发效率却难以像摩尔定律一样快速提升,甚至已经成为了一种瓶颈,在困扰着行业的继续发展。一边是码农们高喊着996的境况,另一边是程序员的生产力并没有用在更具价值的生产…

Qml学习——布局

最近在学习Qml,但对Qml的各种用法都不太熟悉,总是会搞忘,所以写几篇文章对学习过程中的遇到的东西做一个记录。 学习参考视频:https://www.bilibili.com/video/BV1Ay4y1W7xd?p1&vd_source0b527ff208c63f0b1150450fd7023fd8 目…

C++ 浅谈之 STL List

C 浅谈之 STL List HELLO,各位博友好,我是阿呆 🙈🙈🙈 这里是 C 浅谈系列,收录在专栏 C 语言中 😜😜😜 本系列阿呆将记录一些 C 语言重要的语法特性 🏃&am…

如何在Visual Studio、Clion、Msys2中安装和使用vcpkg

首先事情是在安装了Msys2之后,想在Clion中使用安装在Msys2中的vcpkg。但是折腾了很久还是无法解决。于是就折腾出了这篇文章,和下一篇如何在Clion使用vcpkg的文章。 不过,由于我电脑上已近配置好了vcpkg以及环境变量,要是重新删除…

【C】ASCII 的十六进制字符转文件

概述 本项目是我自己使用的 来源于用串口传文件数据到电脑进行分析的时候,需要转换成可以打开的文件 而常用的串口助手大都没有直接保存为二进制文件的功能 也完全可以当作c语言初学者的练习项目(很简单) 需求 用串口传来的文件是如下格式(ASCII字符) 需要将其转化为二进制数据…

Netty相关面试题

文章目录TCP、UDP的区别?同步与异步、阻塞与非阻塞的区别?BIO、NIO、AIO分别是什么?Netty跟Java NIO有什么不同,为什么不直接使用JDK NIO类库?Netty的粘包/拆包是怎么处理的,有哪些实现?说说Net…