文章目录
CVPR 2024
问题
目前的弱监督VAD固有地局限于封闭集设置,在开放世界中可能会遇到困难,即可能无法检测或者分类训练期间没有的异常。
最近也有一种开放集VAD(open-set VAD),虽然它可以检测到没见过的异常,并不能识别出异常的类别。
如图1:(a)和(b)旨在对每一帧检测是否为异常帧,并不会进行分类,同时都是在闭集下训练的,也就是说可能无法检测到没见过的异常事件; (c)虽然摆脱了闭集,但是主要致力于开放世界检测而忽略了异常分类,且在语义理解方面不行,导致了在开放世界中检测过程的模糊性。
- (a)是半监督VAD,假设在训练阶段只有正常样本,不符合这些正常训练样本的测试样本被识别为异常,可以视为是单分类任务
- (b)是弱监督VAD,假设在训练阶段有正常和异常样本,但异常事件的精确时间注释是未知的,可以视为二分类任务
- (c)是开集VAD,训练正常和可见异常样本,可以检测没见过的异常
- (d)是OVVAD,训练正常和可见异常样本,可以检测并分类没见过的异常
方法
提出了OVVAD(open vocabulary video anomaly detection),目标是利用预训练的大模型
来检测和分类
见过的和没见过
的异常
OVVAD可以解耦为两个任务:①类无关检测
任务(class-agnostic detection);②特定类分类
任务(class-specific classification)。两个任务联合优化。
为了改进类无关检测:①使用时间适配器模块来建模时间关系;②使用语义知识注入模块将文本知识整合到视觉信号中。
为了改进特定类分类任务:①文本与视频对齐;②使用异常合成模块生成视觉材料
问题陈述
训练样本 X = { x i } i = 1 N + A \mathcal X=\{ x_i\}_{i=1}^{N+A} X={xi}i=1N+A
- X n = { x i } i N \mathcal X_n=\{x_i\}_i^N Xn={xi}iN 表示正常样本
-
X
a
=
{
x
i
}
N
+
1
N
+
A
\mathcal X_a=\{x_i\}_{N+1}^{N+A}
Xa={xi}N+1N+A 表示异常样本
- 每个样本 x i x_i xi 对应一个视频级分类标签 y i ∈ C b a s e y_i \in C_{base} yi∈Cbase
C b a s e C_{base} Cbase 表示可见异常, C n o v e l C_{novel} Cnovel 表示未见异常,他们组成 C \mathcal C C
模型旨在预测每帧的异常置信度,如果异常存在则识别异常类别。
整体框架
如图2,这里的蓝色
区域为模型的流程图
,而绿色区域分别为SKI模块和NAS模块的放大图。
对于类无关检测
任务:给定一个训练视频,首先会将它输入给CLIP的图像编码器
Φ
C
L
I
P
−
v
\Phi_{CLIP-v}
ΦCLIP−v 以得到帧级特征
x
f
∈
R
n
×
c
x_f \in \mathbb R^{n\times c}
xf∈Rn×c(
n
n
n 是帧数,
c
c
c 是特征维度),然后这些特征会经过 TA模块+SKI模块+检测器,最终得到 帧级异常置信度
p
p
p
对于特定类分类
任务:首先生成一个跨帧级的视频级聚合特征,然后使用CLIP的文本编码器生成异常类别的文本特征/嵌入,最后将视频级特征和文本级特征对齐 来分类异常
此外,引入NAS模块,它在LLM和AIGC的帮助下生成潜在的新异常,以实现新类别识别
TA - Temporal Adapter Module
在经典图卷积网络的基础上设计了一种几乎无权重的时间依赖性适配器:
-
根据每两帧之间的位置距离来捕捉上下文依赖
-
L N LN LN 是层正则化操作
-
H H H 是邻接矩阵
-
s o f t m a x softmax softmax 是为了保证 H H H 的每一行之和等于 1 1 1
-
第 i i i 帧和第 j j j 帧之间的接近关系只取决于它们的相对时间位置,两帧之间的时间距离越近,则接近关系分数越高
-
σ \sigma σ 是超参数,用于控制距离的影响程度
注意:TA模块只有LN涉及少量参数
SKI - Semantic Knowledge Injection Module
如图2,对于正常事件,给LLM的提示为固定模板来获得常见的场景和动作(如街道、公园、商场、散步、跑步、工作等);对于异常事件,给LLM的提示与异常相关的额外单词(如爆炸、爆裂、火光等)——> 最终会获得一些由名词(场景)和动词(动作)短语列表 M p r i o r M_{prior} Mprior
然后将
M
p
r
i
o
r
M_{prior}
Mprior 输入给CLIP的文本编码器
Φ
C
L
I
P
−
t
\Phi_{CLIP-t}
ΦCLIP−t 来提取文本嵌入,即语义知识:
- F t e x t ∈ R l × c F_{text} \in \mathbb R^{l\times c} Ftext∈Rl×c,这里 l l l 没说,应该是词向量的数量, c c c 的话是特征维度
- Φ t o k e n \Phi_{token} Φtoken 表示将单词转换为向量的语言标记器(language tokenizer)
上面是得到了语义信息,下面要将这些语义知识有效地整合到视觉信息中,使用跨模态注入策略鼓励视觉信号去找与之最相关的语义知识:
- F k n o w ∈ R n × c F_{know} \in \mathbb R^{n\times c} Fknow∈Rn×c
这里得到的是经过视觉加权后的文本知识,最后将 F k n o w F_{know} Fknow 和原来的视觉特征 x t x_t xt 连接起来送进二元分类器中。
这里是怎么加权求和的,没看明白。
NAS - Semantic Knowledge Injection Module
这里是基于潜在异常类别生成一系列伪新异常,用这些样本去微调模型来改进检测和分类新异常,主要有三步:
第一步:用预定义的模板 p r o m p t g e n prompt_{gen} promptgen 提示LLM生成prompt给AIGC来生成相应的图像/短视频
- V g e n V_{gen} Vgen 包括生成的图像 I g e n I_{gen} Igen 和生成的短视频 S g e n S_{gen} Sgen
- p r o m p t g e n prompt_{gen} promptgen 例如:generate ten shorter scene descriptions about “Fighting” in real world
第二步:将生成的图像 I g e n I_{gen} Igen 转化成视频(采用不同裁剪比例的中心裁剪机制来选择相应的图像区域,然后将这些区域的大小调整回原始大小并将它们级联以创建新的视频片段 S c a t S_{cat} Scat)
第三步:这里将 S g e n S_{gen} Sgen 和 S c a t S_{cat} Scat 随机插入到随机选择的正常视频中,以此来模拟长而未修剪的视频,最终得到伪异常样本 V n a s \mathcal V_{nas} Vnas
模型前面不是已经用 X \mathcal X X 训练过了嘛,这里再使用 V n a s \mathcal V_{nas} Vnas 来微调一下
这里的话感觉很怪异:①用一张图像生成视频,你不管怎么裁剪也整不出来连续的动作吧,那么你肯定是异常的呀;②你将生成的异常片段直接插入到正常视频中,你插进来的与人家原来的背景都不一样,这也太容易被判断为异常了吧。
目标函数
没有伪异常样例时的训练策略
对于无类别检测任务:使用 T o p − K \mathbf{Top-K} Top−K 机制在正/异常视频中选择异常置信度最高的前 K K K 个,然后取平均值输入给 s i g m o i d sigmoid sigmoid 函数作为视频级预测,然后给 视频级预测和二元标签 做二元交叉熵损失 L b c e L_{bce} Lbce
- 对于异常视频, K = n / 16 K=n/16 K=n/16
- 对于正常视频, K = n K=n K=n
对于特定类分类任务:计算聚合的视频级特征和文本类别嵌入之间的相似性,以得出视频级分类预测,然后使用交叉熵损失函数来计算视频级分类损失
L
c
e
L_{ce}
Lce。因为OVVAD是一个弱监督任务,不能直接从帧级注释中获得视频级聚合特征,所以使用软注意力来获得:
- p p p 为检测器输出的帧级异常置信度
这样置信度高的帧加权的特征就大
软注意力:这种方法允许模型平滑地关注输入中的所有部分,并根据权重的大小决定每个部分的重要性,从而捕捉更多的相关语义信息
对于SKI模块的参数 F t e x t F_{text} Ftext:①对于正常视频,先提取每个视频与文本知识嵌入之间的相似度矩阵,然后选取每帧中得分最高的前10%并计算平均值,最后应用于交叉熵损失函数 L s i m − n L_{sim-n} Lsim−n,这样子视觉特征与正常知识嵌入的相似度较高,与异常知识嵌入的相似度较低;②对于异常视频,使用Top-K的硬注意选择机制来定位异常区域,然后执行相同的操作来来计算 L s i m − a L_{sim-a} Lsim−a,这样子异常知识嵌入和异常视频帧特征之间具有高度相似性
这里描述的完全没看懂:①为什么参数是 F t e x t F_{text} Ftext 都没看明白;②交叉熵损失计算了个啥,谁和谁做交叉熵?
最终的损失函数为:
- L s i m L_{sim} Lsim 为 L s i m − n L_{sim-n} Lsim−n 和 L s i m − a L_{sim-a} Lsim−a
微调
V n a s \mathcal V_{nas} Vnas 有帧级注释,所以是可以使用帧级的交叉熵损失函数
对于检测: L b c e 2 L_{bce2} Lbce2 是帧级的二元交叉熵损失
对于分类:
L
c
e
2
L_{ce2}
Lce2 是与
L
c
e
L_{ce}
Lce 除了多了点新类别以外,其余都一样
实验
使用了3个数据集:UCF-Crime、XD-Violence、UBnormal
评估检测性能:
- 对于UCF-Crime和UBnormal,使用AUC
- 对于XD-Violence,使用AP
评估分类性能:
- 对于UCF-Crime和XD-Violence,使用TOP1准确率
- 对于UBnormal,使用AUC
难以理解的是,为什么后面又说在测试阶段为整个类别提供了这些指标,并分别为UCF-Crime和XD-Violence的基础和新类别提供了这些指标,怎么又分了一个测试阶段,上面说点那些指标不就是在测试阶段使用的嘛?其实描述的就是一个阶段,上面说的就是测试阶段使用的指标,下面只不过是又具体说了一下对数据集怎么测。
不过为什么没看到TOP1准确率呢???
使用了一张RTX3090训练的
如表1、2、3是与SOTA方法的比较,这里使用 † † † 标记的表示这些方法遵循传统的VAD工作,并使用包括新的异常样本的整个训练集,使用 ∗ * ∗ 标记的表示分类设置与我们的不同。需要注意的是,这里大多数方法都使用与本文相同的视觉特征重新训练了。第一列是整体的AUC,第二列是基础异常的AUC,第三列是新异常的AUC。当涉及到新类别时有优势。这里比较的应该都是检测性能
表4、5、6是关于检测性能的消融实验。对于所有的测试类别和新的异常类别,NAS模块对于类无关检测都有提升,但对于基本类别,它会下降,因为伪新样本的引入使模型更加关注这些生成的新样本,从而部分地降低了基本类别的重要性。
表7是关于分类性能的消融实验。在微调阶段,仅使用生成的新样本会导致基本异常类别的性能明显下降
这里没搞清楚,它上面不是说只用生成的异常样本来微调模型嘛,这里怎么又使用基础异常又使用生成异常来微调?
表8为跨数据集分析,即在一个数据集上训练,然后在另一个数据集上看看其表现。
图3为三个数据集的定性检测结果,无论是基础类别还是新类别,即使在一个视频中有多个不连续的异常区域,也能在异常区域产生很高的异常置信度
图4为混淆矩阵,无论是基础异常还是新异常,模型无法有效识别其中一些
结论
这篇研究的是弱监督下的开放词汇视频异常检测任务,方法划分为2个任务,一个是只管检测异常,一个只管给异常分类。他认为重要的有:①是几乎没权重的TA模块;②可以给视觉信号注入语义知识的SKI模块;③可以生成伪异常样本的NAS模块。
这里感觉NAS模块生成的伪异常样本不是很好吧应该,然后TA模块总感觉似曾相识,可能不够新颖吧。
这篇论文不是想强调开放世界吗,但是呢,好像只有NAS模块微调了一下,就开放世界了?不过我感觉他那个进行特定类分类时用到了一些词汇,难道这里才是核心?
还有就是,这篇论文根本没用到LLMs吧,就是用了一下CLIP的编码器而已。