3D 卷积神经网络 视频动作识别

时间:2024-05-22 17:10:16

转自:http://blog.****.net/AUTO1993/article/details/70948249

https://zhuanlan.zhihu.com/p/25912625

http://blog.****.net/zouxy09/article/details/9002508


3D CNN框架结构各层详细计算过程

这篇博客主要详细介绍3D CNN框架结构的计算过程,我们都知道3D CNN 在视频分类,动作识别等领域发挥着巨大的优势,前两个星期看了这篇文章:3D Convolutional Neural Networks for Human Action Recognition,打算用这个框架应用于动态表情识别,当时对这篇文章的3 D CNN各层maps的计算不怎么清楚,所以自己另外对3D CNN结构层数maps等等重新计算了一下,下面是主要的计算过程。在介绍计算过程之前,先介绍一下 2D CNN和3D CNN的区别

采用2D CNN对视频进行操作的方式,一般都是对视频的每一帧图像分别利用CNN来进行识别,这种方式的识别没有考虑到时间维度的帧间运动信息。下面是传统的2DCNN对图像进行采用2D卷积核进行卷积操作:

3D 卷积神经网络 视频动作识别

使用3D CNN能更好的捕获视频中的时间和空间的特征信息,以下是3D CNN对图像序列(视频)采用3D卷积核进行卷积操作:
3D 卷积神经网络 视频动作识别

上面进行卷积操作的时间维度为3,即对连续的三帧图像进行卷积操作,上面的  3D卷积是通过堆叠多个连续的帧组成一个立方体,然后在立方体中运用3D卷积核。在这个结构中,卷积层中每一个特征map都会与上一层中多个邻近的连续帧相连,因此捕捉运动信息。例如上面左图,一个卷积map的某一位置的值是通过卷积上一层的三个连续的帧的同一个位置的局部感受野得到的。

需要注意的是:3D卷积核只能从cube中提取一种类型的特征,因为在整个cube中卷积核的权值都是一样的,也就是共享权值,都是同一个卷积核(图中同一个颜色的连接线表示相同的权值)。我们可以采用多种卷积核,以提取多种特征。

3D CNN架构

3D 卷积神经网络 视频动作识别

输入层(input):连续的大小为60*40的视频帧图像作为输入。.

硬线层(hardwiredH1):每帧提取5个通道信息(灰度gray,横坐标梯度(gradient-x),纵坐标梯度(gradient-y),x光流(optflow-x),y光流(optflow-y))。前面三个通道的信息可以直接对每帧分别操作获取,后面的光流(x,y)则需要利用两帧的信息才能提取,因此

H1层的特征maps数量:(7+7+7+6+6=33),特征maps的大小依然是60* 40;

