(Unsupervised Anomaly Detection)无监督异常检测领域最新研究进展 – Part 1 基于重构的方法

  • Post author:
  • Post category:其他




前言

在图像异常检测中,基于重构的方法是一种很自然的思想:构建一个

Encoder-Decdoer

结构的网络执行重构任务,目标是让模型能够重构好正常样本。那么在测试时,对于正常样本仍然能够正常重构,而异常样本由于分布的差异,导致重构效果较差,从而可以通过像素级的比较得到异常得分,判断一个样本是否为异常。

下面主要介绍近几年在图像异常检测中,一些基于重构思想的工作,不够完善,会持续更新,也欢迎大家在评论区或者私信讨论。



1. 基线 AE/VAE

基于重构的思想最朴素的方法就是

AE ( AutoEncoder )



VAE ( Variation AutoEncoder )

,也就是自建编码器和变分自编码器。

AE的思想很简单,Encoder提取输入图像的

latent code

,可以理解为一个在

低维空间中的高级语义编码

,它与输入图像之间存在映射。而Decoder负责根据

latent code

进行图像重构,使得重构后的图像与输入尽可能一致。整体过程如下所示:

在这里插入图片描述

训练过程中常用的损失函数为像素级的

L2 Loss

,除此之外,也有工作引入了

SSIM

这类结构性损失。测试过程,只需要将测试样本输入AE,比较重构后的图像与输入图像之间的差异

L2 loss

,根据差异确定图像的异常得分。

而VAE本质就是一种生成式的模型,在GAN大火之前,在图像生成领域得到极大的发展,并且VAE也可以用于异常检测。与AE最大的不同是,除了考虑像素级的重构损失之外,VAE还要额外考虑一个

KL损失

(衡量分布间的差异)。这是因为VAE会引入一个正常样本在隐层空间的

先验

(通常是认为在隐层空间,数据分布为多维的标准正态分布),同时Encoder输出也不再是简单的

latent code

,而是会输出

mean



std

得到一个估计分布,而KL损失就是衡量估计分布和先验分布之间的差异。

关于VAE有更多的理论推导和实现细节,有关内容可以参照

VAE:变分自编码的理解与实现

这篇博客。

在这里插入图片描述

因此,VAE在训练时的目标有两个,一个是重构误差:Decoder得到的重构要尽可能与输入图像一致,另一个是分布误差:正常样本在经过Encoder后的特征满足一个先验分布。测试时通常也是根据重构损失来得到异常得分。


优缺点分析

  • Pros:AE和VAE作为重构方向的基本方法,奠定了未来发展的基础。

  • Cons:AE和VAE的核心idea是:通过训练过程中对正常样本进行重构学习,由于没见过这些图像异常形式,导致在测试时异常样本的重构效果较差,从而能达到异常检测的效果。但由于

    神经网络的泛化性较强

    ,导致

    异常样本也能达到很好的重构效果

    ,从而使得异常检测准确率不高。并且在一些特殊场景上(比如视频监控),由于正常样本的多样化,测试时也会有一些正常样本无法得到很好地重构,容易误判。



2. 基于inpainting思想

inpainting的原意是

图像修复

,而这里主要指的是在重构时,对输入图像的部分区域进行mask覆盖再送入网络中进行复原。完成

inpainting

这类任务比单纯的重构难度更高,这要求网络能对输入图像的上下文有更好的语义理解,并在一定程度上防止过拟合。



2.1 SMAI (BMVC2020)

论文:Superpixel Masking and Inpainting for Self-Supervised Anomaly Detection (来自西安交大)

原文地址:

https://www.bmvc2020-conference.com/assets/papers/0275.pdf

这篇文章是博主最早看到将这种思想引入

Anomaly Localization

领域的,其训练过程如下所示:首先对输入图像进行超像素分割,随机选取一部分超像素块进行mask,将mask后的图像送入复原网络进行重构。训练loss采用

l2

或者

SSIM

在这里插入图片描述

