深度学习论文: WinCLIP: Zero-/Few-Shot Anomaly Classification and Segmentation

深度学习论文: WinCLIP: Zero-/Few-Shot Anomaly Classification and Segmentation
WinCLIP: Zero-/Few-Shot Anomaly Classification and Segmentation
PDF: https://arxiv.org/pdf/2303.14814.pdf
PyTorch代码: https://github.com/shanglianlm0525/CvPytorch
PyTorch代码: https://github.com/shanglianlm0525/PyTorch-Networks

1 概述

WinCLIP是一种基于CLIP(Contrastive Language-Image Pretraining)模型的方法,用于零样本和少样本的异常分类和分割任务。该方法结合了文本编码器和图像编码器,利用CLIP模型的文本-图像关联能力来实现准确的异常识别和定位。

WinCLIP的核心思想是通过将不同状态和模板转换为文本嵌入,然后与图像编码器生成的图像嵌入进行关联,学习到异常和正常样本之间的关系。为了实现这一目标,WinCLIP引入了参考关联的概念。它将参考关联应用于基于视觉的异常评分图,通过文本引导评分的小样本AS/AC聚合而来。参考关联有助于捕捉异常样本的特征,并实现准确的分类和分割。

在实验中,WinCLIP在多个数据集上进行了评估,包括MVTec AD、CIFAR-10、MNIST等。实验结果显示,WinCLIP在零样本和少样本的异常分类和分割任务上表现出了优秀的性能。它超过了其他先进方法,并且在不同的异常类型和样本数量下都展现出了鲁棒性和泛化能力。

在这里插入图片描述

2 WinCLIP and WinCLIP+

通过CLIP文本编码器将各种状态和模板合成并转换为两个文本嵌入,作为类原型。类原型与WinCLIP中零样本AC/AS的CLIP图像编码器的多尺度特征相关。WinCLIP+将小窗口/中窗口补丁上的参考关联(patch/WindowAssociation)应用于基于视觉的异常评分图,这些异常评分图是为具有文本引导评分的小样本AS/AC聚合的。
在这里插入图片描述

2-1 Language-driven zero-shot AC

论文提出一个一个名为CLIP-AC的框架,以改善基于初始CLIP的零样本分类,并在零样本设置下改进异常分类。

为了更准确地定义对象的两个抽象状态,引入了一个组合提示集合(Compositional Prompt Ensemble),用于生成预定义的(a)每个标签的状态词列表和(b)文本模板的所有组合,而不是自由编写定义。状态词包括大多数对象共享的常见状态,例如正常的“flawless”和异常的“damaged”。此外,我们可以根据先前对缺陷的了解,选择性地添加特定于任务的状态词,例如PCB上的“bad soldering”。此外,我们还为异常任务精心策划了一个模板列表,例如“a photo of a [c] for visual inspection”。通过这种方式,我们能够更好地定义对象的状态,并提供更准确可靠的异常分类。

  • CPE(Contextual Prompt Engineering)与CLIP Prompt Ensemble是不同的。CLIP Prompt Ensemble不解释对象标签(例如“cat”),只通过试错选择模板来增强对象分类,其中包括一些不适合异常任务的模板,例如“a cartoon [c]”。因此,CPE中的文本与CLIP的联合嵌入空间中的图像更加对齐,适用于异常任务。

  • 采用CPE(Compositional Prompt Ensemble)的双类设计,与标准的单类方法相比,是一种新颖的定义异常的方法。由于异常检测是一个开放性问题,因此它具有不适定性。以往的方法仅通过正常图像来建模正常性,将任何与正常性偏离的情况视为异常。然而,这种解决方案很难区分真正的异常和可接受的正常性偏差,例如"scratch on circuit"与"tiny yet acceptable scratch"之间的区别。但是,语言可以用具体的词语来明确定义状态。通过使用CPE,双类设计能够更准确地定义异常情况,并提供更可靠的异常检测结果。

