Learning Memory-guided Normality for Anomaly Detection 论文阅读

Learning Memory-guided Normality for Anomaly Detection

  • 摘要
  • 1.介绍
  • 2.相关工作
  • 3.方法
    • 3.1网络架构
      • 3.1.1 Encoder and decoder
      • 3.1.2 Memory
    • 3.2. Training loss
    • 3.3. Abnormality score
  • 4.实验
  • 5.总结
  • 总结&代码复现:

文章信息:

在这里插入图片描述

发表于:cvpr2020
原文:https://arxiv.org/abs/2003.13228
代码:https://github.com/cvlab-yonsei/MNAD

摘要

我们致力于解决异常检测的问题,即在视频序列中检测异常事件。基于卷积神经网络(CNNs)的异常检测方法通常利用代理任务,比如重建输入视频帧,以在训练时学习描述正常情况的模型,而不在训练时接触异常样本,并在测试时利用重建误差来量化异常的程度。这些方法的主要缺点是它们未明确考虑正常模式的多样性,而CNNs强大的表示能力允许其重建异常视频帧。为了解决这个问题,我们提出了一种无监督学习方法来进行异常检测,明确考虑了正常模式的多样性,同时减小了CNNs的表示能力。为此,我们建议使用一个具有新的更新方案的memory module,其中memory module中的项目记录正常数据的典型模式。我们还提出了新颖的特征紧凑性和分离性损失来训练memory module,增强了memory module项目和从正常数据中深度学习特征的判别能力。在标准基准测试上的实验结果表明,我们的方法的效果和效率是显著的,优于当前领域的最新技术。

1.介绍

针对视频序列中异常事件的无监督学习方法,并探讨了现有方法的挑战和局限性。主要观点和贡献如下:

挑战与现有方法的局限性:

  • 异常事件的定义在不同情境下有所不同,手动标注异常事件是一项耗时的任务。
  • 收集异常数据集需要大量努力,因为在真实场景中很少发生异常事件。
  • 基于卷积神经网络(CNNs)的方法利用代理任务进行异常检测,如重建输入帧或预测未来帧,但这些方法并不直接检测异常。

提出的方法:

  • 引入了一个无监督学习方法,考虑正常模式的多样性,假设单一的典型特征无法表示正常数据的各种模式。
  • 提出了一种memory module,其中每个memory module项对应于正常模式的典型特征,用于减小CNNs的表示能力。
  • 引入了特征紧凑性和分离性损失,用于训练memory module,确保memory module项的多样性和判别能力。
  • 提出了一种新的memory module更新策略,以防止在测试时记录异常样本的特征。

实验结果:

在标准基准测试上,包括UCSD Ped2、CUHK Avenue和ShanghaiTech等,实验证明了方法的有效性和效率。
与现有技术水平相比,提出的方法表现出色,成为无监督视频序列异常检测领域的最新技术。
主要贡献:

  • 提出使用多个原型来表示正常视频帧的多样性模式,引入了一个记录正常数据典型模式的memory module。
  • 引入了特征紧凑性和分离性损失,以训练memory module并增强memory module项的多样性和判别能力。
  • 在无监督视频序列异常检测方面取得了新的技术水平,提供了详尽的实验分析和消融研究。

2.相关工作

传统方法与CNNs:

  • 传统的异常检测方法通常利用重构模型,如卷积自编码器(Conv-AE)、3D Conv-AE、循环神经网络(RNN)和生成对抗网络(GAN)等,但由于CNNs的表示能力,它们往往会用正常样本的组合来重构异常样本。
  • 预测性或判别性模型的引入,如Deep SVDD,尝试通过将正常数据映射到超球体中心,将异常样本排除在球体外,取得了一定效果。

