目录
本文的任务是实现对人体行为的零样本异常检测,发表在CVPR2023。
预训练
skeleton feture extractor
本文首先使用姿态提取器将图像中人物的关键点提取出来,每个关键点由一个长度为7的向量表示。基于人体关键点的学习能规避环境的影响。
然后使用一个DNN对关键点进行特征提取,得到skeleton feture。
本文使用的DNN基于PointNet进行改进,特别的使用了Max-Pooling实现稀疏传播,这么做的好处是可以处理无序的关键点、宽容FN和FP的存在(关键点检测的错误会影响结果,所以必须能够对这种错误具有鲁棒性)、能适应多人目标的场景。网络结构如下。
该DNN不使用目标数据集进行训练,而是使用其他的大型数据集进行预训练,并且在后续步骤冻结该预训练权重,使用大型预训练数据集可以解决域差异的问题。
text prompt
由于本文是使用零样本的方式进行异常检测,后面在目标数据集上训练时仅使用正常数据集,但是由于某些正常种类的数据在训练阶段的缺失会造成测试时的误判。
所以在预训练的时候引入了text prompt机制,经过一个text encoder,引入CLIP的文本-图像的对比损失,学习文本-图像对齐,这样在测试时有text prompt的引导可以减少误判。
由于text prompt的存在,我们一定程度上可以利用它来指定异常类别,并且在推理时能处理没有出现过的类别。此外合理的设计text会影响结果。
损失函数
最后的损失函数由两部分组成。第一个是DNN的分类损失,这里会再加一个分类头;第二个是文本-图像对比损失。
训练
在训练阶段其实没有参数的更新,网络参数被冻结,仅学习一个分布。
这里把目标数据集(非预训练使用的大型数据集)的正常样本经过上面的预训练网络得到skeleton feature,在这些特征上学习一个属于正常样本的分布,通过衡量测试样本距离这个分布的距离给出异常分数。分布的参数和距离度量如下图。
当然这里的正常和异常是相对的概念,这里的“正常”理解为用于训练的行为。我们也可以学习异常样本的分布,不过最后结果要反过来。
推理
推理结果由两部分组成,两个分数相乘。
第一个异常分数就是上面提到的,由测试样本和学习到的正样本分布的距离决定。
第二个是看图中的异常和text prompt是否匹配,这里需要利用text encoder的输出和skeleton feature的相似度,完整计算过程 如下图。
可以看到由于使用了预训练和CLIP的text prompt,通过仅学习正常样本(甚至是不完成的正常样本,由text prompt优化这个问题)的分布实现了零样本的检测。