【论文精读】2022_CVPR_Self-Supervised Predictive Convolutional Attentive Block for Anomaly Detection

Self-Supervised Predictive Convolutional Attentive Block for Anomaly Detection

论文地址链接

Abstract

  在成功的异常检测方法中,有一类方法依赖于对被mask掉信息的预测(例如,patch、未来帧等)并利用与被mask信息相关的重建误差作为异常分数。与相关方法不同,作者提出将基于重建的功能集成到一个新的自监督的预测体系结构模块中。作者主要是通过一个带有扩张卷积的卷积层进行卷积,然后将结果通过通道注意力模块。提出的自监督块是通用的,可以很容易地纳入各种最新的异常检测方法。作者将该模块加入到SOTA方法中通过实验证明了性能有所提高。

Conclusion

  在本文中,作者介绍了一种新的神经块SSPCAB,它由一个屏蔽卷积层和一个通道注意模块组成,可以预测卷积接受域中的一个屏蔽区域。作者提出的神经块以自监督的方式训练,通过自身的重构损失训练。初步结果表明,masked卷积和通道注意力模块都有助于性能的提高。此外,在SSPCAB的帮助下,我们能够获得avenue和ShanghaiTech的新SOTA。在未来的工作中,作者想扩展SSPCAB,用一个masked的三维卷积代替二维的masked卷积。此外,考虑异常检测领域以外的其他应用。

Introduction

  无监督视频异常检测一个常用的代理任务是预测单帧或者序列帧中mask掉的信息,利用与mask掉的信息相关的重构误差作为异常分数。由于训练数据只包含正常样本所以在测试时对于异常样本重构误差会较大。mask掉的信息可以以不同的形式出现,例如超像素,它是首先对输入图像进行超像素分割,超像素分割是把一些具有相似特性的像素"聚合"起来,形成一个更具有代表性的大"元素",然后随机选取一部分超像素块进行mask,将mask后的图像送入复原网络进行重构。再比如未来帧,未来帧预测可以看作是将输入序列的最后一 帧mask掉然后利用前面几帧去预测mask掉的帧,再比如中间帧边框预测,他是将序列中间某帧mask掉然后重构mask掉的帧。
  中间帧的预测效果是要好于未来帧预测的所以作者试图将这个想法扩展到2D卷积核中,这样可以在卷积操作时利用空间位置上相关的空间信息。
  与这些方法不同的是,作者提出将重建mask信息的能力集成到一个神经网络块,这样可以加入到网络的任层这样有两个重要的优点:
①它允许我们在神经网络的任何层掩盖信息(不仅在输入端)。
②它可以集成到广 泛的神经体系结构中,因此非常通用。
  作者是第一个将基于重构的功能作为神经结构的基本构建块的。作者将这个重建块设计为一个由扩张卷积层和通道注意机制组成的自监督预测块。
  作者将SSPCAB集成到各种最先进的异常检测框架中通过实验结果表明,SSPCAB可以带来显著的性能改进,并在avenue和shanghaitech上实现了新的SOTA性能。

Related work

  许多异常检测方法的替代任务是从输入中删除一些信息,同时让神经网络预测被删除的信息。与现有的方法不同,作者是将基于重构的功能作为神经结构的基本构建块。

Method

Masked convolution

在这里插入图片描述
  提出的卷积方法的接收域如图所示。该部分的主要思想是对于一个选定的感知野范围, 只需要取四个角落部分的像素点进行卷积操作,忽略掉剩下的像素空间,四部分进行卷积之后再经过一系列的操作得到一个值,该值来代表该感知野的特征表示。具体来说图中 K i ∈ R k ′ × k ′ × c , i ∈ { 1 , 2 , 3 , 4 } K_i \in R^{k' \times k' \times c}, i \in \{{1,2,3,4\}} KiRk×k×c,i{1,2,3,4}表示该感知野的四个角落选定的卷积核,d表示卷积核的边缘到中心点的距离,M ∈ R 1 × 1 × c \in R^{1 \times 1 \times c} R1×1×c 表示中心像素点,所以感知野的边长可以表示为 k = 2 k ′ + 2 d + 1 k = 2k'+2d+1 k=2k+2d+1,对四个角落部分进行卷积操作之后的值相加,然后经过ReLU激活函数得到的值可以认为该感知野得到的特征值,所以中间空白区域相当于被mask掉。整个自定义卷积层的唯一可配置超参数是 k ′ 和 d k'和d kd
