【2023工业图像异常检测文献】DiAD: 基于扩散模型的多类异常检测方法
DiAD: A Diffusion-based Framework for Multi-class Anomaly Detection
1、Background
当前主流的三种异常检测方法:
- 基于合成的方法:在正常图像上合成异常,通过训练模型识别这些合成的异常来提高检测和定位能力。
- 基于嵌入的方法:将图像信息编码到特征空间中,使用预训练的网络提取特征,并计算特征的相似性作为异常分数。
- 基于重建的方法:训练模型在正常数据集上学习模式和特征,然后在测试阶段重建异常图像,通过比较重建图像和输入图像来定位异常。
最近,扩散模型展示了它们强大的图像生成能力。然而,直接使用当前主流的扩散模型无法有效解决多类别异常检测问题。
1)对于图1(a)中的去噪扩散概率模型(DDPM)(Ho、Jain和Abbeel,2020年),在执行多类别设置时,这种方法可能会遇到生成图像类别错误分类的问题。原因是在向输入图像添加T个时间步的噪声后,图像失去了其原始类别信息。在推理过程中,基于这种高斯噪声类分布进行去噪,可能会生成属于不同类别的样本。
2)潜在扩散模型(LDM)(Rombach等人,2022年)具有作为类别条件的嵌入器,如图1-(b)所示,它不存在DDPM中发现的类别错误分类问题。然而,LDM仍然无法解决生成图像中语义信息丢失的问题。LDM无法同时保留输入图像的语义信息和重建异常区域。例如,它们可能无法在螺丝和榛子等对象的方向上保持与输入图像的一致性,并且在纹理类别图像上与原始图像有显著差异。
为了解决上述问题,我们提出了一个基于扩散的框架DiAD,用于多类别异常检测和定位,如图2所示,包括三个组件:像素空间自动编码器、潜在空间去噪网络和特征空间ImageNet预训练模型。
为了在重建异常区域的同时有效地保持与原始图像一致的语义信息,我们提出了与稳定扩散(SD)去噪网络在LDM中连接的语义引导(SG)网络。
为了进一步提高保留原始图像细节和重建大规模缺陷的能力,我们提出了空间感知特征融合(SFF)块,以整合不同尺度的特征。
最后,通过预训练的模型传递重建和输入图像,以提取不同尺度的特征并计算异常分数。
supplements
去噪扩散概率模型(Denoising Diffusion Probabilistic Model, DDPM)、潜在扩散模型(Latent Diffusion Model, LDM)DiAD框架区别:
-
去噪扩散概率模型(DDPM):
- 包含两个过程:正向扩散过程和逆向去噪过程。
- 正向扩散过程通过逐步添加高斯噪声来生成噪声样本。
- 逆向去噪过程从添加了噪声的样本开始,通过模型预测的噪声分布来重建原始数据。
- 模型通过最小化预测噪声和实际噪声之间的差异来训练。
-
潜在扩散模型(LDM):
- 专注于低维潜在空间,并引入条件机制。
- 由预训练的自动编码器模型和去噪U-Net网络组成,后者基于注意力机制。
- 在潜在表示空间中进行扩散和去噪操作,然后通过解码器重建图像。
- 训练目标是最小化预测噪声和实际噪声之间的差异,同时考虑条件机制,如文本或图像。
-
DiAD框架的方法:
- 使用预训练的编码器将输入图像编码为潜在空间表示。
- 向潜在表示中添加噪声,然后使用与SG网络连接的SD去噪网络进行去噪处理。
- 去噪过程重复与扩散过程相同的时间步。
- 重建的潜在表示通过预训练的解码器恢复到原始图像水平。
- 在异常检测和定位方面,输入和重建图像被送入同一个预训练模型以提取不同尺度的特征并计算特征差异。
2、Method
DiAD框架通过结合像素空间的自动编码器、潜在空间的语义引导网络和特征空间的预训练特征提取器,实现了对异常区域的有效重建和检测。SFF块的引入进一步提高了模型在不同尺度上的特征融合能力,从而提高了异常检测的准确性。
DiAD框架的设计:
-
DiAD框架的组成:
- 像素空间自动编码器:用于将输入图像编码和解码。
- 潜在空间语义引导(SG)网络:与稳定扩散(SD)去噪网络相连,用于重建异常区域并保留原始图像的语义信息。
- 特征空间预训练特征提取器:用于从输入和重建图像中提取特征并生成异常图。
-
SG网络的设计:
- 为了解决多类别异常检测中的问题,SG网络被提出以改善LDM在重建异常区域时保留输入图像语义信息的能力。
- 输入图像首先被编码为潜在空间表示,然后通过添加噪声进行正向扩散过程。
- 在逆向去噪过程中,SG网络和SD去噪网络共同工作,以重建图像并恢复其原始结构。
-
空间感知特征融合(SFF)块:
- 为了同时保留原始样本的正常信息和重建大规模异常区域,提出了SFF块。
- SFF块通过整合不同尺度的特征来增强模型在不同场景下的重建能力,无论是细节纹理还是大面积缺陷。
-
异常检测和定位:
- 在推理阶段,通过扩散和去噪过程获得重建图像。
- 使用预训练的特征提取器从输入图像和重建图像中提取特征,并计算不同尺度特征图上的差异,以生成异常图。
- 通过计算特征图之间的余弦相似性来得到异常分数,从而实现异常检测和定位。
pseudo-code
import torch
import torch.nn as nn
from torchvision import models# 假设我们有一个预训练的自动编码器,它由编码器E和解码器D组成
class AutoEncoder(nn.Module):def __init__(self):super(AutoEncoder, self).__init__()self.encoder = ...self.decoder = ...def forward(self, x):encoded = self.encoder(x)decoded = self.decoder(encoded)return decoded# 假设我们有一个预训练的特征提取器
class FeatureExtractor(nn.Module):def __init__(self):super(FeatureExtractor, self).__init__()# 通常使用预训练的模型,如ResNetself.model = models.resnet50(pretrained=True)# 冻结所有层,只使用特征提取部分for param in self.model.parameters():param.requires_grad = Falsedef forward(self, x):return self.model(x)# 假设我们有一个语义引导网络SG和稳定扩散网络SD
class SGNetwork(nn.Module):def __init__(self):super(SGNetwork, self).__init__()# 定义SG网络的结构...def forward(self, z):# SG网络的前向传播...class SDNetwork(nn.Module):def __init__(self):super(SDNetwork, self).__init__()# 定义SD网络的结构...def forward(self, z_noisy):# SD网络的前向传播...# 异常检测的主要流程
def anomaly_detection(input_image):# 步骤1: 使用自动编码器的编码器部分将输入图像编码为潜在表示latent_representation = autoencoder.encoder(input_image)# 步骤2: 使用SG网络和SD网络重建潜在表示reconstructed_latent = sg_network(latent_representation)reconstructed_latent = sd_network(reconstructed_latent)# 步骤3: 使用自动编码器的解码器部分重建图像reconstructed_image = autoencoder.decoder(reconstructed_latent)# 步骤4: 使用预训练的特征提取器提取输入图像和重建图像的特征features_input = feature_extractor(input_image)features_reconstructed = feature_extractor(reconstructed_image)# 步骤5: 计算特征之间的差异,得到异常分数anomaly_score = calculate_anomaly_score(features_input, features_reconstructed)return anomaly_score# 辅助函数:计算异常分数
def calculate_anomaly_score(features_input, features_reconstructed):# 这里简化为使用余弦相似度作为异常分数的计算方式anomaly_score = 1 - nn.CosineSimilarity(dim=1)(features_input, features_reconstructed)return anomaly_score# 初始化模型
autoencoder = AutoEncoder()
feature_extractor = FeatureExtractor()
sg_network = SGNetwork()
sd_network = SDNetwork()# 假设input_image是已经预处理的输入图像张量
input_image = ...# 执行异常检测
anomaly_score = anomaly_detection(input_image)
3、Experiments
🐂🐎。。。
4、Conclusion
- 提出了一个新颖的基于扩散的框架DiAD,用于多类别异常检测,首先解决了现有扩散方法的去噪网络无法正确重建异常的问题。
- 构建了一个连接到SD去噪网络的SG网络,以保持一致的语义信息并重建异常。
- 提出了一个SFF块,整合不同尺度的特征,进一步提高异常重建能力。
相关文章:

【2023工业图像异常检测文献】DiAD: 基于扩散模型的多类异常检测方法
DiAD: A Diffusion-based Framework for Multi-class Anomaly Detection 1、Background 当前主流的三种异常检测方法: 基于合成的方法:在正常图像上合成异常,通过训练模型识别这些合成的异常来提高检测和定位能力。基于嵌入的方法ÿ…...

三相继电保护机 继电器保护校验仪 微机继电保护测试仪
性能特点 电压电流输出灵活组合 输出达4相电压3相电流,可各种组合实现常规4相电压3相电流型输出模式,既可兼容传统的各种试验方式,也可方便地进行三相变压器差动试验和厂用电快切和备自投试验。 操作方式装置直接外接笔记本电脑或台式机进行…...

MyEclipse中讲解Git使用——结合GitLab
1、什么是Git Git是分布式版本控制系统 Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 2、在myeclipse安装Git插件 下载该文件,将egit.zip解压放入 myeclipse安装路径>dropins>下重新启动myeclipse EGit -…...
pdf转为txt文本格式并使用base64加密输出数据
第一步,pom.xml中引入jar包 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.24</version></dependency> 第二步 package org.example.test.example.changefile;…...

SpringBoot篇(运维实用篇 - 临时属性)
目录 一、临时属性设置 1. 简介 2. 属性加载优先级 那是否还有其他的配置方式呢? 3. 知识小结 二、开发环境中使用临时属性 1. 如何操作 2. 知识小结 3. 思考 三、配置文件分类 1. 简介 2. 4个级别 3. 为什么设计多种配置文件? 一个典型的应…...