论文使用的 Contextual Prompt Engineering 如下:
在这里插入图片描述

2-2 WinCLIP for zero-shot AS

使用预训练的CLIP模型,并提出了WinCLIP,它可以有效地提取和聚集与语言一致的多尺度空间特征,用于零样本异常分割。

给定CPE的语言引导异常评分模型,提出了用于零样本异常分割的基于窗口的CLIP(WinCLIP)用于零样本异常分割方法,以预测像素级异常。WinCLIP提取具有良好语言对齐和x局部细节的密集视觉特征,然后在空间上应用 a s c o r e 0 ascore_{0} ascore0来获得异常分割图。具体地,给定分辨率为h×w的图像x和图像编码器f,WinCLIP获得d维特征图 F W ∈ R h × w × d F^{W}∈R^{h×w×d} FWRh×w×d的映射,如下所示:

1.生成一组滑动窗口{wij}ij,其中每个窗口 w i j ∈ 0 , 1 h × w w_{ij}∈{0,1}^{h×w} wij0,1h×w是一个二进制掩码,对于(i, j)周围的k×k核是局部活动的。

2.收集每个输出嵌入 F i j W F^{W}_{ij} FijW,根据应用每个 w i j w_{ij} wij后x的有效面积计算,定义为: F i j W : = f ( x ⊙ w i j ) F^{W}_{ij}: =f(x⊙w_{ij}) FijW:=f(xwij),其中⊙是元素乘积(见下图)。
在这里插入图片描述
Harmonic aggregation of windows:
对于每个局部窗口,零样本异常得分 M 0 , i j W M^{W}_{0,ij} M0,ijW是窗口特征 F i j W F^{W}_{ij} FijW与合成提示集成的文本嵌入之间的相似性。该分数被分布到本地窗口的每个像素。然后,在每个像素,聚合来自所有重叠窗口的多个分数,以通过谐波平均改进分割,对分数进行更多加权,以实现预测。
在这里插入图片描述
Multi-scale aggregation:
内核大小k对应于计算WinCLIP方程中每个位置的周围上下文的数量。它控制着分割中局部细节和全局信息之间的平衡。为了捕捉尺寸从小到大的缺陷,我们聚合了多尺度特征的预测。具体而言,我们使用了以下尺度的特征:

  • ( a ) 小尺度:在ViT的补丁尺度中为2×2,对应于像素中的32×32。
  • ( b ) 中尺度:在ViT中为3×3,对应于像素中的48×48。
  • ( c ) 图像尺度特征:由于自注意力机制而捕获图像上下文的ViT类token。

为了聚合这些多尺度特征,我们采用了谐波平均的方法。这种方法可以平衡不同尺度特征之间的重要性,从而获得更全面的预测结果。

2-3 WinCLIP+ with few-normal-shots

对于一个全面的异常分类和分割,文本引导的零样本方法是不够的,因为某些缺陷只能通过视觉参考而不仅仅是文本来定义。为了更准确地定义和识别异常,我们提出了WinCLIP的扩展:WinCLIP+,通过合并K个正常参考图像 D : = ( x i , − ) i = 1 K D:={(x_{i},−)}^{K}_{i=1} D:=(xi)i=1K。WinCLIP+结合了文本引导和基于视觉的方法的互补预测,以实现更好的异常分类和分割。

在这里插入图片描述
首先引入了一个关键模块,称为参考关联模块,用于合并给定的参考图像。该模块可以简单地存储和检索基于余弦相似性的记忆特征R。通过将查询图像提取的特征F(例如,patch-level2)与这样的模块结合,我们可以进行异常分割的预测M。预测结果M是一个h×w的矩阵,其中每个元素的值在0到1之间。这种预测结果可以提供关于图像中异常区域的概率估计,值越接近1表示越可能是异常区域。
在这里插入图片描述
在小样本的情况下,我们从三个不同的特征构建了单独的reference memories:(a) 小尺度特征FW的WinCLIP特征,(b) 中等尺度特征的WinCLIP特征,以及© 具有全局上下文的倒数第二个特征FP。即 RWs、RWm和RP。然后,对给定查询进行了多尺度预测并进一步平均得到查询的异常分割
在这里插入图片描述

