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

news2024/11/24 16:23:02

文章目录

  • 一、内容说明
  • 二、相关链接
  • 三、概述
  • 四、摘要
    • 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.coloradmin.cn/o/904502.html

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

相关文章

TMS320C54X 的软件编程

1、DSP 编程工具与流程 DSP 的设计目标是进行数字信号处理,在硬件设计的基础上选择好一定的优化算法并 通过编程在 DSP 芯片上实现是 DSP 技术的核心内容。对 DSP 进行编程,目前最有效的语言 工具仍是 DSP 汇编语言,同时为方便用户用高级语言…

每日一题之数值的整数次方

数值的整数次方 描述: 实现函数 double Power(double base, int exponent),求 base 的 exponent 次方。 注意: 1.保证base和exponent不同时为0。 2.不得使用库函数,同时不需要考虑大数问题 3.有特殊判题,不用考虑小数…

mysql+jdbc+servlet+java实现的学生在校疫情信息打卡系统

摘 要 I Abstract II 主 要 符 号 表 i 1 绪论 1 1.1 研究背景 1 1.2 研究目的与意义 2 1.3 国内外的研究情况 2 1.4 研究内容 2 2 系统的开发方法和关键技术 4 2.1 开发方法 4 2.1.1 结构化开发方法 4 2.1.2 面向对象方法 4 2.2 开发技术 4 2.2.1 小程序开发MINA框架 4 2.2.2 …

[Spring]事务相关

事务隔离级别 Spring 提供了以下五种事务隔离级别,用于控制多个事务之间的相互影响: DEFAULT(默认隔离级别): 使用底层数据库的默认隔离级别。通常为数据库的默认隔离级别,如 MySQL 是 REPEATABLE READ&am…

逆向退货售后设计

一,项目背景 退货售后流程:涉及订单,票,款 二,方案一 三,方案二

残差网络实现

代码中涉及的图片实验数据下载地址:https://download.csdn.net/download/m0_37567738/88235543?spm1001.2014.3001.5501 代码: import torch import torch.nn as nn import torch.nn.functional as F #from utils import load_data,get_accur,train i…

只需5分钟,了解常见的四种限流算法

一、计数器算法 在指定周期内累加访问次数,当访问次数达到设定的阈值时,触发限流策略,当进入下一个时间周期时进行访问次数的清零。如图所示,我们要求3秒内的请求不要超过150次: 但是,貌似看似很“完美”的…

[mysql系列] mysql 数据库如何实现事务回滚

这里写自定义目录标题 一、事务回滚二、mysql InnoDB引擎如何实现回滚操作2.1 InnoDB引擎的 undo log2.2 具体实现2.2.1 insert 操作2.2.2 delete 操作2.2.3 update 操作 主要参考资料为:《Mysql 是怎样运行的》 一、事务回滚 根据原子性的定义,一个事务…

MySQL MVCC的详解之Read View

文章目录 概要一、基于UNDO LOG的版本链1.1、行记录结构1.2、了解UNDO LOG1.3、版本链 二、Read View2.1、判定机制 三、参考 概要 在上文中,我们提到了MVCC(Multi-Version Concurrency Control)多版本并发控制,是通过undo log来实现的。那具…

MATLAB | 七夕节用MATLAB画个玫瑰花束叭

Hey又是一年七夕节要到了,每年一次直男审美MATLAB绘图大赛开始hiahiahia,真的这些代码越写越不知道咋写,又不想每年把之前的代码翻出来再发一遍,于是今年又对我之前写的老代码进行了点优化组合,整了个花球变花束&#…

计算机网络-物理层(三)-信道的极限容量

计算机网络-物理层(三)-信道的极限容量 当信号在信道中传输失真不严重时,在信道的输出端,这些信号可以被识别 当信号在信道中,传输失真严重时,在信道的输出端就难以识别 造成失真的因素 码元传输速率信号传输距离噪声干扰传输媒…

8.4.tensorRT高级(3)封装系列-infer推理封装,输入输出tensor的关联

目录 前言1. infer封装总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习 tensorRT 高级-infer推理封装,输入输出…

思维进化算法(MEA)优化BP神经网络

随着计算机科学的发展,人们借助适者生存这一进化规则,将计算机科学和生物进化结合起来,逐渐发展形成一类启发式随机搜索算法,这类算法被称为进化算法(Evolutionary Com-putation, EC)。最著名的进化算法有:遗传算法、进化策略、进化规划。与传统算法相比,进化算法的特点是群体搜…

嵌入式设备应用开发(boost库应用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 嵌入式开发过程中不可避免在很多情况下,需要使用到posix的api函数。一方面,这些api函数确实可以帮助我们解决一些问题;但是另外一方面,因为平台的差异,如果一段时间不做嵌入式…

Java集合利器 Map Set

Map & Set 一、概念二、Map三、Set下期预告 一、概念 Map和Set是一种专门用来进行搜索的数据结构,其搜索的效率与其具体的实例化子类有关。它们分别定义了两种不同的数据结构和特点: Map(映射) :Map是一种键值对&…

Spring高手之路13——BeanFactoryPostProcessor与BeanDefinitionRegistryPostProcessor解析

文章目录 1. BeanFactoryPostProcessor 概览1.1 解读 BeanFactoryPostProcessor1.2. 如何使用 BeanFactoryPostProcessor 2. BeanDefinitionRegistryPostProcessor 深入探究2.1 解读 BeanDefinitionRegistryPostProcessor2.2 BeanDefinitionRegistryPostProcessor 的执行时机2.…

Redis+SpringBoot企业版集群实战------【华为云版】

目录 安装 复制及集群 bgsave rdb aof SpringBoot+Redis操作

斯特林近似(Stirling‘s approximation)

斯特林公式(Stirling’s approximation)是一条用来取n的阶乘的近似值的数学公式。一般来说,阶乘的计算复杂度为线性。当要为某些极大的n求阶乘时,常见的方法复杂度不可接受。斯特林公式能够将求解阶乘的复杂度降低到对数级。而且&…

在云服务器上安装Jenkins

说明:Jenkins是一个部署项目的平台,通过Jenkins可以省去从项目开发–>部署项目之间的所有流程,做到代码提交即上线。本文介绍在云服务CentOS上安装Jenkins。 前提 安装Jenkins之前,先要在云服务上安装JDK、Maven、Git&#x…

SpringAOP原理:手写动态代理实现

0、基础知识 AOP我们知道,是在不修改源代码的情况下,为代码添加一些新功能的技术。通过动态代理,可以在不修改原始类代码的前提下,对方法进行拦截和增强。 动态代理常用于在不改变原有业务逻辑的情况下,对方法…