当前位置:AIGC资讯 > AIGC > 正文

VAD-LLaMA:基于大语言模型的视频异常检测和解释(Video Anomaly Detection and Explanation via Large Language Models)

文章目录

问题 方法 整体架构 VE and Feature Extraction Long-Term Context (LTC) Module Feature Adaptor LLaMA 训练 流程图 第一阶段:训练VADor 第二阶段:联合训练VADor和LTC 第三阶段:指令微调Adaptor 实验 结论

arXiv:2024.01.11
开源:code

问题

作者认为之前基于异常评分的方法面临两个问题:①需要设置判定为异常的阈值;②对于检测到的异常缺乏可解释性。

所以作者在VAD框架中引入了VLLMs来解决上面两个问题,但是这里又会遇到两个问题:①使用Video-LLaMA的VE(视频编码器)来提取到的特征并没有关注上下文,因为CLIP的VE是基于短视频预训练的,而异常视频大多是长视频,这样子的话模型就会关注到那些不是异常的地方,而忽略了真正要关注的地方,即异常;②微调VLLMs需要大量的标注数据,例如UCF-Crime仅提供视频级标签,而且仅有1.9K的训练视频,这远远小于VLLM的训练数据集WebVid,它又10M个训练视频。

如图1:①上面的一部分是异常评分,红色虚线是两个不同的阈值,可以看到对于模型的预测分数,如果我们选择的阈值不同,那么最终得到的预测结果也是不一样的;②中间部分是一个关于车祸的异常视频片段;③下面的部分是有原始的VLLMs对异常视频片段生成文本描述,通过绿色框可以发现生成的描述其实并没有关注异常事件,而是关注了一些其他的东西,橙色框的话是关注到了异常事件,这反映了原始的VLLMs对于异常检测的能力不是很好,更偏向于理解视频的一般内容。

方法

作者在VADor中引入LTC模块来缓解VLLMs的长期上下文建模能力,设计了一个三阶段训练方法来提高VLLMs的微调效率。

作者采用了端到端的方式来处理WSVAD(弱监督)问题,端到端的意思是从输入到输出的整个处理过程在一个完整的模型中完成,不需要人工干预或中间步骤

整体架构

如图2,VAD-LLaMA主要由3部分组成:①VADor,内嵌一个LTC模块来捕获长距离依赖,还有一个AP模块来预测分数;②Adaptor模块,用于将提取到的特征与LLaMA的输入维度对齐;③预训练好的Video-LLaMA,包括一个LLaMA来生成字幕,还包括一个VE来提取原始视频的特征。

VE and Feature Extraction

对于给定的一个视频序列,首先将其划分为 m m m 个segments,然后对于每一个 segment,从中再随机采样一个 video clip (consecutive frames) 输入到预训练的VE中来提取到 clip-level 特征,表示为 x i , i ∈ { 1 , . . . , m } \mathbf x_i, i\in \{1, ..., m\} xi​,i∈{1,...,m}

这里的VE使用的是Video-LLaMA的 图像编码器BLIP-2+Video-Qformer

Long-Term Context (LTC) Module

上面的VE特征是缺乏上下文信息的,所以引入LTC模块来解决这个问题。

首先收集 K K K 个最小/大的异常分数的 clip-level VE特征组成为一个 正/异常列表,用 N = { n j } j = 1 K \mathbf N=\{\mathbf n_j\}_{j=1}^K N={nj​}j=1K​ 表示正常列表, A = { A j } j = 1 K \mathbf A=\{\mathbf A_j\}_{j=1}^K A={Aj​}j=1K​ 表示异常列表;然后这两个列表会在线更新,即当有新的 clip 时,会根据它的分数是否小/大于列表中的来更新列表。

此外,使用交叉注意力将两个列表的信息融入到VE特征中,称之为LTC特征。LTC特征由两个用处:①给AP来评分;②与VE特征stack一下,一起作为 visual prompts 输入给LLaMA来生成字幕。