作者提出的方法

  • 减小了CNNs的表示能力,通过使用memory module中的项目的组合来重建或预测视频帧,而不是直接使用编码器中的CNN特征,从而考虑了正常数据的各种模式。
  • 与DeepCascade等方法相比,该方法通过memory module项明确记录正常模式,而不仅仅是检测正常图像的各个区域。
  • 与Gong等人提出的Memory-augmented Autoencoder(MemAE)相比,该方法更好地使用CNNs作为映射函数,通过特征紧凑性和分离性损失显式分离memory module项,记录多样性和判别力较强的正常模式。
  • 与MemAE相比,该方法使用更少的memory module项(10 vs 2,000),同时在测试时更新memory module,具有更好的性能。

memory module网络:

  • 文中提到了传统的长短时记忆(LSTM)和引入全局记忆的memory module网络,用于处理顺序数据中的长期依赖性。

作者的方法

  • 也利用了memory module,但采用了不同的更新策略,通过记录各种正常数据模式并考虑每个memory module项作为原型特征。

总结:在视频序列异常检测方面提出了一种新颖的思路,通过memory module和特定的训练损失,成功地捕捉了正常模式的多样性和判别力,相较于现有方法表现更为优越。

3.方法

在这里插入图片描述
见图2:我们用于重建视频帧的框架概述。我们的模型主要由三个部分组成:一个编码器,一个memory module和一个解码器。编码器从时间t的输入视频帧 I t I_t It中提取尺寸为H×W×C的查询映射 q t q_t qt。memory module使用尺寸为1×1×C的查询 q t k q^k_t qtk,执行读取和更新尺寸为1×1×C的项 p m p_m pm,其中项和查询的数量分别为M和K,而K = H×W。查询映射 q t q_t qt与聚合的(即读取的)项 p ^ t \widehat{p}_t p t进行串联。然后,解码器将它们输入以重建视频帧 I ^ t \widehat{I}_t I t。对于预测任务,我们输入连续的四个视频帧来预测第五帧。)

我们的模型主要由三个组件组成:一个编码器,一个memory module,以及一个解码器。编码器接收正常的视频帧并提取查询特征。这些特征然后用于检索memory module项中的典型正常模式,并更新memory module。我们将查询特征和memory module项的聚合(即读取)馈送给解码器,以重建输入视频帧。我们使用端到端的重建、特征紧凑性和特征分离性损失对模型进行训练。在测试时,我们使用加权正则分数以防止memory module被异常视频帧更新。我们计算输入帧及其重建之间的差异,以及查询特征与memory module中最近项之间的距离,以量化视频帧中异常的程度。

3.1网络架构

3.1.1 Encoder and decoder

我们利用了广泛用于重建和未来帧预测任务的U-Net架构[34],以从输入视频帧中提取特征表示并用这些特征重建帧。不同的是,我们在编码器中移除了最后的批量归一化层[12]和ReLU层[18],因为ReLU会截断负值,从而限制了多样性的特征表示。我们相反地添加了一个L2归一化层,使特征具有共同的尺度。U-Net架构中的跳跃连接可能无法从视频帧中提取出用于重建任务的有用特征,我们的模型可能会学习复制输入以进行重建。因此,我们在重建任务中移除了跳跃连接,但在预测未来帧时保留了它们。我们用 I t I_t It q t q_t qt分别表示时间t时的视频帧和对应的来自编码器的特征(即查询)。编码器接收视频帧 I t I_t It并生成大小为H × W × C的查询映射 q t q_t qt,其中H、W、C分别为高度、宽度和通道数。我们用 q t k q^k_t qtk R C R^C RC(k = 1,… K),其中K = H × W,表示查询映射 q t q_t qt中大小为1 × 1 × C的个别查询。然后,将这些查询输入到memory module以读取memory module中的项或更新项,使其记录典型的正常模式。memory module的详细描述将在以下部分中提供。解码器接收查询和检索到的memory module项,并重建视频帧 I ^ t \widehat{I}_t I t

3.1.2 Memory