卷积层(convolution C2以硬线层的输出作为该层的输入,对输入5个通道信息分别使用大小为7* 7 * 3的3D卷积核进行卷积操作(7*  7表示空间维度,3表示时间维度,也就是每次操作3帧图像),同时,为了增加特征maps的个数,在这一层采用了两种不同的3D卷积核,因此C2层的特征maps数量为:

(((7-3)+1)*  3+((6-3)+1)*  2)*  2=23*  2

这里右乘的2表示两种卷积核。

特征maps的大小为:((60-7)+1)*  ((40-7)+1)=54 * 34

降采样层(sub-sampling S3):在该层采用max pooling操作,降采样之后的特征maps数量保持不变,因此S3层的特征maps数量为:23 *2

特征maps的大小为:((54 / 2) *  (34 /2)=27  *17

卷积层(convolution C4对两组特征maps分别采用7 6 3的卷积核进行操作,同样为了增加特征maps的数量,文中采用了三种不同的卷积核分别对两组特征map进行卷积操作。这里的特征maps的数量计算有点复杂,请仔细看清楚了

我们知道,从输入的7帧图像获得了5个通道的信息,因此结合总图S3的上面一组特征maps的数量为((7-3)+1) * 3+((6-3)+1) * 2=23,可以获得各个通道在S3层的数量分布:

前面的乘3表示gray通道maps数量= gradient-x通道maps数量= gradient-y通道maps数量=(7-3)+1)=5;

后面的乘2表示optflow-x通道maps数量=optflow-y通道maps数量=(6-3)+1=4;

假设对总图S3的上面一组特征maps采用一种7 6 3的3D卷积核进行卷积就可以获得:

((5-3)+1)* 3+((4-3)+1)* 2=9+4=13;

三种不同的3D卷积核就可获得13* 3个特征maps,同理对总图S3的下面一组特征maps采用三种不同的卷积核进行卷积操作也可以获得13*3个特征maps,

因此C4层的特征maps数量:13* 3* 2=13* 6

C4层的特征maps的大小为:((27-7)+1)* ((17-6)+1)=21*12

降采样层(sub-sampling S5):对每个特征maps采用3 3的核进行降采样操作,此时每个maps的大小:7* 4

在这个阶段,每个通道的特征maps已经很小,通道maps数量分布情况如下:

gray通道maps数量= gradient-x通道maps数量= gradient-y通道maps数量=3

optflow-x通道maps数量=optflow-y通道maps数量=2

卷积层(convolution C6此时对每个特征maps采用7* 4的2D卷积核进行卷积操作,此时每个特征maps的大小为:1*1,至于数量为128是咋来的,就不咋清楚了,估计是经验值。

对于CNNs,有一个通用的设计规则就是:在后面的层(离输出层近的)特征map的个数应该增加,这样就可以从低级的特征maps组合产生更多类型的特征。

通过多层的卷积和降采样,每连续7帧图像就可以获得128维的特征向量。输出层的单元数与视频动作数是相同的,输出层的每个单元与这128维的特征向量采用全连接。在后面一般采用线性分类器对128维的特征向量进行分类,实现行为识别,3DCNN模型中所有可训练的参数都是随机初始化的,然后通过在线BP算法进行训练。

下面是3DCNN各通道数量变化情况以及特征maps大小变化情况

3D 卷积神经网络 视频动作识别


本文为极市平台原创编译,首发于C3D network: 用于视频特征提取的3维卷积网络

卷积神经网络(CNN)近年被广泛应用于计算机视觉中,包括分类、检测、分割等任务。这些任务一般都是针对图像进行的,使用的是二维卷积(即卷积核的维度为二维)。而对于基于视频分析的问题,2D convolution不能很好得捕获时序上的信息。因此3D convolution就被提出来了。3D convolution 最早应该是在[1]中被提出并用于行为识别的,本篇文章则主要介绍下面这篇文章 C3D[2],C3D network是作为一个通用的网络提出的,文章中将其用于行为识别,场景识别,视频相似度分析等领域。

可以访问C3D network的项目主页(C3D: Generic Features for Video Analysis)或是github(facebook/C3D)获得其项目代码及模型,项目基于caffe实现。最近作者还更新了残差网络结构的新C3D模型,但是还没有放出对应的论文,暂时不做讨论。

2D 与 3D 卷积操作

3D 卷积神经网络 视频动作识别

首先简要介绍一下2D与3D卷积之间的区别。a)和b)分别为2D卷积用于单通道图像和多通道图像的情况(此处多通道图像可以指同一张图片的3个颜色通道,也指多张堆叠在一起的图片,即一小段视频),对于一个滤波器,输出为一张二维的特征图,多通道的信息被完全压缩了。而c)中的3D卷积的输出仍然为3D的特征图。

现在考虑一个视频段输入,其大小为 $clhw$ ,其中c为图像通道(一般为3),l为视频序列的长度,h和w分别为视频的宽与高。进行一次kernel size为$333$,stride为1,padding=True,滤波器个数为K的3D 卷积后,输出的大小为$Klhw$。池化同理。

