• 论文阅读 (75):Video Anomaly Detection with Spatio-temporal Dissociation (2022)


    1 概述

    1.1 题目

    2022:时空分离视频异常检测 (Video anomaly detection with spatio-temporal dissociation)

    1.2 摘要

    由于异常的模糊定义和来自真实视频数据的视觉场景的复杂性,视频中的异常检测仍然是一项具有挑战性的任务。与之前利用重建或预测作为辅助任务来学习时间规律性的工作不同,本工作探索了一种新颖的卷积自编码器架构,该架构可以分离时空表示以分别捕获空间和时间信息,动机则是异常事件通常有着不同于正常事件的外观和/或运动行为:

    1. 空间自编码器通过学习重构第一帧 (First individual frame, FIF) 的输入来对外观特征空间的正态性建模,而时间部分则以前四个连续帧作为输入,RGB差异作为输出来模拟 光流的运动。外观或运动行为不规则的异常事件会导致较大的重建误差;
    2. 为了提高快速移动异常值的检测性能,利用基于方差的注意模块并将其插入运动自编码器以突出显示大的运动区域;
    3. 提出一种深度K-means聚类策略来强制空间和运动编码器提取紧凑的表示。

    1.3 代码

    Torchhttps://github.com/ChangYunPeng/VideoAnomalyDetection

    1.4 Bib

    @article{Chang:2022:108213,
    author		=	{Yun Peng Chang and Zhi Gang Tu and Wei Xie and Bin Luo and Shi Fu Zhang and Hai Gang Sui and Jun Song Yuan},
    title		=	{Video anomaly detection with spatio-temporal dissociation},
    journal		=	{Pattern Recognition},
    volume		=	{122},
    pages		=	{108213},
    year		=	{2022},
    doi			=	{10.1016/j.patcog.2021.108213}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2 方法

    2.1 总览

    对于异常事件检测任务,训练集中只包含正常事件,因此一个高效的解决方法是在无监督设置下习得正常训练视频的规律。本文将空间信息和运动信息与双流架构分离,并分别利用重建和预测作为空间流和运动流的辅助任务。如图1所示,对于给定的视频剪辑 x x x,算法的处理分为三个主要步骤:

    1. 空间编码器 E a E_a Ea使用第一帧 x f i f x_{fif} xfif作为输入,以获取包含视频中场景和对象信息的空间表示 z a z_a za。随后 z a z_a za传递给空间解码器 D a D_a Da以获取重构结果 x ‾ f i f \overline{x}_{fif} xfif
    2. 运动编码器 E m E_m Em以除了最后帧的视频 x c l i p s x_{clips} xclips作为输入。 E m E_m Em中嵌入了所提出的基于方差的注意力模块以凸显高速移动区域。运动解码器 D m D_m Dm用于生成 x f i f x_{fif} xfif x l i j x_{lij} xlij与输入动作表示 z m z_m zm之间的RBG差异 x d i f f x_{diff} xdiff,其中生成的表示记为 x ‾ d i f f \overline{x}_{diff} xdiff
    3. 深度K-means最小化汇聚表示 r r r和聚类中心 C C C之间的距离,以促使空间编码器和动作编码器提取到一些共同信息。

    为了检测给定的视频剪辑 x x x是否包含异常,将最终的预测结果 x ‾ l i f \overline{x}_{lif} xlif x l i f x_{lif} xlif进行比较,以衡量预测质量。最终将预测质量与它们与集群的距离进行融合,以获得最终的异常分数


      图1:视频异常检测架构。时空信息被分解为两个子模块:空间自编码器 E a E_a Ea D a D_a Da用于FIF重构,而时间自编码器 E m E_m Em D m D_m Dm用于预测FIF和LIF (Last individual frame) 与输入连续视频帧之间的RGB差异。编码器和解码器分别由三个ResNet构成,区别在于LeakyReLU代替了所有的ReLU,以及使用用像素混洗层 (Pixel shuffle) 替换步幅卷积层,以逐步提高空间分辨率。为了进一步约束这两个流,引入了一种深度K-means聚类策略来提取紧凑表示,如紫色区域。此外利用了一个基于方差的注意力模块,它可以自动为运动分配一个重要性权重

    2.2 空间自编码

    由于某些异常对象与特定对象部分关联,因此其自身的静态外观是一个有用的线索。为了检测包含空间特征,例如风景和外观等的异常对象,输入视频 x x x的第一帧将输入空间编码器,以获取用于重构的、包含必须空间信息的瓶颈潜在空间 (Bottleneck latent-space) z a z_a za,其输入目标是最小化 x f i f x_{fif} xfif x ‾ f i f \overline{x}_{fif} xfif之间的重构误差。

    给定单独的一帧,空间编码器将其转换为外观表示 z a z_a za,空间解码器生成重构结果 x ‾ f i f \overline{x}_{fif} xfif
    z a = E a ( x f i f ; θ e a ) (1) \tag{1} z_a=E_a(x_{fif};\theta_e^a) za=Ea(xfif;θea)(1) x ‾ f i f = D a ( z a ; θ d a ) (2) \tag{2} \overline{x}_{fif}=D_a(z_a;\theta_d^a) xfif=Da(za;θda)(2)其中 θ \theta θ表示模型参数。图2描述了空间解码器的主要结构。编码器 E a E_a Ea和解码器 D a D_a Da都由三个ResNet块构成:

    1. 编码器:删除每个块中的batchnorm层;于块之后添加batchnorm层;
    2. 解码器:将ResNet块中的下采样层 (Downsampling layer) 替换为像素混洗层 (Pixel shuffle layer),以减少棋盘伪影 (Checkerboard artifacts);
    3. 所有块的ReLU层替换为LeakyReLU


      图2:空间解码器的结构,视频帧均被缩放为 256 × 256 256\times256 256×256

    为了使得空间自编码器习得外观特征空间的规律性,计算了 x f i f x_{fif} xfif x ‾ f i f \overline{x}_{fif} xfif之间的均方误差
    l a = ∥ x f i f − x ‾ f i f ∥ 2 (3) \tag{3} l_a=\|x_{fif}-\overline{x}_{fif}\|_2 la=xfifxfif2(3)

    2.3 动作自编码器

    大多数基于双流的卷积网络利用扭曲的光流作为运动建模的来源。尽管运动特征非常有用,但光流估计的昂贵计算成本阻碍了依赖于光流的方法用于许多实时实现。受[13]启发,利用一种新颖的运动表示来模拟光流的运动,该运动是通过视频帧之间的RGB值的差异直接获得。图3表明,可以假设从光流中捕获的运动表示可以从RGB的差异中学习。因此,构建了一个运动自动编码器来生成与连续视频帧输入的RGB差异。通过用产生的RGB差异模拟光流的运动,运动自编码器可以学习时间规律,其捕获的特征表示包含基本的运动信息。对于给定的视频剪辑 x x x ,将除LIF之外的所有其他帧作为输入,并将最后一个视频帧和第一帧之间的RGB 差异作为目标。


      图3:视频帧、RGB差异,以及光流示意

    图4展示了运动自编码器的架构,其骨架是U-Net和2D CNN。动作编码器 E m E_m Em x c l i p s x_{clips} xclips转换为动作表示 z m z_m zm,并生成RGB差异 x ‾ d i f f \overline{x}_{diff} xdiff
    z m = E m ( x c l i p s ; θ e m ) (4) \tag{4} z_m=E_m(x_{clips};\theta_e^m) zm=Em(xclips;θem)(4) x ‾ d i f f = D m ( z m ; θ d m ) (5) \tag{5} \overline{x}_{diff}=D_m(z_m;\theta_d^m) xdiff=Dm(zm;θdm)(5)与空间自编码器类似, E m E_m Em D m D_m Dm均包含三个ResNet,以及去除批量归一化层与替换ReLU为LeakyReLu。而不同在于,运动编码器和运动解码器之间存在跳跃连接,运动解码器中的每个块都处理上采样运动表示和低级特征的连接。为了防止生成结果过度平滑,计算了:

    1. l 2 l_2 l2距离;
    2. x ‾ d i f f \overline{x}_{diff} xdiff x d i f f x_{diff} xdiff之间的梯度损失,

    以使得结果更接近目标值。动作自编码器的损失函数 l m l_m lm定义为:
    l m = ∥ x d i f f − x ‾ d i f f ∥ 2 + ∑ d ∈ { x , y } ∥   ∣ g d ( x d i f f ) ∣ − ∣ g d ( x ‾ d i f f ) ∣   ∥ 1 (6) \tag{6} l_m=\|x_{diff}-\overline{x}_{diff}\|_2+\sum_{d\in\{x,y\}}\|\ |g_d(x_{diff})|-|g_d(\overline{x}_{diff})|\ \|_1 lm=xdiffxdiff2+d{x,y} gd(xdiff)gd(xdiff) 1(6)其中 g d g_d gd表示视频帧沿着空间 x x x y y y轴的图像梯度。


      图4:运动自编码器的结构。输入是4个堆叠的帧。

    2.4 方差注意力模块

    监控视频大部分是静态的属于正常现象,异常行为更容易出现较大的运动变化。基于此特性,在时间自编码器中设计了一种基于方差的注意力,以自动将重要性权重分配给视频剪辑的移动部分。由于运动编码器由三个2D ResNet块组成,因此特征图的每个位置都包含跨通道的局部运动信息。它类似于包含沿时间轴的运动信息的3D卷积,而2D卷积包含特征通道内的这些信息。因此,对于那些移动较大的区域,这些嵌入的方差也会更高。因此,可以直接计算跨通道表示的平均值,然后计算每个位置的方差。

    给定运动编码器第 i i i个块的嵌入运动特征 z m i z_m^i zmi,注意力模块首先将其传递到一个卷积层:
    f n ( h , w ) = W g ∗ z m i ( h , w ) (7) \tag{7} f_n(h,w)=W_g*z_m^i(h,w) fn(h,w)=Wgzmi(h,w)(7)其中 h ∈ ( 0 , H i ] h\in(0,H_i] h(0,Hi] w ∈ ( 0 , W i ] w\in(0,W_i] w(0,Wi] W i W_i Wi H i H_i Hi是第 i i i个块的特征图行列数。 W g W_g Wg是卷积层的参数。我们计算沿特征维度的方差,然后沿空间维度进行 l 2 l_2 l2归一化以生成相应的注意力图 g n g_n gn
    v ( h , w ) = 1 D ∑ d = 1 D ∥ f n ( h , w , d ) − 1 D ∑ d = 1 D f n ( h , w , d ) ∥ 2 (8) \tag{8} v(h,w)=\frac{1}{D}\sum_{d=1}^D\left\| f_n(h,w,d) -\frac{1}{D}\sum_{d=1}^Df_n(h,w,d) \right\|_2 v(h,w)=D1d=1D fn(h,w,d)D1d=1Dfn(h,w,d) 2(8) a t t ( h , w ) = ∥ e x p ( v ( h , w ) ) ∑ h = 1 , w = 1 H , W e x p ( v ( h , w ) ) ∥ 2 (9) \tag{9} att(h,w)=\left\| \frac{exp(v(h,w))}{\sum_{h=1,w=1}^{H,W}exp(v(h,w))} \right\|_2 att(h,w)= h=1,w=1H,Wexp(v(h,w))exp(v(h,w)) 2(9)其中 v ( h , w ) v(h,w) v(h,w)表示在空间位置 ( h , w ) (h,w) (h,w)特征图的方差。由于基于方差的注意力模块可以突出快速移动区域,同时抑制不相关的静态区域,这些与快速移动具有高度相关性的异常物体,例如在地铁入口快速奔跑的行人,将获得较大的运动损失。这有助于快速移动异常事件检测。

    2.5 聚类

    由于仅在正常数据上训练运动自动编码器和空间自动编码器以进行异常检测,因此自动编码器也可以在异常事件上进行泛化。 推动空间编码器和运动编码器获得压缩数据表示是必不可少的。引入了一个深度K-means,它最小化了数据表示和聚类中心之间的距离,以迫使空间编码器和运动编码器网络都提取共同的因子。

    K K K表示簇的数量, c k c_k ck表示簇 k k k的表示,以及 C = { c 1 , … , c K } C=\{c_1,\dots,c_K\} C={c1,,cK}是表示的集合。给定空间表示 z a z_a za和动作表示 z m z_m zm,首先在同一空间位置的特征通道中连接这些表示以融合两个流,并将运动表示和外观表示一起训练。然后标准化汇聚表示 r r r [ 0 , 1 ] [0,1] [0,1]。对于提取自空间位置 h ∈ ( 0 , H r ] h\in(0,H_r] h(0,Hr] w ∈ ( 0 , W r ] w\in(0,W_r] w(0,Wr]的表示 r h , w ∈ R D r_{h,w}\in R^D rh,wRD,其中 H r H_r Hr W r W_r Wr表示汇聚特征图的空间大小,我们计算嵌入描述符和每个聚类中心 c k c_k ck的欧氏距离。

    为了构成聚类目标函数的连续泛化,采用软分配来计算数据表示 z i z_i zi与聚类中心 C C C之间的距:
    D ( r h , w , C ) = ∑ k = 1 K e − α ∥ r h , w − c k ∥ 2 ∑ k = 1 K e − α ∥ r h , w − c k ∥ 2 ∥ r h , w − c k ∥ 2 2 (10) \tag{10} D\left(r_{h, w}, C\right)=\sum_{k=1}^K \frac{e^{-\alpha}\left\|r_{h, w}-c_k\right\|_2}{\sum_{k=1}^K e^{-\alpha\left\|r_{h, w}-c_k\right\|_2}}\left\|r_{h, w}-c_k\right\|_2^2 D(rh,w,C)=k=1Kk=1Keαrh,wck2eαrh,wck2rh,wck22(10)其中 α \alpha α是一个可调整参数。深度K-means的目标函数定义为:
    L c l u s t e r = ∑ h = 1 , w = 1 H r , W r D ( r h , w , C ) (11) \tag{11} L_{{cluster }}=\sum_{h=1, w=1}^{H_r, W_r} D\left(r_{h, w}, C\right) Lcluster=h=1,w=1Hr,WrD(rh,w,C)(11)为了初始化聚类中心,首先训练运动自编码器和空间自编码器以产生有意义的表示,并结合空间损失 l a l_a la和运动损失 l m l_m lm 。在对两个自编码器进行预训练后,随机选择几个运动表示及其相应的空间表示,然后对级联表示应用K-means算法以获得初始聚类值。深度K-means聚类也是在只包含正常事件的训练集上训练的,每个聚类中心可以被视为训练数据集中的某种正态性。测试集上的异常事件不会影响集群中心。在异常事件检测期间,不再优化聚类中心。通过将此类聚类项添加到架构中,空间和运动自动编码器可以提取更紧凑的表示。

    2.6 训练优化目标

    优化目标中包含了三个部分:

    1. 空间损失 L a L_a La
    2. 运动损失 L m L_m Lm
    3. 聚类损失 L c l u s t e r L_{cluster} Lcluster:最小化数据表示和簇中心的距离。
      L o s s = L a ( x f i f , x ‾ f i f ) + L m ( x d i f f , x ‾ d i f f ) + λ r L c l u s t e r (12) \tag{12} Loss = L_a(x_{fif},\overline{x}_{fif})+L_m(x_{diff},\overline{x}_{diff})+\lambda_rL_{cluster} Loss=La(xfif,xfif)+Lm(xdiff,xdiff)+λrLcluster(12)

    2.7 异常得分

    x ‾ f i f + x ‾ d i f f \overline{x}_{fif}+\overline{x}_{diff} xfif+xdiff生成的预测帧 x ‾ l i f \overline{x}_{lif} xlif可用于异常检测,即在所有像素位置上计算 x l i f x_{lif} xlif x ‾ l i f \overline{x}_{lif} xlif之间的欧几里德距离来衡量预测的质量。进一步测量了相应的连接表示与聚类中心 C C C之间的距离,因为每一个簇中心都可以被视为常态。我们根据公式10计算所有空间位置的距离,然后使用最接近的插值将损失图上采样到输入大小,表示为 D u D_u Du。对于给定的测试视频序列,将异常分数定义为它们的预测质量和聚类距离的乘积:
    s = 1 D u ∥ x l i f − x ‾ l i f ∥ 2 (13) \tag{13} s=\frac{1}{D_u\|x_{lif}-\overline{x}_{lif}\|_2} s=Duxlifxlif21(13)高得分意味着视频片段越正常。计算完所有视频序列的得分后,对损失进行归一化以获得每个视频帧在 [ 0 , 1 ] [0,1] [0,1]范围内的分数 S ( t ) S(t) S(t)
    S ( t ) = s − min ⁡ t ( s ) max ⁡ t ( s ) − min ⁡ t ( s ) (14) \tag{14} S(t)=\frac{s-\min_t(s)}{\max_t(s)-\min_{t}(s)} S(t)=maxt(s)mint(s)smint(s)(14)

  • 相关阅读:
    深度学习框架安装与配置指南:PyTorch和TensorFlow详细教程
    JNI查漏补缺(3)JNI调用java层
    Mask R-CNN
    机器人材料整理中的套-假-大-空话
    腾讯云MySQL数据库有哪些优势?应用于哪些场景?
    Flutter异步与线程详解
    app一键加固加签名脚本 百度加固 window版本
    基于SpringBoot的电子招标投标管理系统
    【Spring从入门到实战】第1讲:为什么要学习Spring框架?
    Gartner:机器人流程自动化RPA三大误区
  • 原文地址:https://blog.csdn.net/weixin_44575152/article/details/127152223