memory module包含记录正常数据的各种原型模式的M个项目。我们用 p m p_m pm R C R^C RC(m=1,…,M)表示存储器中的项。存储器执行读取和更新项目。
Read
在这里插入图片描述

为了读取项目,我们计算每个查询 q t k q^k_t qtk和所有记忆项目 p m p_m pm之间的余弦相似性,得到大小为M×K的二维相关图。然后,我们沿着垂直方向应用softmax函数,并获得匹配概率 w t k , M w^{k,M}_t wtk,M,如公式1所示:
在这里插入图片描述

对于每个查询 q t k q^k_t qtk,我们通过具有相应权重 w t k , M w^{k,M}_t wtk,M的项目 p m p_m pm的加权平均来读取存储器,并获得特征 p ^ t k \widehat{p}_t^k p tk R C R^C RC
如公式2所示:
在这里插入图片描述
使用所有项而不仅仅是最接近的项,使得我们的模型能够理解多样的正常模式,考虑到整体的正常特征。换句话说,我们用memory module中的项 p m p_m pm的组合来表示查询 q t k q^k_t qtk。我们对各个查询应用读取运算符,得到一个转换后的特征图 p ^ t k \widehat{p}_t^k p tk R H × W × C R^{H×W×C} RH×W×C(即,聚合的项)。我们沿着通道维度将其与查询映射 q t q_t qt连接在一起,并将它们输入到解码器。这使解码器能够使用memory module中的正常模式重建输入帧,减小了CNNs的表示能力,同时理解了正常性。
Update
对于每个memory module项,我们通过使用公式(1)中的匹配概率,选择声明该项是最近项的所有查询。注意,可以将多个查询分配给memory module中的单个项。请参见例如第4.3节中的图5。我们用 U m t U^t_m Umt表示与memory module中第m项对应的查询的索引集合。我们仅使用由集合 U t m U^m_t Utm索引的查询来更新该项,更新方式如下:
在这里插入图片描述
其中f(·)是L2范数。通过使用查询的加权平均值,而不是简单地将它们相加,我们可以更集中地关注靠近该项的查询。为此,我们计算类似于(1)的匹配概率 v t k , m v^{k,m}_t vtk,m,但通过对大小为M×K的相关图在水平方向上应用softmax函数进行,如公式4所示:
在这里插入图片描述
将其重新归一化,以考虑由集合 U t m U^m_t Utm索引的查询,方法如下:
在这里插入图片描述
我们在训练和测试时都更新记录原型特征的memory module项,因为训练集和测试集中的正常模式可能不同,并且可能会因各种因素而变化,例如光照和遮挡。由于在测试时同时存在正常和异常帧,我们建议使用加权的正则分数,以防止memory module项记录异常帧中的模式。给定视频帧 I t I_t It,我们使用 I t I_t It I ^ t \widehat{I}_t I t之间的加权重建误差作为正则分数 ϵ t \epsilon_t ϵt
在这里插入图片描述
其中权重函数 W i j ( ⋅ ) W_{ij}(·) Wij为:
在这里插入图片描述
i和j是空间索引。当得分 ϵ t \epsilon_t ϵt高于阈值 γ \gamma γ时,我们将帧 I t I_t It视为异常样本,不将其用于更新memory module项。请注意,我们仅在更新memory module时使用此分数。权重函数允许更多地关注具有大重建误差的区域,因为异常活动通常出现在视频帧的小部分内。

3.2. Training loss

损失函数共分为三个部分:
在这里插入图片描述
分别是重构损失、特征聚合损失、特征分离损失。
重构损失:
在这里插入图片描述
聚合损失:
在这里插入图片描述

p p p_p pp为与 q t k q_t^k qtk最相近的项,让他们越近越好

分离损失:
在这里插入图片描述
p n p_n pn为与 q t k q_t^k qtk第二相近的项,让他们有差距 α \alpha α,目的是为了不同的 p p p之间是不同的。

3.3. Abnormality score