MySQL定时异机备份
场景:将A机器MySQL数据库部分表每日定时备份到B机器上 (只适用于Linux) 实现方式算是比简单了,就是用mysqldump生成文件,使用scp命令传输到另一台机器上。 1. 编写备份shell脚本 在A机器新建脚本 (当然没有vim的话vi…...

MMA: Multi-Modal Adapter for Vision-Language Models
两个观察 图1所示。各种基于transformer的CLIP模型中不同层的数据集级识别精度。这个实验是为了确定样本属于哪个数据集。我们用不同的种子运行了三次,并报告了每层识别精度的平均值和标准差。 X E m b e d XEmbed XEmbed是指变压器块之前的文本或图像嵌入层&#x…...
uniapp通过id获取div的宽度,高度,位置等(应该是 任意平台都通用 )
uniapp通过id获取div的宽度,高度,位置等(应该是 任意平台都通用 ) <template><view class"" id"domId"></view> </template>// 如果获取的dome高度等不对,还需要加上延迟…...

Python Transformer 模型的基本原理:BERT 和 GPT 以及它们在情感分析中的应用
Transformer 模型的基本原理:BERT 和 GPT 以及它们在情感分析中的应用 近年来,Transformer 模型在自然语言处理(NLP)领域取得了巨大成功,为任务如翻译、生成文本、问答和情感分析带来了显著的性能提升。本文将介绍 Tr…...

【云原生】Kubernets1.29部署StorageClass-NFS作为存储类,动态创建pvc(已存在NFS服务端)
文章目录 在写redis集群搭建的时候,有提到过使用nfs做storageclass,那时候kubernetes是1.20版本,https://dongweizhen.blog.csdn.net/article/details/130651727 现在使用的是kubernetes 1.29版本,根据之前的修改方式并未生效,反而提示:Error: invalid argument "Re…...
使用 Pandas 进行时间序列分析的 10个关键点
使用Pandas进行时间序列分析的10个关键点(由于篇幅限制,这里调整为10个,但实际操作中可能涉及更多细节)如下: 1. 创建时间序列数据 时间序列数据是指在多个时间点上形成的数值序列。在Pandas中,可以使用t…...
使用 Mermaid 语言描述 AGI 系统架构图
使用Mermaid语言描述AGI系统架构图 一、整体架构概述 以下是一个简化的AGI(Artificial General Intelligence,通用人工智能)系统架构的Mermaid描述。该系统主要包括数据收集与预处理、模型训练、推理与决策以及交互接口等模块,各…...
绘制线性可分支持向量机决策边界图 代码解析
### 绘制线性可分支持向量机决策边界图 def plot_classifer(model, X, y):# 超参数边界x_min -7x_max 12y_min -12y_max -1step 0.05# meshgridxx, yy np.meshgrid(np.arange(x_min, x_max, step),np.arange(y_min, y_max, step))# 模型预测z model.predict(np.c_[xx.ra…...

No.23 笔记 | WEB安全 - 任意文件漏洞 part 5
本文全面且深入地探讨了文件上传漏洞相关知识。从基础概念出发,清晰地阐述了文件上传漏洞的定义及其产生的本质原因,同时列出了该漏洞成立的必要条件。详细说明了文件上传漏洞可能对服务器控制权、网站安全以及业务运营带来的严重危害。 文中还深入解析了…...
EasyPlayer.js网页播放器,支持FLV、HLS、WebSocket、WebRTC、H.264/H.265、MP4、ts各种音视频流播放
EasyPlayer.js功能: 1、支持解码H.264视频(Baseline, Main, High Profile全支持,支持解码B帧视频) 2、支持解码H.265视频(flv id 12) 3、支持解码AAC音频(LC,HE,HEv2 Profile全支持) 4、支持解码MP3音频以及Speex音频格式 5、可…...
WPF数据绑定的五大模式
WPF(Windows Presentation Foundation)是微软推出的一种用于构建Windows用户界面的UI框架。它支持数据绑定,允许开发者将UI元素与数据源绑定,从而实现数据和界面的自动同步。WPF数据绑定有几种不同的模式, 以下是五种…...

从零到一:大学新生编程入门攻略与成长指南
文章目录 每日一句正能量前言编程语言选择:为大学新生量身定制Python:简单而强大的选择JavaScript:Web开发的基石Java:面向对象的经典C#:微软的全能选手 学习资源推荐:编程学习的宝藏在线课程教程和文档书籍…...

详细分析Pytorch中的transpose基本知识(附Demo)| 对比 permute
目录 前言1. 基本知识2. Demo 前言 原先的permute推荐阅读:详细分析Pytorch中的permute基本知识(附Demo) 1. 基本知识 transpose 是 PyTorch 中用于交换张量维度的函数,特别是用于二维张量(矩阵)的转置操…...

初识WebGL
思路: 构建<canvas>画布节点,获取其的实例。使用getWebGLContext() 拿到画布上下文。拿到上下文用clearColor() 设置背景颜色。最后清空canvas画布,是为了清除颜色缓冲区。 html结构: <!DOCTYPE html> <html lang"en&…...

【力扣】Go语言回溯算法详细实现与方法论提炼
文章目录 一、引言二、回溯算法的核心概念三、组合问题1. LeetCode 77. 组合2. LeetCode 216. 组合总和III3. LeetCode 17. 电话号码的字母组合4. LeetCode 39. 组合总和5. LeetCode 40. 组合总和 II小结 四、分割问题6. LeetCode 131. 分割回文串7. LeetCode 93. 复原IP地址小…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...