Learning Memory-guided Normality for Anomaly Detection

本文介绍了一种基于记忆模块的异常检测方法MNAD,该方法能够有效区分并记忆正常数据的多样性,避免将正常数据误判为异常。通过将正常数据划分为多种模式并存储在记忆单元中,模型能更好地理解和重构正常数据。

论文链接:Learning Memory-guided Normality for Anomaly Detection

开源代码:https://github.com/cvlab-yonsei/MNAD

创新点:提出了不同正常模式的记忆模块,可以有效地记忆正常数据的多样性。在这篇论文中,作者认为CNN特征的表达能力很强,很可能会将正常数据重构成异常数据。在这种情况下,他将正常数据分成若干种模式,也就是将正常数据予以区别,在记忆模块里表现为M个记忆单元(其实也就是M个特征向量)。当通过Encode提取到了CNN特征时,不是直接进行重构,而是从记忆单元中按照匹配概率(K个queries 与 M个items 的cosin相似度)读取信息,然后与原来的CNN特征在通道上连接,送入Decode中。这可以有效让模型理解正常数据,不至于将正常数据重构成异常数据。对于记忆模块的更新,它通过查询与记忆单元最近的queries(也就是一个个特征向量),利用这些queries更新记忆单元。

网络结构图
正常数据的多样性如图所示,左边是加了记忆模块,可以很好地区别正常数据,右边是没有记忆模块,不能理解正常数据地多样性。
在这里插入图片描述
实验结果:
在这里插入图片描述

根据已有信息,**DeSTSeg: Segmentation Guided Denoising Student-Teacher for Anomaly Detection** 是一种结合了学生-教师框架与去噪机制的异常检测方法,特别关注于语义分割引导的异常识别[^1]。该项目的核心思想是通过学生网络去噪教师网络的特征表示,并在异常输入上表现出较大的重建差异,从而实现有效的异常检测。 目前,该项目的代码尚未在主流平台(如 GitHub)上广泛传播,但可以通过以下几种方式寻找其实现: 1. **访问相关论文的发布页面**:许多研究者会在论文的项目页面或 arXiv 页面提供代码链接。可以尝试访问论文中提到的链接,例如作者的主页或机构库。 2. **GitHub 搜索**: - 使用以下关键词在 GitHub 上进行搜索: - `"DeSTSeg"` 或 `"Segmentation Guided Denoising Student-Teacher"` - `"anomaly detection student teacher segmentation"` - 高级搜索语法示例: ``` "DeSTSeg" in:name language:python ``` 3. **学术搜索引擎**: - 在 Google Scholar 或 Semantic Scholar 上搜索论文标题,并查看是否有“Code”或“Project”链接。 - 访问 [Papers with Code](https://paperswithcode.com/) 网站,搜索该论文名称,查看是否已有开源实现。 4. **社区与论坛**: - 在 [Stack Overflow](https://stackoverflow.com/)、[Reddit](https://www.reddit.com/r/MachineLearning/) 或 [Kaggle](https://www.kaggle.com/) 等平台上提问,询问是否有开发者实现过该模型- 在 GitHub Discussions 或相关开源项目的 Issues 中寻求帮助。 5. **复现代码**: - 如果官方代码不可得,可以尝试基于论文描述自行实现,或参考类似的学生-教师结构项目,如: - [DenseNet Student-Teacher Models](https://github.com/pytorch/vision) - [Anomaly Detection using Autoencoders](https://github.com/fastmachinelearning/VAE-AnomalyDetection) ### 示例代码结构(非官方实现) 以下是一个基于学生-教师结构的简化框架示例: ```python import torch import torch.nn as nn class Teacher(nn.Module): def __init__(self): super(Teacher, self).__init__() self.encoder = nn.Sequential( nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2) ) self.decoder = nn.Sequential( nn.ConvTranspose2d(64, 3, kernel_size=2, stride=2), nn.Sigmoid() ) def forward(self, x): encoded = self.encoder(x) decoded = self.decoder(encoded) return encoded, decoded class Student(nn.Module): def __init__(self): super(Student, self).__init__() self.encoder = nn.Sequential( nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1), nn.ReLU() ) self.decoder = nn.Sequential( nn.ConvTranspose2d(64, 3, kernel_size=2, stride=2), nn.Sigmoid() ) def forward(self, x): encoded = self.encoder(x) decoded = self.decoder(encoded) return decoded # 损失函数 criterion = nn.MSELoss() teacher = Teacher() student = Student() # 假设输入为 x with torch.no_grad(): t_encoded, t_decoded = teacher(x) s_decoded = student(x) loss = criterion(s_decoded, t_decoded.detach()) loss.backward() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值