共两个组成部分,一部分是Memory moudle的loss:
在这里插入图片描述
一部分是重构的损失:
在这里插入图片描述
合起来的分数评估就是:
在这里插入图片描述
在这,作者对异常分数做了归一化:
在这里插入图片描述

4.实验

在这里插入图片描述

5.总结

我们引入了一种无监督学习方法来检测视频序列中的异常,该方法利用多个原型来考虑正常数据的各种模式。

为此,我们建议使用memory module模块将原型模式记录到memory module中的项目中。我们已经证明,使用特征紧凑性和分离性损失来训练memory module可以分离项目,从而实现对memory module的稀疏访问。

我们还提出了一种新的memory module更新方案,当正常和异常样本都存在时,它显著提高了异常检测的性能。对标准基准的广泛实验评估表明,我们的模型优于现有技术。

总结&代码复现:

主要是一个ae+memory的结构,作者提出了一个新的memory更新策略。
Learning Normal Dynamics in Videos with Meta Prototype Network这篇论文和这个是很像的,应该在这个代码的基础上进行修改创新的。

复现:
这篇论文的代码拿来就可以用,比较友好。

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

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

相关文章

忽略python运行出现的大量警告

添加以下代码即可 import warnings warnings.filterwarnings(ignore)

python-ATM机

编写程序,实现一个具有开户、查询、取款、存款、转账、锁定、解锁、退出功能的银行管理系统。 结果展示 1.Main主方法 from zzjmxy.class7.atm import ATM from zzjmxy.class7.manager import Manager # 主面板,实现主要逻辑if __name__"__main__…

【Maven】更新依赖索引

有时候给idea配置完maven仓库信息后,在idea中依然搜索不到仓库中的jar包。这是因为仓库中的jar包索引尚未更新到idea中。这个时候我们就需要更新idea中maven的索引了,具体做法如下: 打开设置----搜索maven----Repositories----选中本地仓库-…

如何搭建eureka-server

在Spring Cloud项目的pom文件中添加eureka-server的starter依赖坐标 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://ma…

指针(3)

如图&#xff0c;这是比较常见的冒泡排序&#xff0c;不过只能对整形数据进行排序。本篇博文主要介绍如何模拟qsort函数实现冒泡排序对任何数据的排序。 如果我们想对任何数据进行排序&#xff0c;我们可以发现&#xff0c;排序的趟数是固定的&#xff0c;我们只需要对比较大…

CFS三层靶机内网渗透

CFS三层靶机内网渗透 一、靶场搭建1.基础参数信息2.靶场搭建2.1网卡配置2.2Target1配置2.2.1 网卡配置2.2.2 Target1 BT配置 2.3Target2配置2.3.1 网卡配置2.3.2 Target2 BT配置 2.4Target3配置 二、内网渗透Target11.1信息收集1.1.1IP收集1.1.2端口收集1.1.3目录收集 1.2 webs…

用 taichi 写个软渲染器

用 taichi 写个软渲染器 What 起点是&#xff1a;可以 setup 一个画布&#xff0c;drawPixel(x, y, color)&#xff0c;然后渲染到 GUI 或者 .png目标是&#xff1a;加载 obj 模型文件和 .tga 贴图文件&#xff0c;并渲染出来使用 taichi 作为 SIMD 加速 backend复现一些 RTR…

【4】PyQt输入框

1. 单行文本输入框 QLineEdit控件可以输入单行文本 from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QVBoxLayout from PyQt5.QtCore import * from PyQt5.QtGui import QIcon import sysdef init_widget(w: QWidget):# 修改窗口标题w.setWindowTitle(单行输…

Python (一) 操作Mysql

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

Google视频广告的格式和注意事项

随着互联网和移动设备的普及&#xff0c;视频广告成为了数字营销中重要的一环&#xff0c;Google作为全球最大的搜索引擎和广告平台之一&#xff0c;Google提供了广泛的视频广告服务&#xff0c;帮助企业推广产品以及品牌。那么Google视频广告的格式和注意事项是什么呢&#xf…