测试流程如下所示:同样对输入图像进行超像素分割,然后逐一地进行mask,为每个测试图像都构造了一组

Masked Image Set

,比较网络重构后的块与输入块之间的差异,从而得到Anomaly Map用于异常区域定位(pixel-level)。

在这里插入图片描述


优缺点

  • Pros:思想新颖,实现简单,相比基线提升了不少性能。
  • Cons:超像素块的分割会限制检测的性能以及定位的精度,并且这种逐块的测试时间复杂度较高,不利于现实场景中的应用。



2.2 SCADN (AAAI2021)

论文:Learning Semantic Context from Normal Samples for Unsupervised Anomaly Detection (来自华南理工大学)

原文地址:

https://www.aaai.org/AAAI21Papers/AAAI-4221.YanX.pdf

这篇文章的思想和前一篇一致,不太一样的是对输入图像的mask处理方式。网络结构如下所示,训练时对于输入图像,随机采用不同宽度、不同方向的条状mask进行覆盖,送入重构网络中(与一般的网络结构不同,中间几层采用了空洞卷积)进行复原,除了计算像素级的重构损失,模型还引入了对抗学习的方式加了一个判别器损失(帮助网络重构地更好)。

测试时,同样需要对测试建议逐一地构造不同mask情况下的

Masked Image Set

,进行重构并计算重构损失,最后融合异常得分图作为最终的

Anomaly map

进行异常定位(pixel-level),将

Anomaly map

的结果平均后得到

Anomaly Score

作为异常检测结果(image-level)。

在这里插入图片描述


优缺点:

  • Pros:引入了对抗学习的思想,在网络结构上下了一点功夫,mask的划分不依靠超像素方法。此外还提出了一个新的数据集,不过我找不到开源地址(发邮件也没回… …)
  • Cons:从性能来看还没有上一篇高,而且同样存在这类方法的固有问题,速度较慢。而且看了上一篇之后,显得创新性没那么够。



2.3 RIAD (PR2021)

论文:Reconstruction by inpainting for visual anomaly detection (卢布尔雅那大学)

原文地址:

https://www.sciencedirect.com/science/article/abs/pii/S0031320320305094

网络结构如下,主要包含三个关键技术点:

在这里插入图片描述

  1. 首先将输入图像划分为许多个大小为

    k x k

    的网格,将这些网络随机划分为n个不相交的集合(每个集合包含的像素数量相等);随后创建n个

    ones mask

    ,每个mask对应一个集合

    Si

    ,再将

    Si

    中对应的网格像素值置为0,对输入进行覆盖得到n个

    mask image

  2. 将处理后的n个输入图像送入网络中进行复原,除了标准的

    encoder-decoder

    结构,还引入了

    skip connection

    提升复原的精确度;值得注意的是,这里只保留了每个

    masked image

    复原后的区域。
  3. 将不同

    masked image

    复原的结果组合起来,就可以得到最后重构结果。将重构结果与输入图像进行对比,即可得到

    Anomaly Map

    。值得注意的是这里,这里不是通过计算

    l2

    距离来评估差异,而是采用基于梯度强度的多尺度衡量标准(multi-scale gradient magnitude similarity, MSGMS),这里不详细介绍,有兴趣看原文。

上面按照的是测试的逻辑进行描述的,训练时1,2步一致,loss采用

SSIM + L2 + MSGMS

三者加权

训练和测试均采用了多尺度:即k值的选取 k = {2, 4, 8, 16}


优缺点:

  • Pros:效果很好,方法相比于上一篇更简洁,并且没有太刻意地设计mask,同时提出了一种新的衡量标准与损失策略(MSGMS),对之后的方法有一定的借鉴意义;
  • Cons:基于梯度的评价方法容易受到噪声区域的影响,对于一些表面纹理变化形式多样的类别效果还有待提升。



2.4 InTra (2021)

论文: Inpainting Transformer for Anomaly Detection(富士通科技)

原文地址:https://arxiv.org/pdf/2104.13897.pdf