这里需要特别解释一下,反正我这里是读了四五遍才大概读懂:
LTC模块里面的列表并不是固定不变的,每个视频都会对应一个正常列表和一个异常列表。

假设我们有一个长视频,视频被分成多个片段。在测试开始时,LTC模块并不知道哪些片段是“正常”的,哪些是“异常”的。

当模型处理第一个片段时,它会使用训练好的异常预测器(Anomaly Predictor,AP)对该片段进行评分,评分表示该片段的异常程度。 假设这个片段的异常评分为0.2(低于阈值),被认为是一个“正常”的片段。此时,LTC模块会将该片段的特征放入“正常列表”中,因为这是目前为止最“正常”的片段。 接下来,模型处理第二个片段,对其进行异常评分。假设第二个片段的异常评分为0.8(高于阈值),它被认为是“异常”的。于是,这个片段的特征会被放入“异常列表”中。
随着视频片段的处理,LTC模块会持续更新“正常列表”和“异常列表”: 如果新片段的异常评分低于当前“正常列表”中某个片段的评分,那么新片段可能会替换掉旧片段进入“正常列表”。 同样,如果新片段的异常评分高于“异常列表”中的某个片段,那么新片段可能会替换掉旧片段进入“异常列表”。 在每个片段被处理时,LTC模块不仅考虑当前片段的特征,还会使用跨注意力机制将“正常列表”和“异常列表”中的特征与当前片段的特征进行融合。 例如,假设现在处理第三个片段,这个片段的异常评分为0.3。LTC模块会通过跨注意力机制,将这个片段的特征与之前确定的“正常列表”和“异常列表”中的特征进行对比,提取相关的上下文信息,并将这些信息整合到当前片段的特征中。 随着视频片段的处理,“正常列表”和“异常列表”会逐渐填满,并反映出视频中最“正常”和最“异常”的部分。 在整个视频的测试过程中,这些列表会不断更新,以确保它们始终包含视频中最具代表性的“正常”和“异常”片段。

那么,关键问题来了,他这样怎么就捕捉了长时间尺度的信息?

看这个例子你就懂了:很多异常行为并不是孤立发生的,它们可能依赖于前后片段的情境。通过整合上下文,LTC模块能够更准确地识别异常,例如在一个盗窃事件中,前期的可疑行为(如撬门或观察)加上后期的异常行为(如物品消失)共同构成了“异常”的定义。

Feature Adaptor

Adaptor表示为 f f f,即一个FC层,作用是将 visual prompts 与 LLaMA 的输入维度对齐

这里真奇怪,前面说两个FC层,这里又说一个FC层,到底是几个?

LLaMA

VAD-LLaMA 使用指令调优数据进行微调,指令格式为QA对,如下是一个示例,下划线部分为生成的伪指令

[Video Tokens] 表示插入 visual prompts 的位置 [Video Description] 表示简单的 clip 的细节,如视频长度和帧的采样率

在VAD-LLaMA微调过程中,首先会使用预训练的LLM将 Q u e s t i o n Question Question 转为文本嵌入,然后将其与 visual prompts 合并作为LLaMa的输入,将LLaMA生成的 A n s w e r Answer Answer 转换为文本嵌入得到 “ground truth”。

这里我是真没搞明白,下划线明明是说的异常的时间位置,LLM是生成这个的吗,我怎么感觉图3中描述的不是这样子,图三中明明LLaMA生成的是描述,而异常的时间位置是由AP生成的分数来退出来的吧?
我猜测是 Q u e s t i o n Question Question 与 A n s w e r Answer Answer 作为指令调优数据,然后给LLM生成来生成文本描述以解释异常。
读了后面的又感觉图2中那些全是指令调优数据,那么这个是在训练的时候得到的?那还怎么使用这个训练呢???
我知道了,指令调优数据是在微调的第3阶段得到的,就是前两个阶段会生成异常分数,然后将这些异常分数转换为伪指令,即下划线部分,同时,手动编写的异常文本模板会输入给LLaMA,让其生成异常描述,然后,这两个结合起来就是指令调优数据的gt值。有了指令调优数据,就可以来微调Adaptor了,简单来说就是通过比较LLaMA生成的文本输出与伪指令中的“真实”回答,利用交叉熵损失函数来优化Adaptor的参数。

