行为识别SlowFast
一、基本思想
- 动作在变,环境不变
- 如何获取动作信息、以及环境信息
- 他们两个如何融合
如下图,环境没变,但是这些人的动作或多或少的发生了改变。其中动作的信息比较重要,是这个任务的目的,但是环境信息就不重要吗?当然不是,我们需要获取环境的信息。
获取环境的信息或许比较简单,对于一张静止的图像,可以提供一些环境的特征。对于视频,拿出其中一两帧,进行卷积计算,以拿到图像的信息。
对于动作的信息,我们将视频分为几个序列(如,第5帧-第10帧,第10帧-第15帧),基于这个序列,提取以下这个人在做什么。对于序列进行卷积,利用的是3D卷积。
主要贡献:
- 一个通用的行为识别框架(facebook),自己的项目轻松套用
- 对比试验很丰富,网络结构设计及其预训练模型提供
- 思想比较直接,高频与低频特征通吃,直接融合特征进行预测
- 源码资源丰富,可直接当作模板使用
二、网络结构
2.1 网络主干
以下就是核心的网络结构。
观察下图,红色框圈出的就是环境提取,因为环境信息的提取,不需要很多图像,只需要几张典型的某些帧即可。由于只有很少的静止图像,后续的网络需要更复杂一点(卷积核小一点,特征图多一点),虽然这样计算量较大,但是提取了更好的特征。
下面蓝色是提取动作信息,需要连续的序列,再进行这个连续序列的特征提取的时候,若做3D卷积,面对如此庞大的输入数据,速度会很慢,所以,3D卷积设计的要比较简单一些,让特征图少一些,窗口大小也小一点。可以看到有和
(都是0.25或0.125)。保证环境提取和动作提取可以同时或时间相仿的完成,再进行融合。
继续观察,特征融合的箭头都是由动作的部分指向环境的部分,即动作往环境中融合,论文中指出,无论是动作往环境中融合,还是环境往动作中融合,都没有关系,都是可以的。但是显然环境的特征信息和动作的特征信息大小并不一致(差了ɑ和β倍,论文中提供了三种方法融合,在后续的2.3解释)。可以看出融合了多次,用最后融合的特征进行预测,
即:
- 分别获取高频和低频的图像数据
- 分别进行特征提取
- 特征融合
- 预测
2.2 网络细节
首先换取图像片段,这里是64*224^2(64帧,224^2是长宽都是224)。
然后是data layer视频数据采样,利用不同的stride值,获取不同帧的数据(主要H和W必须相同)。可以看出,Slow pathway(环境)的stride是16,即每隔16帧获取一个静态图像,Fast pathway(动作)的stride是2,即每隔2帧获取一个静态图像,所以output sizes是Slow:4*224^2;Fast:32*224^2。
data layer之后其实就是ResNet,进行特征提取。对于Slow(环境),3D卷积是1*7^2,64,第一个1就是时间维度,但是它只是1,数值很小,因为在环境提取的时候,时间信息并不重要。而在Fast(动作)是5*7^2,8这里时间维度是5,这里就能体现出时间信息了,stride是1,即每次取5帧,以提取动作信息。这是环境slow与动作fast最大的区别,而第二个区别就是输出特征图个数,slow是64,而fast是8,这原因在2.1中提到过。然后他们的stride是一样的1,2^2,步长为1,进行下采样。最终输出即就是Slow:4*112^2;Fast:32*112^2。
接下来是池化层,过程类似。在下面是Resnet层,可以发现,前两次resnet的slow的时间维度是1,但是后面是3,貌似这里的环境slow看重了时间信息,论文作者没有过多的解释,作者只是发现或许在深层时,加上图片与图片之间的关系,可能会把特征做的更好,但是没有解释原因。fast一开始就加上时间信息。
2.3 特征融合
对于 slow: fast:
三种融合方案:
- Time-to-channel:将fast的数据进行reshape,改为
,是前俩维度一样,再进行融合,这也是最常见的方法。
- Time-strided sampling:将fast的输出进行采样,得到与之相同的帧数个数,即将fast改为
,从而进行融合。
- Time-strided convolution:做一个3D卷积,让stride=α,将fast改为
这三种方法,第三种好一点,因为多做了一次卷积,即多了一次特征提取,第二种会丢失信息,而第一种,在很多情况也会使用,但是进行reshape,不知道将特征安排为多少合适,而交给卷积,让网络怎么合适怎么来,论文中也是第三种。