此外,为了进行异常分类,结合 M W M^{W} MW的最大值和WinCLIP零样本分类得分。这两个分数具有互补的信息,特别是(a)一个来自小样本参考的空间特征,以及(b)另一个来自通过语言检索的CLIP知识:
在这里插入图片描述

3 Experiments

Zero-/few-shot anomaly classification
在这里插入图片描述

Zero-/few-shot anomaly segmentation
在这里插入图片描述

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

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

相关文章

Spring事务和事务传播机制(2)

前言🍭 ❤️❤️❤️SSM专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 在Spring框架中,事务管理是一种用于维护数据库操作的一致性和…

设计模式——接口隔离原则

文章目录 基本介绍应用实例应传统方法的问题和使用接口隔离原则改进 基本介绍 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上先看一张图: 类 A 通过接口 Interface1 依赖类 B,类 C 通过接口 Interface1 依赖类 D&…

shell脚本语句(画矩形、三角形、乘法表和小游戏)(#^.^#)

目录 一、语句 一、条件语句 一、以用户为例演示 一、显示当前登录系统的用户信息 二、显示有多少个用户 二、单分支if 一、输入脚本 二、验证结果 三、双分支if 一、输入脚本 二、验证结果 四、多分支if 一、输入脚本 二、验证 二、循环语句 一、shell版本的循环…

空调企业只干空调,卡萨帝却干了业主想不到的事

作者 | 曾响铃 文 | 响铃说 今年入夏以来,随着气温的不断攀升,空调已经成为生活、工作中的“绝对刚需”。由此而来的则是空调产品的销量大增。 但也有不少消费者表示,随着产品功能的越发相似,价格趋同,使空调变得越…

Postman 如何进行参数化

前言 Postman作为一款接口测试工具,受到了非常多的开发工程师的拥护。 那么做为测试,了解Postman这款工具就成了必要的了。 这篇文章就是为了解决Postman怎么进行参数化的。 全局变量 全局变量是将这个变量设置成整个程序的都可以用,不用去…

装箱和拆箱

1. 概念 装箱 将值类型转换成等价的引用类型 装箱的步骤 拆箱 将一个已装箱的引用类型转换为值类型,拆箱操作需要声明拆箱后转换的类型 拆箱的步骤 1)获取已装箱的对象的地址 2)将值从堆上的对象中复制到堆栈上的值变量中 2. 总结 装箱和拆箱…

C语言:指针(超深度讲解)

目录 指针: 学习目标: 指针可以理解为: 字符指针: 定义:字符指针 char*。 字符指针的使用: 练习: 指针数组: 概念:指针数组是一个存放指针的数组。 实现模拟二维…

NetApp EF 系列全闪存阵列 EF600 和 EF300 ——经济实惠、性能极高的全闪存存储系统、 适用于各种混合型企业工作负载

NetApp EF 系列全闪存阵列 EF600 和 EF300 ——经济实惠、性能极高的全闪存存储系统、 适用于各种混合型企业工作负载 功能强大且经济实惠的性能 NetApp EF600 全闪存阵列专为需要最高性能的工作负载而设计。NetApp EF300 阵列专为大数据分析和数据库等混合工作负载环境而设计…

AMBA总线协议(8)——AHB(六):分割传输

一、前言 在之前的文章中,我们重点介绍了AHB传输的仲裁,首先介绍了仲裁相关的信号,然后分别介绍了请求总线访问,授权总线访问,猝发提前终止,锁定传输和默认主机总线,在本文中我们将继续介绍AHB的…