3D 卷积核参数的选择

3D 卷积神经网络 视频动作识别

作者还对卷积核的尺寸进行了实验研究,结果表面$333$大小的卷积核效果最好。

C3D network 结构

3D 卷积神经网络 视频动作识别

基于3D卷积操作,作者设计了如上图所示的C3D network结构。共有8次卷积操作,4次池化操作。其中卷积核的大小均为$333$,步长为$111$。池化核的大小为$222$,步长为$222$,但第一层池化除外,其大小和步长均为$1*22$。这是为了不过早缩减时序上的长度。最终网络在经过两次全连接层和softmax层后就得到了最终的输出结果。网络的输入尺寸为$316112112$,即一次输入16帧图像。

实验结果


接下来介绍一下C3D的实验结果,作者将C3D在行为识别、动作相似度标注、场景与物体识别这三个方向的数据库上进行了测试,均取得了不错的效果。注意以下结果均为当时情况下的比较(2015年),从那时候到现在这些数据库不知道又被刷了多少遍了。

  • 行为识别-Action Recognition

行为识别用的数据库是UCF101,C3D+SVM的结果达到了85.2%。UCF101这个数据库目前为止(2017年3月)看到最高的结果已经达到了96%左右。

3D 卷积神经网络 视频动作识别
  • 动作相似度标注-Action Similarity Labeling

动作相似度标注问题的任务是判断给出的两段视频是否属于相同的动作。文章中使用的数据库为ASLAN。C3D的效果超过了当时的state of the art 不少。

3D 卷积神经网络 视频动作识别
  • 场景识别-Scene Recognition

场景识别问题主要使用了Maryland和YUPENN,也都达到了不错的效果。

3D 卷积神经网络 视频动作识别
  • 运行时间分析

下表中是C3D与其他一些算法的速度比较。其中iDT是行为识别领域的非深度学习方法中效果最好的方法,可以见我之前的博文iDT算法介绍(行为识别笔记:improved dense trajectories算法(iDT算法))。Brox指Brox提出的光流计算方法[3].

3D 卷积神经网络 视频动作识别

这几部分我都跑过相关的实验,其中光流计算(GPU版本)现在的速度可以达到20-25fps,我使用的光流计算代码的github地址为feichtenhofer/gpu_flow。表中C3D的速度应该是在视频帧无重叠的情况下获得的。将一段16帧的视频作为一个输入,则C3D一秒可以处理约42个输入(显卡为1080, batch size选为50),换算成无重叠情况下的fps为672。可见C3D的速度还是非常快的。

总结

C3D使用3D CNN构造了一个效果不错的网络结构,对于基于视频的问题均可以用来提取特征。可以将其全连接层去掉,将前面的卷积层放入自己的模型中,就像使用预训练好的VGG模型一样。

参考文献

[1] Ji S, Xu W, Yang M, et al. 3D convolutional neural networks for human action recognition[J]. IEEE transactions on pattern analysis and machine intelligence, 2013, 35(1): 221-231.

[2] Tran D, Bourdev L, Fergus R, et al. Learning spatiotemporal features with 3d convolutional networks[C]//Proceedings of the IEEE International Conference on Computer Vision. 2015: 4489-4497.

[3] Brox T, Malik J. Large displacement optical flow: descriptor matching in variational motion estimation[J]. IEEE transactions on pattern analysis and machine intelligence, 2011, 33(3): 500-513.

欢迎关注微信公众号极市平台(微信id:extrememart)获取更多计算机视觉行业内的资讯及信息。

PS.目前极市拥有上千名视觉算法开发者,分别来自腾讯,华为,百度,网易,联想,努比亚等名企,以及北大,清华,北航,中科院,交大等名校,更邀请了李开复老师入驻微信群,欢迎从业者加入极市专业CV开发者微信群(分享干货资讯,行业内人交流),请填写极市算法开发者调研问卷申请入群~