针对视频识别的通用Once-For-All框架

 https://arxiv.org/abs/2303.14817

相比于传统视频识别对不同帧数输入的分别训练,我们提供了一种解决方案:在单次训练的情况下,使模型能够在推理的时候根据输入帧数的变化动态调节计算量并表现出更高的准确率,同时显著地减少保存多个模型的参数量。我们提供了一个支持2D, 3D, Transformer网络的视频识别代码库,里面也包含了我们的预训练模型,欢迎大家交流和试用。

■ https://github.com/BeSpontaneous/FFN-pytorch

TL, DR:

◆ 动机:视频识别通常会采样多帧图像来代表整个视频。现有的视频识别算法总是对具有不同帧数的输入分别进行训练,这需要重复的训练操作和成倍的存储成本。

◆ 观察:如果我们在模型推理的时候使用训练未用到的帧数,模型性能则会显著下降(见下图),这被总结为时域频率偏移现象。

FFN-pytorch_卷积

图1 时域频率偏移现象

◆ 解决:我们提出了一个通用的框架,名为Frame Flexible Network(FFN),它不仅可以使模型根据输入帧数的不同从而动态地调节计算量,还可以显著减少存储多个模型的内存成本。

◆ 优点:(1)一次性训练(2)明显的性能增益(3)参数量的显著节省(4)计算量的动态调整(5)强大的兼容性。

▌Introduction

越来越多的在线视频推动了视频识别研究的发展。与图像相关的任务不同,我们需要采样多帧的图像来表示整个视频,并且计算成本将与采样的帧数成比例增长。具体而言,现有方法将相同的网络对不同帧的输入分别进行训练,以获得具有不同性能和计算量的多个模型。这给将这些网络应用于边缘设备带来了挑战,因为如果我们存储所有模型,参数将会成倍的增加。

将模型在高帧数进行训练,然后直接在较少帧数的输入上进行推理以调整计算量是一种简单而直接的解决方案。为测试其有效性,我们将其与Separated Training(ST)进行了比较,并从图1中发现推理结果与ST之间存在明显的性能差距,这意味着如果将训练中未曾使用的帧数用于推理,这些方法将表现出明显劣于ST的性能。进一步地,我们在不同深度的深度网络上进行了相同的实验,出现了类似的现象。我们将这种普遍存在的现象称为时域频率偏移。

FFN-pytorch_时域_02

图2 Nearby Alleviation

为进一步验证时域频率偏移,我们分别在8帧和12帧的输入上训练了两个TSM[1]模型,然后将其在4/8/12/16帧分别进行推理测试。由图2可以看到,推理结果与ST的差异大小会因为帧数不同而有所不同,如果推理帧数接近于训练帧数,性能差距会更小,我们将这个现象称之为Nearby Alleviation。

FFN-pytorch_人工智能_03

图3 Normalization Shifting

由于Batch Normalization(BN)会在神经网络的各个层统计feature map的固有属性,如均值,方差,我们分别统计了在4帧和16帧输入上训练的两个TSM模型各个层的feature map的均值和方差。通过图3可知,4帧和16帧输入所对应的feature map的统计值存在一定的差异,也就意味着模型在推理的时候使用其他帧数的输入会导致Normalization Shifting,这是我们认为造成时域频率偏移现象的主要原因。

FFN-pytorch_卷积_04

图4 Frame Flexible Network

▌Method

基于上述观察,我们提出了一个解决时域频率偏移现象的通用框架——Frame Flexible Network(FFN),如图4所示。由于我们的目的是让网络能够在任意帧数推理的时候表现出与Separated Training(ST)相似或者更好的性能,所以我们在训练的时候引入多个视频序列(对同一个视频采样不同帧数得到)并建立对应的子网络,然后在模型推理的时候根据输入帧数的大小来激活对应的子网络,防止Normalization Shifting的产生。

虽然这是一个比较直观的解决方案,但是具体实施上还存在多个问题:

(1) 如何构建子网络?

Slimmable Neural Network[2]曾给出过一种思路,即调整网络的宽度来分配计算资源,同理我们也可以给不同宽度的子网络分配帧数不同的视频序列。这种方法对于卷积结构的网络实现较为容易,但要拓展到Transformer架构的网络可能仍需进一步的适配。考虑到方法的兼容性和拓展性,最后我们没有采用这个方案。另一个直观的思路是直接将原来的网络进行复制来构建子网络,这样可以保证模型的性能与ST相当,但是参数量相比ST保存多个模型并没有减少,也就失去了Once-For-All的意义。

FFN-pytorch_人工智能_05

图5 Specific Design

对于任意视频识别网络,我们可以将其拆分为两部分,一部分是用于空间-时序建模的模块,这包括卷积,多头自注意力,多层感知机等,这部分模块占据了网络99%以上的参数;剩下的部分就是各种Normalization的操作,包括BN,LN等等,而这部分的参数量通常小于1%。由之前的分析可知,Normalization Shifting是导致时域频率偏移的主要原因,因此我们可以共享空间-时序建模模块的参数,而对每个子网络分配不同的Normalization操作,这样就可以在解决时域频率偏移问题的同时,维持总网络的参数量跟原来单个网络相当。相比于ST分别训练和保存多个模型,我们也就实现了参数的显著减少。

