精读《MoViNets: Mobile Video Networks for Efficient Video Recognition》论文

在这里插入图片描述
论文名:MoViNets: Mobile Video Networks for Efficient Video Recognition
论文链接:论文链接
代码链接:Pytorch代码链接

1 背景说明

和上一篇TSM论文的背景其实都是差不多的,略过。
点击:上一篇TSM论文精读超链接

2 之前方法存在的问题

  • 3DCNN在视频识别方面很精确,但需要大量的计算和内存预算,而且不支持在线推理,这使得它们很难在移动设备上工作。(其实在TSM论文中就已经提出了在线进行视频识别了。)

3 文章要解决的核心问题

在视频理解上实现高精度和低计算成本,并支持在线推理。

4 文章的贡献

  • 他们首先定义了一个MoViNet搜索空间,让神经结构搜索(NAS)有效地权衡时空特征表示。
  • 然后,他们为MoViNets引入流缓冲区,它能处理小的连续子视频,只需要恒定的内存,但不牺牲长时间依赖性,并支持在线推理。
  • 最后,他们创建流的时间集成器MoViNets,从流缓冲区中恢复稍微丢失的准确性。

5 结论

  • MoViNets 提供了一套高效的模型,可以很好地迁移到不同的视频识别数据集。
  • 加上流缓冲区,MoViNets 显著降低了训练和推理的内存成本,同时还支持流视频的在线推理。

6 Mobile Video Networks (MoViNets)

6.1 Searching for MoViNet

在这里插入图片描述

表1:MoViNet的搜索空间

MoViNet搜索空间。
他们在Kinetics 600数据集上进行网络结构搜索,且模型是以TuNAS框架开始的(由于现在重点不是NAS,所以在这里也不过多展开)。他们在MobileNetV3上建立基本搜索空间。MobileNetV3由几个反向 bottleneck 层块组成,每个层具有不同的 filter 宽度bottleneck 宽度block的深度kernel sizes。并且,跟X3D差不多,他们把MobileNetV3中的2D block进行拓展(变成2.5D和3D),用于处理3D视频输入。他们把输入固定为 T × S 2 = 50 × 22 4 2 T \times S^2 = 50 \times 224^2 T×S2=50×2242,其中 T T T代表着时间维度、 S S S代表着空间维度。对于网络中的每个block,他们搜索基本过滤器宽度 c b a s e c^{base} cbase和block里面的层数 L ≤ 10 L \leq 10 L10。***他们使用乘数{0.75, 1,1.25}在每个block内的特征映射通道上,四舍五入到8的倍数。***他们设置block的数量 n = 5 ,除了第4个block外(为了确保最后一个block的空间分辨率为 7 2 7^2 72),对每个块的第一层进行空间下采样,下采样为2。block逐渐增加它们的特征通道:{16,24,48,96,96,192}。最后一个的卷积层的基本滤波器宽度是512,在分类层前面,跟随一个2048维度的dense层。

他们在每个层内定义3D卷积核大小, k t i m e × ( k s p a c e ) 2 k^{time} \times (k^{space})^2 ktime×(kspace)2,会从后面这些预定义的卷积核大小中选:{1x3x3, 1x5x5, 1x7x7, 5x1x1,7x1x1, 3x3x3, 5x3x3}。这些选择能够让关注和聚合不同的维度表示,在减少其他维度上的计算量的同时,在最相关的方向上拓展了网络的感受野。一些核大小可能得益于拥有不同数量的输入filters,因此我们在瓶颈宽度范围内搜索 c e x p a n d c^{expand} cexpand,定义为相对于 c b a s e c^{base} cbase的乘子{1.5,2.0,2.5,3.0,3.5,4.0}。每一层都用两个1x1x1的卷积包围3D卷积在 c b a s e c^{base} cbase c e x p a n d c^{expand} cexpand之间进行扩展和投影,且在这个过程中不采用下采样。他们使用SE blocks 聚合时空特征,并将其应用于每个瓶颈block中。

缩放搜索空间。
他们的基本搜索空间构成了MoViNet-A2的基础。对于其他MoViNet,他们应用了与EfficientNet中相似的缩放。不一样的是,他们是缩放了搜索空间而不是模型。

6.2 The Stream Buffer with Causal Operations

假设我们有一个有T帧的输入视频x,如果T过大会导致超过设定的内存预算。因此6.2节的内容是提出了一个流缓存,减少了这个内存消耗。
在这里插入图片描述