训练

流程图

如图3:①第一个阶段,会将 clip-level 的VE特征输入给VADor训练一个AP来预测初步的异常分数,这也就建立了一个baseline;②第二个阶段,原始的分数会帮助LTC模块来选择最小/最大的正/异常片段的特征组成列表,此阶段LTC模块和AP同时训练,将长期上下文信息合并到表示学习和异常检测中(交叉注意力得到新特征 X ~ i \tilde {\mathrm X}_i X~i​ );③第三个阶段,使用VE特征和LTC特征来训练投影层Adaptor,即微调VAD-LLaMA,同时改进后的分数会通过文本模板转为伪指令,并拼接到原有答案的后面来作为真实答案。

没看懂,怎么训练的Adaptor???

第一阶段:训练VADor

直接将VE特征通过AP g g g 来训练了一个简单的 VADor baseline。

这里使用WSVAD的MIL方法来训练一个 clip-level AP g g g, g g g 中的参数使用BCE损失优化:

S \mathcal S S 是元组 ( y ′ , y ) (y', y) (y′,y) 的集合,每个视频对应一个元组 y ′ y' y′ 是 m a x { g ( x i ) } i = 1 m max\{g(\mathbf x_i)\}_{i=1}^m max{g(xi​)}i=1m​ y y y 是 video-level 标签

其实就是用MIL方法训练了一个检测器,与传统方法几乎无差别,无非就是之前可能用的C3D特征或者I3D特征,这里使用的是VE特征

突然有一个疑惑:这里训练出来的是片段级的检测器,我记得以前的好像都是帧级的吧?有点不太确定了

第二阶段:联合训练VADor和LTC

正如之前提到的,前 top- K K K 个正/异常特征组成列表 N \mathbf N N 和 A \mathbf A A,当输入给LTC新的 video clip 时,会根据其分数来在线更新列表。

他这个更新是只针对一个长视频而言的,还是说会针对于所有的视频而言?训练的目的就是更新LTC中的列表吗?

引入了交叉注意力将上面的列表融入到新的 video clips 的VE特征中,将VE特征 x i \mathbf x_i xi​作为 query,将列表 N \mathbf N N和 A \mathbf A A 同时作为 key 和 value,以第 i i i 个VE特征为例:

相似性计算:前面括号内的 query 和 key 的点积运算,用于计算 query 和 key 之间的相似性 加权和:括号和后面的点积运算,即将 query 与 value中与之相关的信息 相结合 最后表示为 n i \mathbf n_i ni​ 和 a i \mathbf a_i ai​

关于交叉注意力,可以通过这个简单的例子进行理解:
图像字幕生成
假设我们有一张图像,图像中有一只猫在沙发上睡觉。我们希望通过图像字幕生成模型生成一句描述这张图片的文本,比如“猫在沙发上睡觉”。

提取图像特征作为Query 生成文本的初始单词,比如为“猫”,文本特征作为Key和Value 交叉注意力计算图像特征(Query)和生成的文本单词“猫”(Key和Value)之间的相似度,看图像的哪些部分与“猫”这个词最相关 使用计算出的注意力权重,将图像特征与“猫”这个单词的特征融合,生成一个新的特征表示,这个新的特征表示既包含了图像信息,也包含了当前生成的文本信息

接下来,将得到的特征与VE特征结合为:

这里不需要超参数,而是引入 neural soft weights( w n , w a ∈ W w_n, w_a \in W wn​,wa​∈W) 来自动平衡特征。将得到的特征 x ~ i \tilde {\mathbf x}_i x~i​ 输入给 AP 预测改进后的分数。

VADor和LTC共同使用 式1 训练

另外,作者还给出了一个plus版本,即Long-Short-Term Context (LSTC)。即添加了一个列表 H = { h j } j = 1 K \mathbf H=\{\mathbf h_j\}_{j=1}^K H={hj​}j=1K​,它存储了过去的 K K K 个VE特征,进一步整合了涉及发生事件变化的短期历史信息

第三阶段:指令微调Adaptor

简单来说,Adaptor就是将VADor与Video-LLaMA连接起来。作者在这里只训练了Adaptor,说是因为VAD数据受限,所以冻结了VADor、VE、LLaMA,以此减少模型对大规模训练数据的依赖性。

为了将视频特征和异常信息给LLaMA,这里将LTC特征(anomaly prompt)和VE特征(visual information)堆在一起,即 x ^ = [ x i , x ~ i ] \mathbf{\hat x}=[\mathbf x_i, \tilde {\mathbf x}_i] x^=[xi​,x~i​],然后通过 Adaptor f ( x ^ i ) f(\mathbf{\hat x_i)} f(x^i​) 充当 clip-level soft visual prompts 来指导LLaMA生成文本。

因为WSVAD中没有帧级注释,所以给不了LLaMA时间指令,于是作者将异常分数转为 pseudo instructions,然后将其与异常相关的文本模板组合到一起生成 instruction-tuning data。

为了生成 video instruction pairs,首先将 visual prompts 插入到 Q u e s t i o n Question Question 的文本嵌入中,然后根据 video clip 的持续时间将分数转为 pseudo instruction,因此对于第 i i i 个 video clip,其 video instruction pair 表示为 ( y ^ ′ , y ^ ) (\hat y', \hat y) (y^​′,y^​),其中 y ^ ′ = [ f ( x ^ i ) , Q ] \hat y'=[f(\hat {\mathbf x}_i),Q] y^​′=[f(x^i​),Q] 表示LLaMA的输入, y ^ \hat y y^​ 表示伪指令对应的文本嵌入。

为了防止过拟合,从 UCF-Crime 和 WebVid 中抽取得到训练集 P \mathcal P P,使用交叉熵损失进行训练:

n n n 表示 y ^ \hat y y^​ 的 embedding tokens 数量、 y ^ j \hat y_j y^​j​ 表示 token j j j 的真实标签值 L L a M a A ( y ^ ′ ) j \mathrm{LLaMaA}(\hat y')_j LLaMaA(y^​′)j​ 表示 LLaMA 对 token j j j 预测的概率

实验

使用的数据集为UCF-Crime和TAD,两个数据集使用的评价指标都为AUC,不过这里的AUC又分为了两种,一种是在整个测试集上的 A U C O \mathrm{AUC}_O AUCO​,一种是只在异常片段上的 A U C A \mathrm{AUC}_A AUCA​

A U C O \mathrm{AUC}_O AUCO​ (Area Under the Curve Overall):这是在整个测试集上计算得到的AUC值,用于衡量模型在所有测试视频上的整体表现,包括正常和异常的视频。AUC值反映了模型区分正常与异常样本的能力,值越高表示模型性能越好。

A U C A \mathrm{AUC}_A AUCA​ (Area Under the Curve for Abnormal):这是专门为异常视频计算的AUC值。这一指标的计算只考虑那些标记为异常的视频(即包含异常事件的视频),目的是评估模型在实际存在异常的情况下定位和检测异常的能力。这种方法可以更加准确地反映模型在处理复杂场景和检测细微异常方面的有效性。

下面是 baseline VADor 与 WSVAD下的SOTA 的比较,表中确实显示了 VADor w LSTC 性能最好,那为什么文中只是用了 LTC,而不用 LSTC ?
作者说baseline VADor 比 基于MIL的2阶段模型 好是因为预训练的VE特征对视频理解的更到位。
作者认为VADor在TAD上的 A U C O \mathrm{AUC}_O AUCO​ 次于 UMIL 是因为VE是冻结的,而UMIL是基于VAD数据训练的。不过呢,VADor 的 A U C A \mathrm{AUC}_A AUCA​ 优于 UMIL,表明了 UMIL 擅长区分正常片段,而 VADor 更擅长定位异常片段。

下面是3个例子,橙色文本框是问题,蓝色文本框是 VAD-LLaMA 回复的,灰色文本框是 Video-LLaMA 回复的。可以发现 VAD-LLaMA 回复的效果很好,Video-LLaMA 也在尽力将场景中的事件与异常关联起来,只不过效果不是那么好。


下面是关于 VADor 的消融实验,其中 Nor、Abn 分别表示正/异常列表,His 表示那个扩展的历史列表,UMIL 表示使用 VE特征 重新实现了 UMIL 以证明 VADor。

下面是对特征列表长度 K K K 的消融实验。作者认为 K K K 的取值取决于异常检测对视频上下文的依赖程度,较小的 K K K 可能无法捕获足够的时间信息,而较大的 K K K 可能涉及意外的噪声。

因为UCF-Crime提供了异常类的标签,所以这里可以进行 Class-wise AUC,即类级别AUC实验。如下图,他的图注给的有点歧义,这里来解释一下:①Baseline为没有LTC模块的VADor;②VADor为内嵌LTC模块的VADor;③UMIL为无偏的MIL方法。

可以观察到两点:①Baseline和UMIL在检测具有显著动作变化的异常(如“攻击”和“故意破坏”)方面表现出色。这些异常由于视频中的剧烈变化而相对容易检测,现有特征表示学习方法能够有效捕捉到这些变化;②Baseline和UMIL在检测需要长期时间分析的异常(如“纵火”和“商店盗窃”)时面临挑战。这类异常通常涉及较长时间的细微变化,需要更强大的长期上下文建模能力才能准确检测。

结论

作者主要是提出了一个新颖的VAD方法,即VAD-LLaMA,将VLLMs加进了VAD框架,使得模型不仅可以检测异常,还可以解释异常,当然了,检测异常的时候还不用手动选择阈值。

创新点主要是:①在MIL基线即VADor上引入了一个LTC来建模长期上下文(还有一个扩展,引入短期历史信息);②提出了三阶段训练方法,使得在训练VLLMs到VAD领域时效率更高,即减少数据需求和降低标注成本。

方法减少数据需求和标注成本的原因如下:

减少数据需求

分阶段训练:三阶段训练方法通过分阶段的方式逐步增强模型的能力,每个阶段有不同的重点和目标。这种逐步增强的训练方式可以在较小的数据集上实现有效的性能提升。

利用弱监督数据:在早期阶段(特别是第一阶段),该方法利用弱监督数据来训练模型。这种数据比全监督数据更容易获取,从而减少了对详细标注数据的需求。

高效特征提取:通过使用预训练的视频编码器(Video Encoder, VE),模型可以从少量数据中提取高质量特征,从而有效地进行异常检测。预训练的模型已经在其他大规模数据集上获得了丰富的表示能力,因此可以在较小的特定领域数据集上应用。

降低标注成本

自动生成伪指令:在后续阶段,该方法通过将异常检测模型的输出分数转换为伪指令,减少了对手动编写训练指令的需求。这种自动生成的过程依赖于简单的文本模板,使得创建训练数据的过程更为简化。

减少对精细标注的需求:由于第一阶段和第二阶段的训练过程已经通过弱监督学习和特征学习为模型打下了良好的基础,第三阶段的微调仅需要较少的精细标注。这意味着即使没有详细的帧级异常标注,模型仍然可以有效学习。

使用通用数据集增强多样性:通过引入其他通用数据集(如WebVid)来提供更多样化的训练样本,降低了仅依赖特定领域数据(如UCF-Crime数据集)的需要。这种方法有助于提高模型的泛化能力,同时减少了对特定领域标注数据的依赖。

总结

更新时间 2024-08-29