这篇文章是第一篇把Transformer结构引入异常检测领域的工作,思路与RIAD不太一样。先将输入图像进行分块,但InTra是从中选取一个大小为

L x L

的窗口,选取中心块进行覆盖,利用窗口内的其他块对其进行重构。基本沿用了ViT的框架:未被Mask的块作为输入token,mask patch当作

class token

在这里插入图片描述

针对texture和object两种不同类别,采用了不同的编码形式。

由于这篇文章我之前写过一篇博客专门介绍,这里就不过多阐述了,有兴趣请看

用于异常检测的Transformer – InTra


优缺点:

  • Pros:引入了Transformer架构,并且相比于RIAD性能提升了不少。
  • Cons:逐块的mask导致训练比较低效,测试时的时间复杂度也会非常高。



3. 基于Memory Bank

这类重构的方法不再是直接根据

latent code

去重构原图,而是会额外构造一个memory bank存储prototype(

原型元素

)。训练的时候

更新

memory bank 中的项,测试时查询这些项,组合后送入解码器进行重构。这类方法相当于限制CNN的泛化能力,测试时只能通过查询和组合这些prototype元素进行重构,

缓解了异常样本也能被重构得很好的问题



3.1 MemAE (ICCV2019)

论文:Memorizing Normality to Detect Anomaly: Memory-augmented Deep Autoencoder for Unsupervised Anomaly Detection (澳大利亚阿德莱德大学)

论文地址:

https://arxiv.org/abs/1904.02639

MemAE的大致做法如下:实现构造好一个有

N

项元素的Memory bank,这个模块加在Encoder和Deocder之间,编码器输出的latent code会进行

寻址

操作(计算code与每个prototype之间的相似度,确定权重w),找到对应的元素,经过加权融合得到一个新的code,再将这个code送入解码器进行重构。

在这里插入图片描述

训练除了重构损失,还加入了正则化项:对权重项w采用最小熵损失,如下所示,主要是促进权重系数的稀疏性,避免复杂的组合导致异常样本仍能被较好重构。

在这里插入图片描述

本文我之前也写了专门的博客记录,并进行了复现,有兴趣请看

ICCV2019(AD) – 解读与复现MemAE



3.2 MNAD(CVPR2020)

论文:Learning Memory-guided Normality for Anomaly Detection (延世大学)

论文地址:https://arxiv.org/pdf/2003.13228.pdf

这篇文章核心思想与MemAE基本一致,主要的不同在于一些细节上的差异。比如:除了经过

Memory bank

寻址得到的code,还会concat上本身的

latent code

,一起送入解码器;以及Memory Module中的更新方式存在不同,不依靠网络自动学习,而是类似于K-Means的思想进行更新;其次网络结构上采用U-Net,抛去了编码器最后一层的

bn-relu

层,训练时去掉skip-connection,测试时再恢复… …

在这里插入图片描述

此外,MNAD不是采用最小熵来促使注意力权重w的稀疏化,而是引入了两个损失:

Feature compactness loss



Feature separateness loss

,达到簇内紧凑,簇间分离的效果。

在这里插入图片描述

在这里插入图片描述

更多细节可以参考这篇文章:https://zhuanlan.zhihu.com/p/370691775


优缺点:

  • Pros:同一个思想不同的构造方式,并且针对视频监控异常检测的特性,做了特定的修改(

    测试时也会选择正常帧更新memory中的项

    )
  • Cons:整体方案显得比较麻烦,并且在重构单帧的设定下效果差于MemAE



3.3 Divide-and-Assemble(ICCV2021)

论文:Divide-and-Assemble: Learning Block-wise Memory for Unsupervised Anomaly Detection (海康威视研究院)

论文地址:https://arxiv.org/pdf/2107.13118.pdf


该系列的其他文章请跳转至

Part 0 异常检测简述

寻找,持续更新 …


温馨提示:码字不易,转载请提前告知(私聊和评论皆可)



版权声明:本文为qq_36560894原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。