网络编程套接字(1)

文章目录 网络编程套接字(1)1. 预备知识1.1 源IP与目的IP1.2 认识端口号1.3 理解 "端口号" 和 "进程ID"1.4 源端口号和目的端口号1.5 认识TCP协议和UDP协议(1) TCP(2) UDP 1.6 网络字节序 2. socket编程接口2.1 socket 常见API2.2 sockaddr结构 网络编程套…

.NET6.0 System.Drawing.Common 通用解决办法

最近有不少小伙伴在升级 .NET 6 时遇到了 System.Drawing.Common 的问题,同时很多库的依赖还都是 System.Drawing.Common ,而 .NET 6 默认情况下只在 Windows 上支持使用,Linux 上默认不支持这就导致在 Linux 环境上使用会有问题,…

低代码解放生产力,助力企业高效发展

近年来,随着数字化转型的推进,企业对于软件开发的需求日益显著。然而,传统的软件开发模式通常需要耗费大量时间和资源,限制了企业的快速响应能力。为了解决这一难题,低代码开发平台应运而生,成为企业和开发…

【沁恒蓝牙mesh】CH58x串口环形FIFO数据处理

本文章主要针对沁恒科技的CH58x芯片,以 BLE_UART 工程为依托,介绍串口数据的接收与处理。 该工程中 串口数据的处理用到了环形FIFO机制,可作为其他开发工具 📋 个人简介 💖 作者简介:大家好,我…

C++信息学奥赛1130:找第一个只出现一次的字符

这段代码的功能是找出输入字符串中第一个重复出现的字符&#xff0c;并输出该字符。 解析注释后的代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {string arr;getline(cin, arr); int a0;for(int i0;i<arr.length();i){for(int j0;j…

OpenEuler 卸载mysql

查询系统是否安装了MySQL rpm -qa | grep -i mysql 关闭mysql 查看MySQL服务运行状态 ps -ef | grep mysql 或者 service mysql status 没有启动 查看rpm包安装的mysql rpm -qa | grep -i mysql 将这些都卸载了 rpm -e mysql5-server rpm -e mysql5-errmsg rpm -e my…

PAT 1114 Family Property

个人学习记录&#xff0c;代码难免不尽人意 Sample Input: 10 6666 5551 5552 1 7777 1 100 1234 5678 9012 1 0002 2 300 8888 -1 -1 0 1 1000 2468 0001 0004 1 2222 1 500 7777 6666 -1 0 2 300 3721 -1 -1 1 2333 2 150 9012 -1 -1 3 1236 1235 1234 1 100 1235 5678 9012 …

【consul】

consul 一、什么是服务注册与发现1.11.2 二、 什么是consul2.1定义2.2特性2.2.1服务注册与发现&#xff1a;2.2.2健康检查&#xff1a;2.2.3Key/Value存储&#xff1a; 三、consul部署-datacenter &#xff1a;指定数据中心名称&#xff0c;默认是dc1。consul &#xff1a;指定…

leetcode做题笔记86分隔链表

给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x 3 输出&am…

文件四剑客

目录 前言 一、正则表达式 二、grep 三、find 四、sed 五、awk 前言 文件四剑客是指在计算机领域中常用的四个命令行工具&#xff0c;包括awk、find、grep和sed。它们在处理文本文件和搜索文件时非常强大和实用。 1. awk是一种强大的文本处理工具&#xff0c;它允许用户根据指…

【前端】深入理解CSS盒子模型与浮动

目录 一、前言二、盒子模型1、盒子模型组成1.1、border边框1.1.1、边框的三部分组成1.1.2、边框复合简写1.1.3、边框分开写1.1.4、表格的细线边框 1.2、padding内边距1.3、margin外边距1.3.1、外边距水平居中1.3.2、外边距合并1.3.3、嵌套块元素垂直 外边距的塌陷1.3.3.1、解决…