(2) 如何保证各个子网络的表达能力?

由于我们共享了空间-时序建模模块的参数,随之而来的问题就是如何保证这部分共享参数的表达能力,即在不同帧数输入的情况下均维持良好的性能。受之前自监督训练在视频识别上应用[3][4]的启发,我们认为,一个好的视频表征应该是对帧数变化无关的(Temporal Frequency Invariant),因此我们希望模型能够学到与帧数变化无关的表达(Temporal Frequency Invariant Representation)。如果从自监督的角度来理解,视频的采样过程可以被看作是一种在时序上的随机掩码(数据增强),采样的帧数越多,掩码越少,得到的视频序列越近于视频本身,性能也就越好;而基于对比学习的自监督的一个核心部分就是让模型学习关于各种变换(数据增强)的不变表达(Invariant Representation),即拉近正样本之间的距离,所以我们认为共享参数不仅不会限制模型的表达能力,反而会让其表现出优于ST的性能。

FFN-pytorch_人工智能_06

为了进一步增强模型的表达能力,我们提出了Weight Alteration——一个简单的深度可分离卷积层,并将其插入到各个子网络的不同stage当中,这样我们就可以通过一个简单的线性变换使得各个子网络拥有一套属于自己的独特参数。值得注意的是,视频识别经常会用到预训练模型,为了避免新加入的卷积层破坏原有的计算图,我们引入了residual[5]的结构并将卷积层的初始参数设置为较小值。

(3) 如何保证训练中未出现帧数的推理性能?

通过上述的一系列设计,我们基本可以保证模型在L, M和H三个帧数输入的推理性能,但是要如何保证训练中未出现帧数的推理性能仍是一个问题。由Nearby Alleviation可知,如果推理帧数接近于训练帧数,两者的性能差距会比较小,所以我们大概认为在L, M和H周边的输入也能维持较好的性能。基于上述考虑,我们提出了Inference at Any Frame的策略,即给定推理的帧数n,我们会比较n与L, M, H的距离,并选择与其距离最小的子网络进行激活,来得到对应的输出。

▌Experiment

FFN-pytorch_人工智能_07

表1 与baseline方法的比较

由表1可知,Mixed Sampling和Proportional Sampling可以在一定程度上缓解时域频率偏移现象,但是同时在16帧推理的准确率也会有一定的损失。Fine-tuning可以让模型在4帧推理时表现出比ST更好的性能,但是在其他帧的准确率会明显下降。Ensemble在8帧推理时有较高的准确率,但代价是三倍的参数量和计算量。相比于上述方法,FFN在任意帧的推理准确率都明显高于ST,并且参数量也是明显少于ST,这让FFN在边缘设备上的部署充满优势。

此外,我们还验证了FFN在不同架构(2D/3D/Transformer),数据集(Sth-Sth V2/Kinetics400/HMDB51)下的泛化能力,结果如图6,图7所示,可以看到FFN具有良好的泛化性和扩展性,并且能够在性能很好的基准模型Uniformer[7]上面仍取得非常显著的提升。

FFN-pytorch_人工智能_08

图6 在不同架构上的验证 

FFN-pytorch_人工智能_09

图7 在不同数据集上的验证 

为了验证Inference at Any Frame的策略,我们将FFN在2-20帧的所有偶数帧进行了推理评估,对于4-16帧内部的结果,我们称之为Inbound Results,因为训练所用到的最低帧是4帧,最高帧是16帧;而2/18/20帧的结果则称之为Outbound Results。由图8可知,FFN能够在所有帧的推理结果上全面超越ST,ST需要重复10次训练过程得到10个训练模型,而我们只需训练一次,得到模型的参数量与ST单次训练得到的模型参数量相当。

FFN-pytorch_人工智能_10

图8 Inference At Any Frame 

最后是消融实验,我们分别对文章中的一系列设计进行了消融分析。比较有意思的一点是,当我们不进行参数共享,而对每个子网络分配其独有的参数时,模型的性能相较于共享参数会有显著的下降,同时也带来了成倍的参数量。这一点其实在之前的章节已经提到,独享的参数会让各个子网络的性能上限接近于ST,而参数共享可以让模型学习到与帧数变化无关的表达(Temporal Frequency Invariant Representation),从而表现出比ST更优的性能。

FFN-pytorch_卷积_11

表2 消融实验 

▌Conclusion

这个工作首先切实地解决了视频识别领域中的一个实际问题,对于模型在边缘设备的部署会有比较大的帮助;其次整体的设计比较简洁,FFN也具有较好的泛化性和拓展性。

最后欢迎大家follow我们的工作,我们提供了一个支持2D, 3D, Transformer网络的视频识别代码库,目前FFN支持TSM/TEA/SlowFast/Uniformer,欢迎大家来contribute~

@article{zhang2023frame, title={Frame Flexible Network}, author={Zhang, Yitian and Bai, Yue and Liu, Chang and Wang, Huan and Li, Sheng and Fu, Yun}, journal={arXiv preprint arXiv:2303.14817}, year={2023}
  • 1.