SkipConvolution
论文名称:Skip-Convolutions for Efficient Video Processing
作者:Amirhossein Habibian, Davide Abati, Taco S. Cohen, Babak Ehteshami Bejnordi
Code:尚未开源
摘要
提出了 Skip-Convlutions 来利用视频流中的大量冗余并节省计算,每个视频都被表示为帧间和网络激活的一系列变化,表示为残差的形式。
为了实现在残差帧上高效地计算,重新构造了标准卷积:
- 每一层都与一个二进制门相结合,决定残差对模型预测是否重要;
- 这些门既可以与卷积核联合训练,也可以根据残差的重要程度(magnitude)跳过残差;
- 门控功能还可以结合块稀疏结构(block-wise sparsity structures),这是在硬件平台上高效实施所必需的。
通过将 EfficientDet 和 HRNet 中的所有卷积替换为 skip-convolution,在两个任务上将计算成本降低了 3 到 4 倍,并且没有任何精度下降。
介绍
视频是一系列静止图像还是一系列连续的变化?
我们通过感知变化来观察世界,并在神经元中累积的差异超过某个阈值时处理信息,这一特性启发了许多神经形态传感器和处理算法,比如基于事件的摄像机(event-based cameras)和脉冲神经网络(spiking neural networks)。
尽管脉冲神经网络在视频处理方面很高效,但其缺乏有效的训练算法,因此并没有像传统算法那样成功。
使用残差帧来表示视频也十分常见,比如在视频压缩编解码器中,这是因为残差帧通常拥有较小的信息熵,因此需要压缩的比特数小。
相关工作
Efficient video models
利用时间冗余是开发高效视频模型的关键,常见的策略是特征传播(feature propagation),它只对关键帧计算主干特征,后续帧直接适应关键帧的主干特征,或者在通过光流、动态滤波器或自注意力的空间对齐之后适应关键帧的特征。
同样地,Skip-Conv 也会传播来自前一帧的特征,然而:
- 特征传播模型取决于对齐步骤,这可能很昂贵,例如用于精确的光流提取;
- 这些方法仅在单个层传播特征,而 Skip-Conv 在每个层传播特征;
- Skip-Conv 有选择地决定是在像素级传播还是计算,而不是整个帧;
- Skip Conv 不需要对原始网络作任何修改。
另一种策略是在连续帧之间穿插交错的深浅骨干(deep and shallow backbone),将在关键帧上提取的深层特征和其他帧上提取的浅层特征进行融合,使用 concatenation、循环神经网络或者是更复杂的动态核蒸馏,这种策略通常会导致关键帧和其他帧之间的精度差距。
另一些工作旨在通过开发更快的 3D 卷积替代方案来实现高效地视频分类,比如 temporal shift modules、2+1D convolutions、神经网络架构搜索或者自适应帧采样。
这些方法主要适用于全局预测任务(可能是指视频分类这种任务),而 Skip-Conv 的目标是流处理任务,例如姿态估计和目标检测,其中每个帧都需要空间密集的预测。
Efficient image models
减少参数冗余(例如通道和 层中的参数冗余)是获得高效图像模型的一个基本方面,模型压缩方法,例如低秩张量分解、剪枝、神经网络架构搜索和知识蒸馏等,可以有效地减少任意网络的内存占用和计算成本,Skip-Conv 没有像模型压缩那样利用权重冗余,而是利用激活中的时间冗余。实验证明,这些是互补的,可以结合起来进一步降低计算成本。
条件计算(Conditional computation)最近在开发高效的图像模型方面显示出巨大的潜力,它使模型能够动态调整每个输入的计算图,以跳过处理不必要的分支、层、通道或非重要的空间位置。然而,在图像中很难区分重要区域和非重要区域。Skip-Conv 利用残差帧作为一个强先验,根据它们的变化来识别特征图中的重要区域,通过实验验证,其性能大大优于对应的图像。
Skip Convolutions
Convolution on Residual Frames
对于一个标准的卷积层,有卷积核 和输入 ,其输出可以定义为:
表示卷积操作, 表示某一时刻的的特征图
众所周知,卷积是一个线性函数,因此我们可以将输出写为:
即表示残差帧,对于第一帧来说 。
由于视频中连续帧多是高度相关的,因此残差帧通常是稀疏的,如下图所示:

这种稀疏性可以有效地提高网络效率,对于残差帧中 0 值的部分,其经过卷积的输出依然是 0,因此可以直接跳过(skip)。
注意到上图有许多很细小的非 0 区域(可能是摄像时的光影变化等),这些细小的噪声一定程度上会阻止 skip-conv 跳过,为了解决这个问题,为每一层 skip-conv 都引入了一个 门控函数