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

文章目录

  • 一、内容说明
  • 二、相关链接
  • 三、概述
  • 四、摘要
    • 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

七、结束

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue2-配置脚手架、分析脚手架、render函数、ref属性、props配置项、mixin配置项、scoped样式、插件

🥔:总有一段付出了没有回报的日子 是在扎根 更多Vue知识请点击——Vue.js VUE2-Day6 配置脚手架脚手架结构render函数vue.js与vue.runtime.xxx.js的区别引入render函数为什么要引入残缺的vue呢? 脚手架默认配置ref属性props配置项传递数据接收数据注意点…

【CI/CD】Rancher K8s

Rancher & K8s Rancher 和 K8s 的关系是什么?K8s 全称为 Kubernetes,它是一个开源的,用于管理云平台中多个主机上的容器化的应用。而 Rancher 是一个完全开源的企业级多集群 Kubernetes 管理平台,实现了 Kubernetes 集群在混合…

windows上的docker自动化部署到服务器脚本

1、mvn install后,双击这个bat,实现docker build后上传到124服务器,并且重启124服务器 **echo offsetlocal:: 定义镜像名称和版本变量 set IMAGE_NAMEweb set IMAGE_VERSION1.3.1:: 清理本地文件 echo Cleaning up... del service-%IMAGE_N…

高并发内存池项目(C++实战项目)

项目介绍 项目来源 本项目实现了一个高并发内存池,参考了Google的开源项目tcmalloc实现的简易版;其功能就是实现高效的多线程内存管理。由功能可知,高并发指的是高效的多线程,而内存池则是实现内存管理的。 tcmalloc源码 项目…

redis的基础命令01

1、操作库的指令 1、清除当前库---flushdb 2、清除所有库---flushAll 2、操作key的指令 最常用的指令get、set 1)set key value 2)get key 基础指令 1、del 删除单个:del key 、批量删除:del key1 key2 key3 2、exists 判断key是否…

pycharm配置conda虚拟环境

📕作者简介:热编程的贝贝,致力于C/C、Java、Python等多编程语言,热爱跑步健身,喜爱音乐的一位博主。 📗本文收录于贝贝的日常汇报系列,大家有兴趣的可以看一看 📘相关专栏深度学习、…

PoseiSwap 更新质押系统,并将在 8 月18 日开启“Trident ”快照

自 DeFi Summer 后,DeFi 设施整体的形态并未发生本质的变化,我们看到 DeFi 应用仍旧不具向外长期捕获价值、用户的能力,老旧叙事导致 DeFi 赛道整体的发展停滞不前。伴随着行业进入到下行周期,DeFi 赛道的资金、用户不断出逃&…

Zabbix监控tomcat

文章目录 一、安装部署TomcatTomcat二、安装Tomcat1.安装zabbix-agent收集监控数据(192.168.40.104)2.安装部署Zabbix-server(192.168.40.105)3.配置数据库 三、Zabbix监控Tomcat页面设置 实验环境 主机用途Centos7:192.168.40.105zabbix-server,zabbix-java-gatew…

【从零学习python 】48.Python中的继承与多继承详解

文章目录 在Python中,继承可以分为单继承、多继承和多层继承。单继承 继承语法多继承 语法格式使用多继承时需要注意以下事项Python中的MRO新式类和旧式(经典)类 进阶案例 在Python中,继承可以分为单继承、多继承和多层继承。 单…

超越传统测试方法:掌握最新的测试技术和工具

随着科技的不断进步和软件行业的快速发展,传统的测试方法已经无法满足现代软件开发的需求。为了提高测试的效率和准确性,测试人员需要及时掌握最新的测试技术和工具。本文将探讨一些创新的测试技术和工具,帮助测试人员超越传统的测试方法。 首…

【Windows系统编程】07.进程通信与线程同步

文章目录 进程通信邮槽剪切板 线程同步原子操作临界区事件信号量互斥体 进程通信 邮槽 进程一&#xff1a; // Process1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> #include <Windows.h>int main() {//创建…

【动态规划】两个数组问题

文章目录 动态规划&#xff08;两个数组问题&#xff09;1. 最长公共子序列2. 不相交的线3. 不同的子序列4. 交错字符串5. 两个字符串的最小ASCII和6. 最长重复子数组7. 通配符匹配 动态规划&#xff08;两个数组问题&#xff09; 1. 最长公共子序列 题目链接 状态表示 dp[i]…

8个免费的在线思维导图制作工具推荐,节省时间提高效率!

思维导图&#xff0c;也称为心智图或思维图&#xff0c;最初由英国的心理学家Tony Buzan提出。它是一种图形化的思维工具&#xff0c;旨在帮助我们组织信息、理解知识和激发创新思维。思维导图最大特点是其中心放射式的结构。一张思维导图通常由一个中心主题发散出各个子主题&a…

WebRTC | 网络传输协议RTP与RTCP

目录 一、UDP与TCP 1. TCP 2. UDP 二、RTP 1. RTP协议头 &#xff08;1&#xff09;V&#xff08;Version&#xff09;字段 &#xff08;2&#xff09;P&#xff08;Padding&#xff09;字段 &#xff08;3&#xff09;X&#xff08;eXtension&#xff09;字段 &#x…

jenkins使用

安装插件 maven publish over ssh publish over ssh 会将打包后的jar包&#xff0c;通过ssh推送到指定的服务器上&#xff0c;&#xff0c;在jenkins中设置&#xff0c;推送后脚本&#xff0c;实现自动部署jar包&#xff0c;&#xff0c; 装了这个插件之后&#xff0c;可以在项…

adb对安卓app进行抓包(ip连接设备)

adb对安卓app进行抓包&#xff08;ip连接设备&#xff09; 一&#xff0c;首先将安卓设备的开发者模式打开&#xff0c;提示允许adb调试 二&#xff0c;自己的笔记本要和安卓设备在同一个网段下&#xff08;同连一个WiFi就可以了&#xff09; 三&#xff0c;在笔记本上根据i…

【MT32F006】MT32F006之定时器延时

本文最后修改时间&#xff1a;2023年03月30日 一、本节简介 本文介绍如何使用MT32F006的定时器做us、ms级的延时。 二、实验平台 库版本&#xff1a;V1.0.0 编译软件&#xff1a;MDK5.37 硬件平台&#xff1a;MT32F006开发板&#xff08;主芯片MT32F006&#xff09; 仿真器…

Docker+Jmeter+InfluxDB+Grafana 搭建性能监控平台

当今互联网发展迅速&#xff0c;应用程序的性能监控显得越来越重要。 DockerJmeterInfluxDBGrafana 是一种常用的性能监控平台&#xff0c;可以帮助开发者快速搭建一套可靠的监控体系。在本文中&#xff0c;我们将介绍如何使用这些工具搭建性能监控平台&#xff0c;以便开发人…

初试rabbitmq

rabbitmq的七种模式 Hello word 客户端引入依赖 <!--rabbitmq 依赖客户端--><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.8.0</version></dependency> 生产者 imp…

DyLoRA:使用动态无搜索低秩适应的预训练模型的参数有效微调

又一个针对LoRA的改进方法&#xff1a; DyLoRA: Parameter-Efficient Tuning of Pretrained Models using Dynamic Search-Free Low Rank Adaptation https://arxiv.org/pdf/2210.07558v2.pdf https://github.com/huawei-noah/KD-NLP/tree/main/DyLoRA Part1前言 LoRA存在…