在这里插入图片描述
  如上图由于目标是学习和预测输入的每个空间位置的重建,所以输入和输出是一般大的,所以在输入图像周围添加 k ′ + d k'+d k+d像素的零填充,并设置stride为1, 这样输入中的每个像素都被用作mask信息进行预测。输出张量的空间维数和输入张量的空间维数相同。
代码如下:

class SSPCAB(nn.Module):
    def __init__(self, channels, kernel_dim=1, dilation=1, reduction_ratio=8):
       
          // channels: The number of filter at the output (usually the same with the number of filter from the input)
         //   kernel_dim: The dimension of the sub-kernels ' k' ' from the paper
         //  dilation: The dilation dimension 'd' from the paper
         //   reduction_ratio: The reduction ratio for the SE block ('r' from the paper)
      
        super(SSPCAB, self).__init__()
        self.pad = kernel_dim + dilation
        self.border_input = kernel_dim + 2*dilation + 1

        self.relu = nn.ReLU()
        self.se = SELayer(channels, reduction_ratio=reduction_ratio)

        self.conv1 = nn.Conv2d(in_channels=channels,
                               out_channels=channels,
                               kernel_size=kernel_dim)
        self.conv2 = nn.Conv2d(in_channels=channels,
                               out_channels=channels,
                               kernel_size=kernel_dim)
        self.conv3 = nn.Conv2d(in_channels=channels,
                               out_channels=channels,
                               kernel_size=kernel_dim)
        self.conv4 = nn.Conv2d(in_channels=channels,
                               out_channels=channels,
                               kernel_size=kernel_dim)

    def forward(self, x):
        x = F.pad(x, (self.pad, self.pad, self.pad, self.pad), "constant", 0)

        x1 = self.conv1(x[:, :, :-self.border_input, :-self.border_input])
        x2 = self.conv2(x[:, :, self.border_input:, :-self.border_input])
        x3 = self.conv3(x[:, :, :-self.border_input, self.border_input:])
        x4 = self.conv4(x[:, :, self.border_input:, self.border_input:])
        x = self.relu(x1 + x2 + x3 + x4)

        x = self.se(x)
        return x

  通过forward函数可以看出进行加0的扩充,四周大小扩充均为 k ′ + d k'+d k+d,然后分别用四个卷积核针对其可以移动到的位置进行卷积,左上角的卷积核向右只能到距离输入最右边 k ′ + 2 d + 1 k'+2d+1 k+2d+1的地方,向下也是只能到距离输入最下边 k ′ + 2 d + 1 k'+2d+1 k+2d+1的地方,其他卷积核依此类推。

Channel attention module

①通道注意力模块确保模块不会简单地学习基于线性插值上下文信息重建被mask掉的区域,所以使用注意力一个动机是提高SSPCAB的建模能力,并使我们的块的输入和输出之间能够进行非线性处理。

②Z中的每个激活映射都是由masked信息存在的单独卷积核预测的,作者推断masked卷积可能最终产生跨通道包含不比例(未校准)值的激活映射,因此,作者想利用通道之间的关系,目标是根据掩码卷积层产生的表示的质量缩放掩码卷积层输出中的每个通道

  第二个动机似乎是作者为了解释而强加的,首先SEnet本身就是为了进行特征的校准,去加强有用的特征,抑制没什么用的特征。此外作者设计的卷积层与使用SENet的必然关系没有get到。
