【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地址小…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
OPENCV图形计算面积、弧长API讲解(1)
一.OPENCV图形面积、弧长计算的API介绍 之前我们已经把图形轮廓的检测、画框等功能讲解了一遍。那今天我们主要结合轮廓检测的API去计算图形的面积,这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能,常用的API…...
比较数据迁移后MySQL数据库和ClickHouse数据仓库中的表
设计一个MySQL数据库和Clickhouse数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
Python爬虫(四):PyQuery 框架
PyQuery 框架详解与对比 BeautifulSoup 第一部分:PyQuery 框架介绍 1. PyQuery 是什么? PyQuery 是一个 Python 的 HTML/XML 解析库,它采用了 jQuery 的语法风格,让开发者能够用类似前端 jQuery 的方式处理文档解析。它的核心特…...
实现p2p的webrtc-srs版本
1. 基本知识 1.1 webrtc 一、WebRTC的本质:实时通信的“网络协议栈”类比 将WebRTC类比为Linux网络协议栈极具洞察力,二者在架构设计和功能定位上高度相似: 分层协议栈架构 Linux网络协议栈:从底层物理层到应用层(如…...
边缘计算设备全解析:边缘盒子在各大行业的落地应用场景
随着工业物联网、AI、5G的发展,数据量呈爆炸式增长。但你有没有想过,我们生成的数据,真的都要发回云端处理吗?其实不一定。特别是在一些对响应时间、网络带宽、数据隐私要求高的行业里,边缘计算开始“火”了起来&#…...
Java多线程从入门到精通
一、基础概念 1.1 进程与线程 进程是指运行中的程序。 比如我们使用浏览器,需要启动这个程序,操作系统会给这个程序分配一定的资源(占用内存资源)。 线程是CPU调度的基本单位,每个线程执行的都是某一个进程的代码的某…...