图1:常见的多片段评估VS流评估
常见的一种的减少内存消耗的办法是把一整段视频分成多个子片段,把各个子片段输入到网络中得到预测结果再进行平均得到结果,如**图1**的左边所示。然而,它有两个主要的缺点:1)它将时间感受野限制在每个子片段上,忽略了长时间的依赖关系,会降低准确性;2)对某些帧重复计算,降低效率。

流缓冲区。
为了克服上述限制,他们提出流缓冲机制,将特征激活缓存在子片段边界上,允许他们跨子片段扩展时间接受域,并且不需要重新计算,如图1的右边所示。首先将一段视频分成n段不相交的视频,每个视频长度为 T c l i p T^{clip} Tclip。然后初始化长度为b的缓冲区B(其实理论上来说,要初始化数量和层数一样深的缓冲区),并且这个B在其他维度的是和特征保持一致的(比如长和宽)。然后按照下面的公式来计算特征和更新B:
在这里插入图片描述
在这里插入图片描述
这里的 i i i指的是第 i i i段子视频。公式1中,当 i = 0 i=0 i=0时,也就是意味着是第1段子视频,这个时候B是为0的,可以理解成 0 padding(但其实是和0进行concat),且都在同一边进行concat。然后这时候是每一层都这么干,都和0进行concat。然后再根据公式2,取最边边的b帧特征,所以从 i = 1 i=1 i=1开始,B就再也不等于0了,而是来自于上一段子视频的特征。所以这个时候时间复杂度是 O ( b + T c l i p ) O(b+T^{clip}) O(b+Tclip)

与TSM的关系。
文章中说TSM是特殊的一种流缓存,这个时候b=1。但其实我个人理解起来还是有点差异,因为在这篇论文中,他是专门申请了一块内存,为上一段视频的特征而准备的,本来只是0。在接受了上一段视频的特征之后,才变得有意义。而本身的特征,除了长度为b那块边边的要送给下一段视频以外,其他的特征是不会变动的。而TSM中是将某个通道的特征按照时间维度全部移动了,所以差异还是不小的。

因果操作

这个操作其实指的就是把之前的时间特征concat到现在的时间特征上,来实现在线推理功能,对标TSM中的单向时间shift。此外,他们还提出一个非因果操作,即concat的方向有两个,对标TSM中的双向时间shift,就没了在线推理功能。

因果卷积(CausalConv)

他们用CausalConvs替换所有的时间卷积,有效地使它们沿时间维单向。
在这里插入图片描述

图2:标准卷积VS因果卷积

在这里插入图片描述
在这里插入图片描述

在图2中,可以看到,在标准卷积,在保证不降低维度的前提下,它会在两个方向同时做padding操作。但是这样的话,时间维度上的卷积的感受野会包含前后的时间信息。而在因果卷积中,我们是把时间的感受野限制在了前面(包括当今)的几帧,从而实现一个因果关系。而公式4和5就说明了,其实实现这个只是通过控制padding的方向就可以实现了。在层数变深之后,时间感受野就会一致扩大,直到感受野为(0,t]。(图2中,因果卷积那里维度增加了1维,按照文章后面所讲,这里应该是一个时间维度的累积和)

当使用因果卷积的流缓冲区时,我们可以用缓冲区本身替换因果填充,将前一个子视频的最后几帧向前移动,并将它们复制到下一个子视频的填充中。如果我们的时间核大小为k(并且我们不使用任何跨步采样),那么我们的填充和缓冲区宽度将变成b = k−1。

累积全局平均池化(CGAP)
在这里插入图片描述
他们使用CGAP来计算时间维度的全局平均池化,其计算过程如公式3所示。并且他们保留一个单帧流缓冲区,存储 T ′ T' T帧的累积和。

带有位置编码的CausalSE
他们表示CausalSE是作为CGAP在SE中的应用。将第 t 帧处,将的空间特征图与CGAP(x, t)计算的SE相乘。这个可以和SE类比来理解,SE是先通过池化,消掉空间维度,剩下特征通道维度,然后再与原特征点乘,增强某些通道的作用。而这里的CausalSE,是消掉时间维度,剩下空间、特征通道维度,然后再点乘,增强某些空间/特征通道的作用。也就是说,CausalSE的作用是先考虑了(0,t]之间重要的空间和特征通道,然后再在各个时间上增强这些空间和特征通道。但是直接应用这个CausalSE的话,效果不是很好,文中说的原因是视频早期存在高的方差(不知道是不是说的浅层特征)。为了解决这个问题,他们应用了一种基于正弦的固定位置编码(POSENC)方案。我们直接使用帧索引作为位置,并将编码向量与CGAP输出相加。