在这里插入图片描述
SENet结构如上图.
①初始输入为 X X X大小为 C ′ × H ′ × W ′ C' \times H' \times W' C×H×W经过卷积操作 F t r F_{tr} Ftr在本文就是作者提出的掩码卷积层,得到特征图 U U U大小为 C × H × W C\times H\times W C×H×W
②然后经过全局平均池化操作,即每个通道求平均值得到一个值经过 F s q ( . ) F_{sq}(.) Fsq(.)得到特征维度 C × 1 × 1 C\times 1 \times 1 C×1×1
③然后经过 F e x ( . , W ) F_{ex}(. ,W) Fex(.,W)两次全连接层,先通过 W 1 ∈ R c r × c W_1 \in R^{\frac{c}{r}\times c} W1Rrc×c将通道维数降为 c r \frac {c}{r} rc其中r表示再通过Relu激活再通过 W 2 ∈ R c × c r W_2 \in R^{c \times \frac{c}{r}} W2Rc×rc将维数恢复,再 通过sigmoid激活获得通道注意力值。全连接层最后的通道数与特征的通道数相同都为C,最后用Sigmoid限制到[0,1]的范围。可通过以下公式表示:
在这里插入图片描述
F s c a l e ( . , . ) F_{scale}(.,.) Fscale(.,.)表示乘法操作,将第三步得到的C个通道的值分别与特征U的C个通道上的值相乘,得到最后特征

Reconstruction loss

  设 G G G表示SSPCAB函数。定义自监督重建损失为均方误差(MSE)之间的输入和输出,如下所示:

在这里插入图片描述
  当将SSPCAB集成到具有自身损失函数 L F L_F LF的神经模型 F F F中,损失可以简单地添加到相应的损失中,得到一个新的损失函数,包含两个项:
1
在这里插入图片描述

  作者还从卷积神经网络的缺点对其提出的方法做了补充,卷积神经网络缺乏理解局部特征的全局排列的能力,也就是说卷积神经网络只会理解一 张图片中具有哪些特征,而不知道这些特征的位置关系,比如将图中一个人的眼睛和嘴巴换位置仍然可以分类为人。在本文中,作者提出的模块,旨在学习使用上下文信息预测(或重建)隐藏信息,将位置关系进行了建模,为了获得高精度的重建结果,作者的模块被迫学习局部模式的全局结构。从这个角度来说,作者认为这种能力可以使得SSPCAB适用于广泛的任务,但该模块在异常检测中具有自然和直接的适用性,当整合到一个基于正常训练数据训练的CNN中时,SSPCAB将只学习正常示例的全局结构。当在推断时出现异常数据样本时,模块可能会提供较差的重建。

实验

评价指标

数据集使用了avenue和上科大数据集,
评价指标:
①AUC: 作者用了微观AUC和宏观AUC,其他论文使用的AUC普遍使用此处所说的微观AUC
微观AUC是在连接整个测试集的所有帧后计算的,而宏观AUC是计算每个独立视频的进行归一化分数。
帧级AUC可能是一个不可靠的评估措施,因为它可能无法评估异常的位置,所以有了RBDC和TBDC
②RBDC是基于区域的检测准则,它考虑每个检测到的区域,如果一个检测到的区域与地面真值区域的交集过并大于阈值a,则将其标记为真正。
③TBDC是基于轨迹的检测准则,它衡量的是异常区域是否被精确跟踪,如果一个轨道上的检测数大于阈值β,则认为一一个检测到的轨道为真正。

基础实验

在这里插入图片描述

  作者在Avenue上进行了初步实验,以便确定掩模卷积的超参数,即扩张率d和核大小k’。作者考虑了d的值包括(0,1,2}, k’的值包括{1,2,3}。 此外,作者考虑了两个可供选择的损失函数,即平均绝对误差(MAE)和均方误差(MSE),以及经过掩模卷积后需要加入的几种注意力机制,即通道注意力(CA),空间注意力SA以及两者结合。
  作者将基本的卷积自编码器(此处细节可看原文)作为基础架构,第一行是其获得的结果。在基本架构的基础上添加基于MAE损失的掩码卷积层,可以观察到显著的性能提升,特别是在k’ = 1和d = 1时。当用MSE代替MAE损失函数时,性能进一步提高。然后对k’和d的不同组合进行了广泛的实验,当k’= 1和d = 1时,得到了较好的结果。因此,接下来的所有实验中,将损失固定在MSE、子核大小k’ = 1和扩张速率d = 1.。接下来,在掩模卷积之后引入了各种注意模块。在考虑过的注意力模块中,观察到通道注意力是更好地匹配作者的掩码卷积层的一个,为三个指标提供了最高的性能增益。因此,选择通道注意模块进行剩下的实验。在选择使用通道注意力时,测试了额外的缩减率(r = 4和r= 16), 没有观察到任何改进。因此,将SSPCAB集成到神经模型中时,将SE模块的缩减率保持在r= 8。(此处的r即为之前SENet模块介绍时两个全连接层参数中的r)