离线环境下使用百度地图(vue版)(展示自己的地图瓦片)3.0版本api

1.下载自己想要的地图网片 (1)瓦片图下载 提取百度网盘中文件&#xff0c;然后运行exe文件&#xff0c;选择要下载的层级及地区即可 百度网盘链接&#xff1a;https://pan.baidu.com/s/16sOJ9ws7HCgNH3EMf7Ejyg?pwd0q0e 提取码&#xff1a;0q0e (2)将瓦片图映射到网上 推荐使…

数电笔记之寄存器

数电 1 数字电路基础 1.2 二进制数据表达 1.2.1 二进制简介 1.2.2 用二进制表达文字 常用的中文字符集&#xff1a;GBK&#xff0c;UTF8 1.2.3 用二进制表达图片 图片像素化&#xff0c;像素数字化 1.2.4 用二进制表达声音 1.2.5 用二进制表达视频 1.3 数字电路 1.3…

mysql中year函数有什么用

YEAR()函数用于提取日期或日期时间值中的年份。可以用于提取DATE、DATETIME或TIMESTAMP列中的年份。 SELECT YEAR(date_column) FROM table;# 提取字符串中的数据SELECT YEAR(2023-07-19) FROM table_name;

day70

今日回顾 session 中间件 auth session Cookie虽然在一定程度上解决了“保持状态”的需求&#xff0c;但是由于Cookie本身最大支持4096字节&#xff0c;以及Cookie本身保存在客户端&#xff0c;可能被拦截或窃取&#xff0c;因此就需要有一种新的东西&#xff0c;它能支持更…

TsuKing: Coordinating DNS Resolvers and Queries into Potent DoS Amplifiers

目录 笔记后续的研究方向摘要引言之前的工作。我们的研究贡献 TsuKing: Coordinating DNS Resolvers and Queries into Potent DoS Amplifiers CCS 2023 笔记 本文介绍了一种名为 TsuKing 的新型 DNS 放大攻击。与以前利用单个DNS解析器的攻击不同&#xff0c;TsuKing协调多个…

MPC模型预测控制理论与实践

一、基本概念 最有控制的动机是在约束条件下达到最优的系统表现。 模型预测控制&#xff08;MPC&#xff0c;Model Predictive Control&#xff09;是通过模型来预测系统在某一未来时间段内的表现来进行优化控制&#xff0c;多用于数位控制&#xff0c;通常用离散型状态空间表…

树_二叉搜索树累加求和

//给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每个节点 node 的新值等于原树中大于或等于 // node.val 的值之和。 // // 提醒一下&#xff0c;二叉搜索树满足下列约束…

9.Unity搭建HTTP服务器

搭建HTTP服务器的几种方式 //1.使用别人做好的HTTP服务器软件&#xff0c;一般作为资源服务器时使用该方式&#xff08;学习阶段建议使用&#xff09; //2.自己编写HTTP服务器应用程序&#xff0c;一般作为Web服务器 或者 短链接游戏服务器时 使用该方式 使用别人做好的HTTP服…

ROS-ROS通信机制-服务通信

文章目录 一、服务通信基本知识二、自定义srv三、C实现四、Python实现 一、服务通信基本知识 服务通信也是ROS中一种极其常用的通信模式&#xff0c;服务通信是基于请求响应模式的&#xff0c;是一种应答机制。也即: 一个节点A向另一个节点B发送请求&#xff0c;B接收处理请求…

通过断点调试解决node 运行js程序直接退出(没有任何报错提示)的问题

现象&#xff1a; node运行程序直接退出&#xff0c;但是从echo $?的返回值可以知道&#xff1a; 一定出现了错误&#xff0c;但是没有显示出来 解决办法&#xff1a; 1. 使用node --inspect-brk 启动程序 然后在浏览器访问chrome://inspect 然后点击inspect 进行单步调试 …