OOD 异常GPT:使用大型视觉语言模型检测工业异常

  • paper link https://arxiv.org/abs/2308.15366
  • video demo https://youtu.be/lcxBfy0YnNA
  • github https://github.com/CASIA-IVA-Lab/AnomalyGPT
  • 在线使用 https://huggingface.co/spaces/FantasticGNU/AnomalyGPT

摘要

        大型视觉语言模型(LVLM)如MiniGPT-4和LLaVA已经展示了理解图像的能力,并在各种视觉任务中取得了卓越的表现。尽管由于广泛的训练数据集,他们在识别常见对象方面的能力很强,但他们缺乏特定的领域知识,并且对对象内的局部细节的理解较弱,这阻碍了他们在工业异常检测 (IAD) 任务中的有效性。另一方面,大多数现有的IAD方法仅提供异常评分,并且需要手动设置阈值以区分正常和异常样本,这限制了其实际实施。在本文中,我们探讨了利用LVLM来解决IAD问题,并提出了AnomalyGPT,一种基于LVLM的新型IAD方法。我们通过模拟异常图像并为每个图像生成相应的文本描述来生成训练数据。我们还使用图像解码器来提供细粒度语义,并设计一个提示学习器来使用提示嵌入微调LVLM。我们的 AnomalyGPT 消除了手动阈值调整的需要,因此可以直接评估异常的存在和位置。此外,AnomalyGPT 支持多回合对话,并展示了令人印象深刻的少数镜头上下文学习功能。在 MVTec-AD 数据集上,AnomalyGPT 只需一次正常拍摄,就实现了 86.1% 的准确率、94.1% 的图像级 AUC 和 95.3% 的像素级 AUC 的先进性能。

贡献

• 我们介绍了LVLM在解决IAD任务方面的开创性应用。我们的方法不仅在不手动调整阈值的情况下检测和定位异常,而且支持多轮对话。据我们所知,我们是第一个将LVLM成功应用于工业异常检测领域的公司。
• 我们工作中的轻量级、基于视觉文本特征匹配的解码器解决了LLM对细粒度语义识别能力较弱的限制,并缓解了LLM仅生成文本输出能力受限的限制。
• 我们采用即时嵌入进行微调,并与LVLM预训练期间使用的数据同时训练我们的模型,从而保留LVLM的固有能力并实现多回合对话。
• 我们的方法保持了强大的可转移性,能够在新的数据集上进行上下文少镜头学习,产生出色的性能。

3. Method

AnomalyGPT是一种新颖的会话式IAD视觉语言模型,主要用于检测工业工件图像中的异常并精确定位其位置。我们利用预先训练的图像编码器和LLM,通过模拟的异常数据来对齐IAD图像及其相应的文本描述。我们引入了解码器模块和提示学习器模块,以提高IAD性能并实现像素级定位输出。利用预训练数据进行及时调整和交替训练可以保持LLM的可转移性,并防止灾难性遗忘。我们的方法表现出强大的少镜头转移能力,能够在只提供一个正常样本的情况下对以前看不见的项目进行异常检测和定位。

3.1. Model architecture

在这里插入图片描述

        图2展示了AnomalyGPT的综合架构。给定一个查询图像 x ∈ R H × W × C x∈R^{H×W×C} xRH×W×C,将图像编码器提取的最终特征 F i m g ∈ R C 1 F_{img}∈R^{C1} FimgRC1通过线性层,得到嵌入 E i m g ∈ R C e m b E_{img}∈R^{Cemb} EimgRCemb的图像,然后将其输入LLM。在无监督设置中,将图像编码器中间层提取的patch特征与文本特征一起输入解码器,以生成像素级异常定位结果。在few-shot设置中,来自正常样本的patch级别特征被存储在存储库(memory bank)中,并且可以通过计算查询patch与存储库中最相似的部件之间的距离来获得定位结果。定位结果随后通过提示学习器转换为提示嵌入,作为LLM输入的一部分。LLM利用图像输入、提示嵌入和用户提供的文本输入来检测异常并识别其位置

3.2. Decoder and prompt learner

Decoder

        为了实现像素级异常定位,我们采用了一种基于特征匹配的轻量级图像解码器,该解码器支持无监督IAD和少镜头IAD。解码器的设计主要受到PatchCore[23]、WinCLIP[11]和APRIL-GAN[2]的启发。

        如图2的上部所示,我们将图像编码器划分为4个阶段,并获得每个阶段提取的中间patch级别特征 F p a t c h i ∈ R H I × W i × C i F_{patch}^i\in R^{H_I\times W_i \times C_i} FpatchiRHI×Wi×Ci,其中i表示第i阶段。遵循WinCLIP[11]的理念,一种自然的方法是分别计算 F p a t c h i F_{patch}^i Fpatchi和文本特征 F t e x t ∈ R 2 × C t e x t F_{text}\in R^{2\times C_{text}} FtextR2×Ctext(正常和异常)之间的相似性。表示正常和异常情况的详细文本见附录B。
        表示正常和异常情况的详细文本如附录B所示。然而,由于这些中间特征尚未经过最终的图像-文本对齐,因此无法直接与文本特征进行比较。为了解决这个问题,我们引入了附加的线性层来将这些中间特征投影到 F ~ p a t c h i ∈ R H i × W i × C t e x t \tilde F^i_{patch}∈R^{H_i×W_i×C_{text}} F~patchiRHi×Wi×Ctext,并将它们与表示正常和异常语义的文本特征对齐。定位结果 M ∈ R H × W M∈R^{H×W} MRH×W可以由方程(1)得到:
在这里插入图片描述

        对于少镜头IAD,如图2的下半部分所示,我们使用相同的图像编码器从正常样本中提取中间补丁级别的特征,并将其存储在存储库memory-bank B i ∈ R N × C i B_i∈R^{N×Ci} BiRN×Ci中,其中i表示第i阶段。对于补丁级别的特征 F p a t c h i ∈ R H i × W i × C i F^i_{patch}∈R^{ H_i×W_i×C_i} FpatchiRHi×Wi×Ci,我们计算了每个补丁与内存库中最相似的补丁之间的距离,并且定位结果 M ∈ R H × W M∈R^{H×W} MRH×W可以通过等式(2)获得。
在这里插入图片描述

Prompt learner

        为了利用图像中的细粒度语义并保持LLM和解码器输出之间的语义一致性,我们引入了一种将定位结果转换为提示嵌入的提示学习器。此外,与解码器输出无关的可学习的基本提示嵌入被结合到提示学习器中,以为IAD任务提供额外信息。最后,这些嵌入与原始图像信息一起被馈送到LLM中。

        如图2所示,提示学习器由可学习的基本提示嵌入 E b a s e ∈ R n 1 × C e m b E_{base}∈R^{n1×Cemb} EbaseRn1×Cemb和卷积神经网络组成。该网络将定位结果 M ∈ R H × W M∈R^{H×W} MRH×W转换为 n 2 n_2 n2个提示嵌入 E d e c ∈ R n 2 × C e m b E_{dec}∈R^{n2×C_{emb}} EdecRn2×Cemb E b a s e E_{base} Ebase E d e c E_{dec} Edec形成一组 n 1 + n 2 n_1+n_2 n1+n2提示嵌入 E p r o m p t ∈ R ( n 1 + n 2 ) × C e m b E_{prompt}∈R^{(n1+n2)×C_{emb}} EpromptR(n1+n2)×Cemb,其与嵌入到LLM中的图像相组合。

试用截图在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

大数据CloudSim应用实践

CloudSimExampleA.java 1准备 1.1操作系统 本实验在Windows 7 或Windows 10系统运行均可。 1.2软件 cloudsim-3.0.3.zip; commons-math3-3.2-bin.zip; jdk-8u152-windows-x64.exe; eclipse-jee-neon-3-win32-x86_64 所需资料链接&#xff1…

W25Q64(模拟SPI)读写数据的简单应用

文章目录 一、W25Q64是什么?二、使用步骤1.硬件1.引脚说明2.硬件连接3.设备ID4.内部框架5.指令集指令集1指令集2 2.软件1.W25Q64引脚定义代码如下(示例):2.W25Q64初始化代码如下(示例):3.W25Q64…

【IC前端虚拟项目】MVU模块方案与背景熟悉

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 mvu这个模块是干嘛用的呢?从这个名字就可以看出来move_unit,应该是做数据搬运的。很多指令级中都会有数据搬运的指令,这类指令的作用一般是在片内片外缓存以及通用专用…

Java基础语法之抽象类和接口

抽象类 什么是抽象类 并不是所有的类都是用来描述对象的,这样的类就是抽象类 例如,矩形,三角形都是图形,但图形类无法去描述具体图形,所以它的draw方法无法具体实现,这个方法就可以没设计成抽象方法&…

常用模块之(time/datetime)

【 一 】时间模块(time/datetime) 【 二 】 表示时间的三种方式 *时间戳(Timestamp)是指1970年1月1日00:00:00开始计算的偏移量。可以使用time模块中的time()函数获取当前时间的时间戳,也可以使用datetime模块中的tim…

大创项目推荐 深度学习 python opencv 实现人脸年龄性别识别

文章目录 0 前言1 项目课题介绍2 关键技术2.1 卷积神经网络2.2 卷积层2.3 池化层2.4 激活函数:2.5 全连接层 3 使用tensorflow中keras模块实现卷积神经网络4 Keras介绍4.1 Keras深度学习模型4.2 Keras中重要的预定义对象4.3 Keras的网络层构造 5 数据集处理训练5.1 …

ElasticSearch学习篇8_Lucene之数据存储(Stored Field、DocValue、BKD Tree)

