一个模型解决所有类别的异常检测

文章目录

  • 一、内容说明
  • 二、相关链接
  • 三、概述
  • 四、摘要
    • 1、现有方法存在的问题
    • 2、方案
    • 3、效果
  • 五、作者的实验
  • 六、如何训练自己的数据
    • 1、数据准备
    • 2、修改配置文件
    • 3、代码优化修改
    • 4、模型训练与测试
  • 七、结束

一、内容说明

  • 在我接触的缺陷检测项目中,检测缺陷有两种方法。一种是使用传统方法,采用去噪、二值化、轮廓检测等,但传统方法很受阈值的影响,往往这张图片适用,那张图片就不行,很难调好阈值。另外一种是使用深度学习方法,例如本篇文章的UniAD,也有朋友使用语义分割的方式。
  • 在本文章,我将会介绍无监督缺陷检测算法UniAD的创新点、网络以及如何应用在自己的项目中。
  • 最后来一句“决定我们自身的不是过去的经历,而是我们自己赋予经历的意义”,来自《被讨厌的勇气》

二、相关链接

   论文名称:《A Unified Model for Multi-class Anomaly Detection》
   Github:https://github.com/zhiyuanyou/UniAD
   Paper:https://arxiv.org/abs/2206.03687.pdf

三、概述

  UniAD是由一个邻居掩码编码器(NME) 和一个分层查询解码器(LQD) 组成。
  首先,由固定的预训练骨干网络提取的特征token被NME进一步整合,以得出编码器嵌入。然后,在LQD的每一层中,可学习的查询嵌入与编码器嵌入和前一层的输出相继融合(第一层为自我融合)。特征融合是由邻居掩码注意力(NMA)完成的。LQD的最终输出被看作是重构的特征。此外,还提出了一个特征抖动(FJ)策略,向输入特征添加扰动,引导模型从去噪任务中学习正态分布。最后,通过重建差异得到异常定位和检测的结果
  通俗说法:我已经学习了正常图片是什么样子,输入一张缺陷图,我就重构出它的正常图,将正常图和输入图做对比,不就知道哪里有缺陷了😄

图1

图1

图1说明:
 (a)图是已经存在的方法,图片中有两种图片类型,分别是青色和蓝色,需要两个边界,才能区分两种类型图片的缺陷
 (b)图是该论文提出的方法,用一个边界就能区分所有类别图片
 (c)图说明在以前的方法里,解决多类型图片缺陷的方法,一种缺陷类型使用一个模型,多个类型用多个模型识别, one-class-one-model
 (d)图是该论文的重点,用一个统一的模型识别所有缺陷,a unified framework

四、摘要

1、现有方法存在的问题

   已有的重构方法存在 “identity shortcut” 的问题,即重构的图片和输入图片差不多,像是对输入图片的复制,图片越复杂,这个问题越严重

2、方案

(1)提出了“layer-wise query decoder”(分层查询解码器)
   看下文图2的(a)图,MLP和CNN的曲线逐渐上升,突然下降,Transformer也有下降,但下降幅度要小些。曲线下降主要还是上文提到的“identity shortcut”问题。Ours方法就基本不存在曲线下降问题。
在这里插入图片描述

图2

(2)采用了“neighbor masked attention”模块(邻居掩码注意力)

   特征不跟自己相关,也不跟邻居相关,避免了information leak。

  请看图3,Query是4x4,与Key做Attention操作时,相邻的值进行mask,将注意力图Attention Map展开。

  话外题:联想常见的Transformer结构,Mask主要有两种作用。第一种是 padding mask ,在encoder和decoder中使用,保证输入长度的一致性;另外一种是 Sequence mask ,在decoder中使用,掩盖当前词后面出现的词。这么一对比就看出作者的mask改动了什么。

在这里插入图片描述

图3

(3)“feature jittering strategy”(特征抖动策略)

  受Bengio的启发,提出了一个“feature jittering strategy”(特征抖动策略),在有噪声的情况下也能恢复源信息

3、效果

  用UniAD模型在15个类别的数据集MVTec-AD上做实验,AUROC分别从88.1%提升到 96.5%,从 89.5%提升到96.8%

五、作者的实验

  Normal正常图片;Anomaly异常图片;Recon重构图;GT标注的mask图;Pred是Anomaly和Recon差异图,对缺陷进行定位,颜色越深,表示缺陷的概率越大。效果看起来,so nice
在这里插入图片描述

图4
  下图是作者做的消融实验,不细讲,看图

在这里插入图片描述

图5