流缓冲器的训练和推理

训练
为了减少训练期间的内存需求,我们使用了一种循环训练策略,其中我们将给定的一个batch的样本分成n个子视频,应用前向传递,为每个子视频输出预测,使用流缓冲区缓存特征。然而,关于缓冲区,他们不反向传播梯度,因此之前的子视频的内存可以被释放。然而,他们会计算损失并在子剪辑之间积累计算的梯度,类似于批量梯度积累。当 T = n T c l i p T=nT^{clip} T=nTclip时,在应用梯度之前先来n次前向传播。这种训练策略允许网络学习更长期的依赖关系,从而获得比使用较短视频长度训练的模型更好的准确性。

在线推理
使用因果操作(如CausalConv和CausalSE)的一个主要好处是允许3D视频CNN在线工作。类似于训练,我们使用流缓冲区来缓存视频之间的特征。

6.3 Temporal Ensembles

在Kinetics 600数据集上,流缓冲器可以将MoViNet的内存占用减少到一个数量级,而在精度下降约1%。他们使用简单的集成策略来恢复精度。他们用相同的架构独立训练两个MoViNet,但是将帧率减半,保持持续时间相同(导致输入帧数减半),个人理解是即n不变, T c l i p T^{clip} Tclip减半。他们将一个视频输入到两个网络中,其中一个网络的帧偏移了一帧(即把一个 T c l i p T^{clip} Tclip变成了两个一半,这两个刚好相差一帧)。最后将两个帧率减半的模型集成起来,集成后两个模型的FLOPs加起来和之前单个没降帧率之前是差不多的,但是性能提高了。

实验

在本节中,他们在5(严格上算7)个数据集上(Kinetics 400、Kinetics 600、Kinetics 700、Moments in Time、Charades、Something-Something V2和Epic Kitchens 100)评估了MoViNets的推理时的准确性、效率和内存消耗。

没有特殊情况的话(除非推理的帧数很好),一般用64帧来训练。随着模型越来越大,缩放系数增加了输入分辨率、帧数、深度和网络的特征宽度。

Single-Clip vs. Multi-Clip 评估
在这里插入图片描述

图3:不同方法的正确率、FLOPs和内存使用情况对比

Single-Clip指的是从输入视频中采样的固定时间步幅;Multi-Clip指的是从输入视频中采样完和Single-Clip一样长度是视频,按照时间延后循环多次。所以两者使用相同的帧数,其FLOPs是相同的。然而,Single-Clip求解会极大地增加网络的峰值内存使用(这个应该是类似于在线推理和离线推理的区别,在线推理可以捕获到多少帧就可以处理多少帧,但是离线推理要等捕获完整个完整的视频,才能进行推理。)流缓冲区消除了这个问题,允许MoViNet像嵌入完整视频一样进行预测,并且比Multi-Clip评估产生更少的峰值内存(应该是因为有一些特征是来源于上一个clip的计算结果)。

在Kinetics 600数据集上的结果

在这里插入图片描述

表2:Kinetics 600数据集上不同方法的结果(没有流缓存区的MoViNets)

其实从表2就能看出MoViNet的网络结构效果就已经很好了。

在这里插入图片描述

表3:Kinetics 600数据集上MoViNets的消融实验
表3只要是探究了流缓存区和集成的效果,所以流缓存区的主要贡献是在保持精度下降不厉害的情况下,让内存使用降下来。集成的作用是将一个模型拆成两个模型,然后集成之后的效果恢复回来。

在这里插入图片描述

图4:MoViNets的流缓存区对内存使用的影响
在图4的右上,注意的是这里用的X3D不是10-clip版本,也就是说这里的X3D属于离线推理的那种,而MoViNet-base也是属于离线推理的那种,因此随着输入帧变多,内存使用峰值也会增加。而带流缓存区的,其实都属于在线推理的那种,这也就是为啥这里的曲线会差别这么大。

其他数据集上的结果

在这里插入图片描述

图5:MoViNets在其他数据上的FLOPs和精度对比

额外的分析

MoViNet 的操作

在这里插入图片描述

表4:MoViNets不同配置的消融实验
注意,表4的消融实验是在MoViNets-base上来做的。这个表格说明了,其实论文中提出的很多操作在没有流缓冲区的情况下效果其实也不太好。

硬件指标

在这里插入图片描述

图6:MoViNets在CPU上的测试

在这里插入图片描述

表5:MoViNets在V100上的测试
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值