实验结果

在这里插入图片描述
  作者选择了四种从18年到21年在视频异常检测中达到最先进的性能水平的方法,基本上是每年的SOTA,作为集成SSPCAB的候选。作者首先使用相应作者提供的官方实现来重现结果。避免对所选基线的超参数进行任何修改。将再现结果作为对比参考。首先可以注意到在Liu等人的[37]框架中加入SSPCAB带来了两个数据集上所有指标的一致改进。 类似地,Park等人的模型[49]加入SSPCAB也带来了两个数据集上所有指标的一致改进。 因为Park等 人的[49]方法没有产生异常。SSPCAB也为Liu et al.[39]带来了持续的改进,唯一的例外是大道 上的宏观AUC。对于这个基准[39], 可以观察到Avenue上的RBDC评分显著提高了21.22%。最后,SSPCAB还提高了Georgescu等人[18]提出的几乎所有指标的性能,除了大道上的TBDC和大道上的RBDC.
  综上所述,可以得出不管底层模型是什么,加入SSPCAB模块都是有益的。将SSPCAB集成到各种最先进的异常检测框架中,并对Avenue和ShanghaiTech数据集进行综合实验,实证结果表明,SSPCAB可以带来 显著的性能改进,能够在Avenue和 上科大的数据集上实现新的SOTA水平。

消融实验

在这里插入图片描述

  在之前的实验中通常在底层模型中用SSPCAB替换倒数第二卷积层。 理想情况下,为了获得最佳性能,集成SSPCAB模块的位置和数量应该针对每个框架的验证集进行调优。然而”导常检测数据集没有验证集然而,异常检测数据集没有验证集,训练集中也没有验证集,因为训练集中只有正常的例子。在这种情况下,为了公平地演示SSPCAB的般性和实用性,作者在之前实验只使用了一个靠近输出位置SSPCAB模块。然而,添加更多的模块可能是有益的,可以通过多个SSPCAB模块积累差异,使得正异常区分性更大。为了测试各种配置,作者对SSPCAB模块的数量以及这些模块可以集成在普通自编码器中的位置进行了消融实验。作者在Avenue数据集上进行了相应的实验。可以观察到,无论集成的位置或块的数量如何,加入SSPCAB都是优于不加入的结果的。当SSPCAB集成在更接近输出的地方时,改进似乎更大。集成更多的块有时会有帮助。|

在这里插入图片描述
为了简单和速度作者在上述实验中使用1x1的大小的M,为了研究M尺寸增加的影响,作者在Avenue 上用普通的自动编码器测试了3 x 3的尺寸。在表中报告了相应的结果。将结果与1 x 1或3 x 3分量的mask进行比较,没有观察到显著差异。

推断时间

在这里插入图片描述

不管底层框架是什么,只添加一个SSPCAB模块,通常替换倒数第二卷积层。因此,作者预计运行时间会增加。为了评估SSPCAB增加的额外时间量,们在表中展示了将SSPCAB集成到两个框架之前和之后的运行时间。报告的时间显示,这两个框架的时间扩展都低于0.3 ms因此,可以认为SSPCAB带来的准确性提高超过了表中观察到的边际运行时间扩展。

Discussion

1.作者的模块通过训练可以为正常样本提供比异常样本更好的重建特征。如果在神经体系结构的任何-层, 代表正常和异常示例的特征不同,那么利用作者提出的模块那么在该体系结构的最终输出中,应该会产生更大的差异。当SSPCAB块被放置在输入附近时,SSPCAB并没有带来显著的增益。作者说会在今后的工作中进一步探讨这一 局限性。除了这个小问题,在作者的实验中,作者说没有观察到SSPCAB的其他局限性。
2.

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值