六、如何训练自己的数据

  图6是我在自己的数据上做的训练,数据特点是:缺陷图片少、缺陷小,效果还是可以的
在这里插入图片描述

图6
那么如何在自己的数据上做训练呢?

1、数据准备

  • 进入./data/创建新文件夹/ (可参考./data/MVTec-AD/)
  • 创建train.json、test.json文件,格式如下:
    {"filename": "000_00_00/train/good/bad_02_0419_Image_20230419104815488_0_0_1280_1280.png", "label": 0, "label_name": "good", "clsname": "000_00_00"}{"filename": "000_02_01/train/good/good_06_0421_Image_20230420180152737_922_563_2202_1843.png", "label": 0, "label_name": "good", "clsname": "000_02_01"}...
    字段说明
      filename:图片路径
      label:标签(0无缺陷、1缺陷)
      label_name:标签名称(good无缺陷、bad缺陷)
      clsname:图片类型名称

2、修改配置文件

  • 进入cd ./experiments/创建新文件夹/ (具体可参考cd ./experiments/MVTec-AD/,将MVTec-AD的文件复制到自己文件夹)
  • 修改config.yaml,如图7
    在这里插入图片描述
图7

修改说明

  image_dir:训练图片路径
  meta_file:训练和测试的json文件

3、代码优化修改

  预训练模型提取特征时,卷积采用zero-padding会导致边界引入新信息,造成误检。文献提出使用reflection_padding可降低边界误检,在github代码中还未修改,需要手动修改。
代码路径:./models/efficientnet/utils.py
原代码

