使用Motion-Vector实现Real-time人体行为识别

导言:由上一篇博客的方法实现人体行为识别,准确率高,但缺陷在于速度慢,最大的原因在于经典的two-stream的人体行为识别均使用光流图作为temporal net的输入。光流法速度慢,在应用中无法实时。

这篇博客引用论文

Real-time Action Recognition with Enhanced Motion Vector CNNs——–Bowen Zhang, Limin Wang, Zhe Wang, Yu Qiao, Hanli Wang

MotionVector来替代optical flow可以极大的提升速度。MotionVector原本用于视频压缩,以便视频传输到指定端后解压。论文中使用MotionVector作为运动特征来使用。但是速度快带来的缺陷是图片精度低,与光流图的点状形式存在不同,运动向量图以块状存在,因此图片不清楚,噪声多,势必带来识别准确率的下降。

该网络的核心思想是通过使用optical flow训练好的OF-CNN指导MV-CNN的训练。该transfer knowledge思想来自于Hinton大神的一篇论文:

Distilling the knowledge in neural network

论文中使用了两种方法来防止精度过度下降。

1.使用Teacher Initialization进行初始化。即使用opticalflow的model进行初始化,再用motion vector进行fine-tune.

2.使用监督性transfer。即定义一种新的loss。该loss称之为Teacher superivision loss(TSL)。使用softmax loss 和TSL共同监督网络。使用Motion-Vector实现Real-time人体行为识别_第1张图片

TSL公式如下这里写图片描述

PT(i)代表optical flow在fc layer的值除以Temp,并经过softmax的输出。Ps(i)是MV-CNN的softmax输出(不用除以TEMP)。TEMP是来自于Hinton的论文,称之为temperature (to soften the next-to-last layer output)。

MV-CNN网络本身的LOSS,即普通的softmax:

这里写图片描述

最终的LOSS为

这里写图片描述
其中w是权重,一般设置为4,Temp一般为w的一半,即2。

论文重点就这两个,其最终的结果是略次于two-stream的方法,比C3D强。

我的实验:

由于前两天刚完成VGG的two-stream Action recognition,因此直接使用VGG完成这篇论文的部分实验。仅仅做了如下改变

  1. 将optical flow换成motion vector。其中出了一个bug: motion vector有的视频的图片数量小于光流法,原因在于不是每一帧都包含motion vector,有的帧提取不出运动向量,即I-frame,因此可能出现丢帧的情况。在本例中,我发现有的视频最后一帧和最后一帧无法提取出运动向量。因此少这两帧。如果是中间帧缺失,程序会讲上一帧的图像复制到当前帧。因此:将训练文件中的图片个数进行修改,修改到与Motion vector一致。
  2. 换pretrain model,换成optical-CNN训练完成的model。
  3. 换学习率,增大学习率,与论文中一致,不过发现迭代次数不需要太多,stepvalue大概一万就可以,下降三次即可收敛完毕。
    补充:我的测试是在python下进行的,因此速度测试存在一个问题,这个问题是矩阵赋值的速度极大的影响了整个网络的运行速度。比如图片的crop一定会用矩阵赋值,经过测试,crop图片中心进行测试,caffe模型的运行时间是0.1s,而crop赋值达到0.06s。而作者是matlab,因此矩阵赋值的速度远远大于没有用mkl优化的numpy赋值。速度测试一直耽搁着,等解决了会再更新。

实验结果:temporal的Training Acc:64.6%,测试Acc:79.78%。加入spatial net(与上一篇博客的model一样)后的ACC:84.985%。

反思:最终的结果不能令人满意,我的temporal Accuracy超过论文中的79.3%,而最终的combination Acc:86.6%。超过我大概有1.6%。我的网络比他深,始终想不出有什么原因会导致结合准确率低于他。等以后有思路了,一定会更新。

你可能感兴趣的:(深度学习,行为识别)