视频插帧之RIFE
前言
论文地址:RIFE:Real-Time Intermediate Flow Estimation for Video Frame Interpolation
项目主页: https://zhuanlan.zhihu.com/p/568553080
github代码:Pytorch版本
RIFE
RIFE有两个重要组成部分:
- 使用IFNet进行有效的中间流估算。
- 使用FusionNet对warp后的帧进行融合处理。
RIFE网络总体结构
RIFE的总体框架如下图所示,其主要由IFNet、Backward Warp以及Fusion Process三个模块组成,其中RIFE的核心功能是由IFNet与Fusion实现的,因此后文我会着重介绍这两部分内容。
RIFE的大致流程是先给定两张连续的帧,和取值范围为0到1的步长t,根据步长t来确定合成的中间帧的数量。IFNet先是直接对输入帧估计中间流信息,然后假设为线性运动从而估计,公式如下∶
$$
F_{t\rightarrow 1}=-\frac{1-t}{t}F_{t\rightarrow 0}
$$
这就是IFNet光流估计与传统的利用双向光流进行中间流估计最大的区别。IFNet只进行了一次光流估计,处理起来十分迅速,而传统的双向光流估计则需要估计两次,处理起来就会很级慢。在完成光流估计后,接下来就需要warp连续两帧得到中间帧。为了估算中间流$F_{t\rightarrow0}$,$F_{t\rightarrow1}$和融合图M,需要将输入帧和通道t输入IFNet。然后根据下面的公式重建目标帧:
$$
\hat{I}{t} = M \odot \hat{I}{t \leftarrow 0 } +(1-M)\odot \hat{I}{t \leftarrow 1 }
$$
$$
\hat{I}{t \leftarrow 0 } = W(I_{0},F_{t\rightarrow 0} ),\hat{I}{t \leftarrow 1 } = W(I{1},F_{t\rightarrow 1} )
$$
其中W是图像向后warp, $\odot$ 是逐元素乘法符号,(0≤M≤1)。RIFE使用了另一个编解码CNN网络RefineNet改善高频区域和减少学生模型的失真。这种方法类似Super Slomo,DAIN等视频插帧方案,这里的FusionNet包含一个上下文特征提取模块和融合模块(U-Net结构),上下文特征提取模块和融合模块的编码部分具有相似的结构,即包含4个stride=2的ResBlock;融合模块的解码模块包含4个反卷积进行特征分辨率上采样。最后,对融合结果进行范围约束。
中间流估计以及中间帧重建
传统的中间流估算方法由两步组成:
- 估算双向光流
- 光流逆转
但这种方法在运动边界可能出错。因此RIFE提出了一种直接估计中间流的方法,IFNET,如下图所示:
流逆转过程通常很麻烦,因为处理物体位置的改变很困难。IFNet可以直接估算中间光流。直观的说,以前的流逆转方法希望在光流场上做空间插值,这并不比对RGB图像做空间插帧简单。
而IFNet可以直接高效的预测$F_{t\rightarrow 0}$ ,$F_{t\rightarrow 1}$和融合图M,当t =0,或t =1时, IFNet就是一个经典的双向光流模型。
为了处理大运动场景,RIFE使用了由粗到精逐步增加分辨率的策略,如下图所示。具体的说,我们首先在低分辨率下计算一个比较粗的流预贬结果,这使得更容易捕捉大运动,然后逐步增加分辨率来迭代求精流场(flowfiled)。
IFNet的这种光流估计方式可以描述如下:
$$
(F,M)^{i} = (F,M)^{i-1} + g^{i}(F^{i-1},M^{i-1},I^{i-1})
$$
$(F,M)^{i-1}$ 表示从第$(i-1)$个IFBlock得到的当前中间流估算和融合图,$g^{i}$ 表示第i个IFBlock。一共使用了3个IFBlock,每个IFBlock具有一个分辨率参数K,K =(4,2,1),以及上采样操作、6个ResBlock以及一个上采样模块。在推理时,最终的估算结果是(F, M )2。为了设计的简洁,每个IFBlock是由几个卷积层和一个上采样操作组成的前馈(feedforward)结构。除了输出光流残差和融合图的层,都采用了PReLU激活函数。
在得到$F_{t\rightarrow 0}$ , $F_{t\rightarrow 1}$ 后,我们就可以通过BackwardWarp得到重建结果$I_{0\rightarrow t}$,$I_{1\rightarrow t}$。
IFNET的特权蒸馏
直接逼近中间流是很难的,因为拿不到中间帧,同时缺少监督。为了解决这个问题,RIFE为IFNET设计了特权蒸馏损失(privileged distillation loss)。在训练阶段,通过$I_{0}$,$I_{1}$连续时刻的两帧,以及一个额外的时序t作为输入,送入学生模型中,输出为t一>0和t->1时刻的估计光流$F_{t\rightarrow 0}$,$F_{t\rightarrow 1}$,以及用于融合的掩模M。同时, $I_{0},I_{1},t,T^{GT}_t$ 监督。具体流程如下图所示:
…………待补充 知识蒸馏方法还要去学怎么用