异常行为检测阅读笔记:Real-world Anomaly Detection in Surveillance Videos

前言

这篇仍然是以前写的,CVPR2018关于异常行为检测的文章。这篇文章比较特殊,因为它打破了以往异常行为检测默认的无监督套路,对异常行为进行了人为定义,即规定了几个需要检测的异常行为,而且都是在日常生活中比较常见的,并给出了一个他们自己构建的真实监控场景下的异常行为检测数据库。这个数据库明确规定了一些需要检测出来的异常行为,而且其构建方法也比较讨巧,即仅仅告知某段视频中存在某种异常,而不标注异常发生的具体位置,即这个数据库在无监督数据库基础上稍稍加入了一些监督信息,成为一个弱监督数据库。但是有人要问了,那数据库中没有涵盖的异常行为怎么办,算法无法检测更多其他的异常行为?这里说下我的想法:对一些公共场所,比如车站,对类似于斗殴,抢劫,暴恐这样的异常行为更为看重,而不是很在意一些无关紧要的异常(比如车站里躺在地上休息,或者因赶车而奔跑),在这种情况下这个数据库就非常合适,所以在人工智能还处于比较弱智阶段的当下,做一些取舍以换取更好效果的做法是对的。

Motivation

本文关于motivation的讲法个人觉得还是挺有道理的。作者首先质疑一直以来业界关于异常行为的定义,即背离正常行为模式的都是异常:首先,作者认为收集到全部的正常行为数据是几乎不可能的;其次,现实中某些行为在某些场景下是异常,但在另一些场景下就会变成正常(比如在公园里和在马路上骑摩托);还有就是正常与异常的界限很模糊,异常的判定需要我们合理掌握正常的尺度。这三点是异常行为检测一直以来需要解决的问题。作者认为,有时候加入一些异常信息让模型作参考对模型理解异常行为是很有帮助的,这一点我非常认同,毕竟一个孩子,你从小只告诉他什么是对的,却不告诉他什么是对的,他怎么可能正确的明辨是非?正确的做法是要时不时给他一点反面例子来帮助他理解,这样他对是非的分辨就会非常清晰。从算法层面讲,这一点是非常难实现的,神经网络还没这么高端,对小样本的学习还不够智能,但我觉得貌似是一个非常值得研究的点。
回到这篇文章上,我认为作者的设想是对的,但是落实到做法上却不够给力,他用MIL的方式,相当于给异常样本打上标签,然后做二分类(这里用的是回归,但本质上可以认为就是有监督二分类),效果上并不是我们想的用反面例子引导,而是过多使用了反面例子(不知这里表达清楚没,写的比较快)。下面介绍作者的做法。

方法与网络框架:Deep MIL Ranking Model

在正式开始之前,有必要介绍一下多示例学习(MIL)方面的知识,以下内容参考自这个链接https://blog.csdn.net/loadstar_kun/article/details/22849247 。
比如:我们想训练一个分类器来划分敏感词汇,那我们应该如何做?

  1. 寻找一个正规网站,采集词汇,构成负包,这样可以保证寻找到的都是正常词汇
  2. 寻找一个带有敏感词汇的网站,采集词汇,构成正包,这样可以保证包中既有敏感词汇,又有正常词汇
  3. 使用回归网络,对两个包中所有样本进行打分,从正负包中各选得分最高者,作为正例和负例,然后最大化二者得分间隔,不断迭代…
异常行为检测阅读笔记:Real-world Anomaly Detection in Surveillance Videos_第1张图片

搞懂了这一点,本文的方法就呼之欲出了,因为本文正是使用了多示例学习的方法 ,下面详述具体流程,在此之前,放主网络框图:

异常行为检测阅读笔记:Real-world Anomaly Detection in Surveillance Videos_第2张图片
1) 将每一个训练视频都分成数量相等的segments,然后分别构成正例包和负例包,以备训练。
异常行为检测阅读笔记:Real-world Anomaly Detection in Surveillance Videos_第3张图片
2) 使用C3D网络对每段segment提取4096维的时空特征,之后的多示例学习工作就基于这个feature来做
异常行为检测阅读笔记:Real-world Anomaly Detection in Surveillance Videos_第4张图片
  1. 使用一个神经网络(这里用了MLP)来对每一个segments打分,然后从正例包中挑一个得分最大的segments(潜在异常样本),同样从负例包中挑一个得分最大的(非异常样本,而且是个难例,即hard instance,有利于优化分界面),用它俩来训练MLP的模型参数,采用hinge-loss,训练的效果就是模型对异常样本输出高的分,对正常样本输出低得分。
异常行为检测阅读笔记:Real-world Anomaly Detection in Surveillance Videos_第5张图片
这里单独介绍一下损失函数,上文说过,主loss采用hinge-loss,如下式所示,这里f()就代表整个网络的输出,即得分,这个loss的作用就是拉大正例和负例的得分差距,自己手动模拟一下就明白了。
4) 然后,作者为了保证效果,又加了两个约束。第一个是平滑约束,因为每个包中的segments都是来自于同一个视频,所以他们之间的得分应该是平滑变化的,具体做法就是让相邻两个segments的得分差的平方值足够小;第二个是稀疏约束,因为正例包中只有少数异常样本,其余大多数都是非异常,而我们的优化有可能导致正例包中所有样本都趋向于高的分,所以最好用一个loss单独约束其整体得分。这两个loss也比较平凡易懂,如下式:
异常行为检测阅读笔记:Real-world Anomaly Detection in Surveillance Videos_第6张图片
所以这三个loss加一块就是这样:
异常行为检测阅读笔记:Real-world Anomaly Detection in Surveillance Videos_第7张图片
再加上正则化项,就得到最终的目标函数:

实验

数据集部分大家自己去网站上看看,UCF Crime,貌似访问不上了?毕竟是自己搞的网站,没法像企业网站一样稳定,大家理解就好,下载渠道不只官网,kaggle上貌似也有。
实验部分,首先,与SOTA比较,效果还可以,如下图和下表所示:

异常行为检测阅读笔记:Real-world Anomaly Detection in Surveillance Videos_第8张图片
异常行为检测阅读笔记:Real-world Anomaly Detection in Surveillance Videos_第9张图片
下面是部分样例效果,看看就好:
异常行为检测阅读笔记:Real-world Anomaly Detection in Surveillance Videos_第10张图片
再下面是训练过程,看看就好:
异常行为检测阅读笔记:Real-world Anomaly Detection in Surveillance Videos_第11张图片

结束语

你可能感兴趣的:(机器学习,深度学习,神经网络)