self.static_padding = nn.ZeroPad2d((pad_w // 2, pad_w - pad_w // 2, pad_h // 2, pad_h - pad_h // 2))

修改为

self.static_padding = nn.ReflectionPad2d((pad_w // 2, pad_w - pad_w // 2, pad_h // 2, pad_h - pad_h // 2))

4、模型训练与测试

  • 模型训练:
       1. cd ./experiments/自己的文件夹/
       2. sh train_torch.sh #NUM_GPUS #GPU_IDS
      例子:sh train_torch.sh 1 0(#NUM_GPUS:gpu个数,#GPU_IDS:gpu编号)
  • 模型测试 :
       sh eval_torch.sh #NUM_GPUS #GPU_IDS

七、结束

   如果文章对你有所帮助,请记得点赞收藏哦,手动笔芯❤️❤️❤️

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

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

相关文章

网络通信基础

1.网络结构模式(C/S和B/S) (1)C/S结构模式 服务器 - 客户机,即 Client - Server(C/S)结构。 优点: 能充分发挥客户端 PC 的处理能力,很多工作可以在客户端处理后再提交给服务器&#xff…

02 qt基本控件及信号和槽

一 QString类 功能:显示一个字符串内容 主要接口函数 构造函数: QString(const char *str)QString(const QString &other)赋值运算符重载: QString &operator=(const QString &other)功能函数: 1&

如何完善餐饮门店的进店服务,请看餐饮神秘顾客如何专业检测?

神秘顾客检测能够评估餐饮门店实际运营状况和顾客体验。但是,并不是所有的神秘顾客都能够圆满完成门店的各项检测任务。如果神秘顾客在执行过程中进展不顺,可能是没有把握重点,神秘顾客调查是群狼调研(长沙快餐连锁神秘顾客)优势业务之一&…

C++字符串转换总结

以下C字符串转换均在unicode编码下进行 目录 string转wstringwstring转stringMFC CString转wstringMFC CString转stringMFC const char*转CStringMFC CString转const char*char、wchar_t数组转stringTCHAR数组转到CStringCString转为TCHAR数组 string转wstring 当在 Unicode 下…

大数据-玩转数据-Flink RedisSink

一、添加Redis Connector依赖 具体版本根据实际情况确定 <dependency><groupId>org.apache.flink</groupId><artifactId>flink-connector-redis_2.11</artifactId><version>1.1.5</version> </dependency>二、启动redis 参…

如何提高深度学习性能

可用于 对抗过度拟合并获得更好泛化能力的20 个提示、技巧和技术 如何从深度学习模型中获得更好的性能? 这是我最常被问到的问题之一。 可能会被问为: 如何提高准确率? ……或者可以反过来说: 如果我的神经网络表现不佳该怎么办? 我经常回答说:“我不太清楚,但我有很…

分类预测 | MATLAB实现DBN-SVM深度置信网络结合支持向量机多输入分类预测

分类预测 | MATLAB实现DBN-SVM深度置信网络结合支持向量机多输入分类预测 目录 分类预测 | MATLAB实现DBN-SVM深度置信网络结合支持向量机多输入分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.分类预测 | MATLAB实现DBN-SVM深度置信网络结合支持向量机多输入分…

工作纪实36-ES跨集群迁移

1.es数据备份、恢复 https://blog.csdn.net/andy_only/article/details/111319175 2.reindex命令 https://codeleading.com/article/40964498185/ 添加配置、重启ES cd bin sh elasticsearch -d3.开源工具 https://github.com/elasticsearch-dump/elasticsearch-dump 4.…

回归预测 | MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测

回归预测 | MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测 目录 回归预测 | MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于SAE堆叠自编辑器多输入单输出回归预测&#xff1b; 2.运行环…

Request+Response

文章目录 1. 介绍2. Request对象2.1 Request继承体系2.2 Request获取请求数据1.获取请求行2.获取请求头3.获取请求体4. 请求参数的通用方式5. 解决中文乱码问题 2.3 Request请求转发请求转发资源间共享数据: 3. Response对象3.0 Response 继承体系3.1 Response设置响应数据的功…

使用GEWE框架进行个人微信收藏夹及标签管理(收藏夹篇)适用于微信群管、社群管理

友情链接&#xff1a;geweapi.com 点击即可访问&#xff01; 如果个人有多个微信&#xff0c;进行收藏夹管理是非常麻烦的事情&#xff0c;这时候可以用得到GEWE框架的管理模块&#xff01;下面来看一下使用方法吧~ 获取收藏信息 小提示&#xff1a; 获取收藏相关信息注意&am…

iOS手机无法安装Charles 的ssl证书

问题描述 iOS客户端安装证书时一直卡在下载这一步&#xff0c;无法抓包 1、打开Charles&#xff0c;选择help→SSL Proxying→Install Charles Root Certificate on a Mobile Device or Remote Browser 2、按照步骤1中的提示进行操作&#xff0c;手机连接电脑代理&#xff0c;…

Spring系列七:声明式事务

&#x1f418;声明式事务 和AOP有密切的联系, 是AOP的一个实际的应用. &#x1f432;事务分类简述 ●分类 1.编程式事务: 示意代码, 传统方式 Connection connection JdbcUtils.getConnection(); try { //1.先设置事务不要自动提交 connection.setAutoCommit(false…

ZooKeeper的应用场景(分布式锁、分布式队列)

7 分布式锁 分布式锁是控制分布式系统之间同步访问共享资源的一种方式。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源&#xff0c;那么访问这些资源的时候&#xff0c;往往需要通过一些互斥手段来防止彼此之间的干扰&#xff0c;以保证一致性&#xff0c;…

岛屿的最大面积(力扣)递归 JAVA

给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0&#xff08;代表水&#xff09;包围着。 岛屿的面积是岛上值为 1 的…

error_Network Error

此页面为订单列表&#xff0c;是混合开发(页面嵌入在客户端中) 此页面为订单列表&#xff0c;此需求在开发时后端先将代码发布在测试环境&#xff0c;我在本地调试时调用的后端接口进行联调没有任何问题。 此后我将代码发布在测试环境&#xff0c;在app中打开页面&#xff0c…

vue echarts中按钮点击后修改值 watch数据变化后刷新图表

1 点击按钮 {feature: {myBtn1: {show: true,title: 反转Y轴,showTitle: true,icon: path://M512 0A512 512 0 1 0 512 1024A512 512 0 0 0 512 0M320 320V192h384v128zM128 416V288h256v128zM320 704V576h384v128zM128 800V672h256v128z,onclick: () > {dataSetting.rever…

nginx服务器报错502 Bad Gateway的原因以及解决办法

服务器报错nginx 502 Bad Gateway的原因以及解决办法_502 bad gateway nginx_主题模板站的博客-CSDN博客

C++学习笔记总结练习:effective 学习日志

准则 1.少使用define define所定义的常量会在预处理的时候被替代&#xff0c;出错编译器不容易找到错误。而且还没有作用范围限制&#xff0c;推荐使用constdefine宏定义的函数&#xff0c;容易出错&#xff0c;而且参数需要加上小括号&#xff0c;推荐使用inline有的类中例如…

已经开源的中文大模型对比,支持更新

大模型下载&#xff1a;互链高科 ClueAI/PromptCLUE-base-v1-5 at main (huggingface.co) 支持多任务生成&#xff0c;支持中文&#xff0c;不支持多轮对话&#xff0c;体验&#xff1a;ClueAI (cluebenchmarks.com) 基于promptclue-base进一步训练的模型&#xff1a;ClueAI/Ch…