前言 Lucene全文检索主要分为索引、搜索两个过程,对于索引过程就是将文档磁盘存储然后按照指定格式构建索引文件,其中涉及数据存储一些压缩、数据结构设计还是很巧妙的,下面主要记录学习过程中的StoredField、DocValue以及磁盘BKD Tree的一些…

PyQt6 QScrollBar滚动条控件

锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计48条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版…

录制第一个jmeter性能测试脚本2(http协议)_图书管理系统

我们手工编写了一个测试计划,现在我们通过录制的方式来实现那个测试计划。也就是说‘’测试计划目标和上一节类似:让5个用户在2s内登录图书管理系统,然后进入 页面进行查看。 目录 欢迎访问我的免费课程 PPT、安装包、视频应有尽有&#xff…

【微服务】Spring Aop原理深入解析

目录 一、前言 二、aop概述 2.1 什么是AOP 2.2 AOP中的一些概念 2.2.1 aop通知类型 2.3 AOP实现原理 2.3.1 aop中的代理实现 2.4 静态代理与动态代理 2.4.1 静态代理实现 三、 jdk动态代理与cglib代理 3.1 jdk动态代理 3.1.1 jdk代理示例 3.1.2 jdk动态代理模拟实现…

【OpenCV】 OpenCV 源码编译并实现 CUDA 加速 (Windows)

OpenCV 源码编译并实现 CUDA 加速 Windows 1. 环境准备1.1 软件环境1. 2 源码下载 2. CMake编译项目2.1 创建cmake项目2.2 设置编译配置2.3 解决异常2.3.1 文件下载异常2.3.2 解决CUDA版本异常 2.4 编译项目 3. Visual Studio 编译项目4. 项目测试5. 总结 OpenCV是一个基于Apac…

Ubuntu 常用命令之 ln 命令用法介绍

ln命令在Ubuntu系统中用于创建硬链接或符号链接。硬链接是指向文件的物理地址,而符号链接(也称为软链接)是指向文件路径的引用。 命令格式:ln [选项]... [-T] 目标(源文件) 链接(目标文件&…

【FPGA】Verilog:编码器 | 实现 4 到 2 编码器

0x00 编码器(Encoder) 编码器与解码器相反。当多台设备向计算机提供输入时,编码器会为每一个输入生成一个与设备相对应的信号,因此有多少比特就有多少输出,以数字形式表示输入的数量。 例如,如果有四个输…

NAS搭建WebDAV服务同步Zotero科研文献

文章目录 一、Zotero安装教程二、群晖NAS WebDAV设置三、Zotero设置四、使用公网地址同步Zotero文献库五、使用永久固定公网地址同步Zotero文献库 Zotero 是一款全能型 文献管理器,可以 存储、管理和引用文献,不但免费,功能还很强大实用。 ​ Zotero 支…

重新认识Word——尾注

重新认识Word——尾注 参考文献格式文献自动生成器插入尾注将数字带上方括号将参考文献中的标号改为非上标 多处引用一篇文献多篇文献被一处引用插入尾注有横线怎么删除?删除尾注 前面我们学习了如何给图片,公式自动添加编号,今天我们来看看毕…

LSTM ——作业

习题6-4 推导LSTM网络中参数的梯度, 并分析其避免梯度消失的效果 习题6-3P 编程实现下图LSTM运行过程 1. 使用Numpy实现LSTM算子 import numpy as np # 创建一个numpy数组x,它是一个4x4的矩阵,包含9个元素 x np.array([[1, 0, 0, 1],[3, …

Unity中URP下的菲涅尔效果实现(URP下的法线和视线向量怎么获取)

文章目录 前言一、实现思路二、实现原理我们可以由下图直观的感受到 N 与 L夹角越小,点积越接近(白色)1。越趋近90,点积越接近0(黑色) 三、实现URP下的菲涅尔效果1、我们新建一个Shader,修改为最…

安全密码(字符串)

#include <stdio.h> #include <stdbool.h> #include <string.h> bool is_secure_password(const char* password); int main() {int M;char password[51];// 读取输入中的密码数量 Mscanf("%d", &M);// 处理每个密码for (int i 0; i < M; …

Pytorch:Tensorboard简要学习

目录 一、TensorBoard简介二、TensorBoard的安装与启动Tensorboard的安装Tensorboard的启动 三、TensorBoard的简单使用3.1 SummaryWriter()3.2 add_scalar()和add_scalars()3.3 add_histogram()3.4 模型指标监控 四、总结参考博客 一、TensorBoard简介 TensorBoard 是Google开…

17.Oracle中instr()函数查询字符位置

1、instr()函数的格式 &#xff08;俗称&#xff1a;字符查找函数&#xff09; 格式一&#xff1a;instr( string1, string2 ) // instr(源字符串, 目标字符串) 格式二&#xff1a;instr( string1, string2 [, start_position [, nth_appearance ] ] ) // instr(源字符…