标签:array 一个 基于 out 通过 并且 rcp 算法 双向
论文阅读——Super SloMo: High Quality Estimation of Multiple Intermediate Frames for Video Interpolation
原文地址:https://openaccess.thecvf.com/content_cvpr_2018/html/Jiang_Super_SloMo_High_CVPR_2018_paper.html
关键词:AI视频补帧,任意帧生成,U-net
本文提出了一种可以在输入的两帧之间插入任意数量中间帧的的模型框架。这种方法可以将30帧的手持手机视频拉长到任意帧率(比如240帧,即任意两帧之间插入7帧),以至于达到“慢动作”的效果。
目前大多数工作都只能在两帧之间插入一帧,想要通过循环调用插入单帧的算法也可以插入多帧,但是一来无法并行运算,严重影响效率,因为插入的帧需要的其他帧可能并不一定能获得,比如30-240的转换中,想要获取帧2,则需要帧0和帧4的内容,而帧4则需要帧0和帧8的计算;其二,这中方法只能应用二分的方法获取中间帧,因此只能获取\(2^{i-1}\)的插值结果(1,3,7)。
本文提出的方法模型如下所示:
其实本质是两个U-net, 第一个U-net用于计算两个输入帧之间的光流,第二个U-net计算任意时间步的插值帧。具体的计算步骤如下:
为了获取输入的两帧\(I_0\)和\(I_1\)之间的中间帧\(\hat{I}_t\), 其中\(t\)代表时间步. 我们可以依靠\(T=t\)时和\(T=0\)和\(T=1\)时的光流信息近似的获取中间帧. 公式可以表示为:
其中\(F_{t \rightarrow 0}\)和\(F_{t \rightarrow 1}\)代表中间帧\(\hat{I}_t\)到两个输入帧的光流, \(g()\)是个backward warping 函数, 获取方法是双线性插值. \(\alpha_0\)就是个参数, 表示两个光流的贡献, \(T=t\)越接近\(0\), \(\alpha_0\)越大反之亦然. 为了解决遮挡问题, 比如一个人的胳膊在运动中会遮挡背景, 作者提出了一个软可见图\(V_{t \leftarrow 1}\)和\(V_{t \leftarrow 0}\)分别代表了\(T=t\)时到\(T=0\)和\(T=1\)时这个像素点是否可见, \(V_{t \leftarrow 1} = 0\)代表这个像素点完全不可见. 取值范围\([0,1]\), 并且是soft的, 以此解决遮挡.
公式表示为:
其中\(Z=(1-t) V_{t \rightarrow 0}+t V_{t \rightarrow 1}\)是个归一化参数.
大致的计算流程为上述公式所示,但是有个问题出来了:
我们无法准确的获得中间帧\(\hat{I}_t\)和\(I_0\)和\(I_1\)之间的光流, 所以作者提出了一种估计光流的方法.具体的做法为根据输入的两帧\(I_0\)和\(I_1\)之间的光流\(F_{1 \rightarrow 0}\)和\(F_{0 \rightarrow 1}\)和时间\(t\)进行估计. 公式如下:
具体到模型中, 作者首先使用一个光流计算CNN计算输入的两帧之间的光流, 根据公式我们可以获得估计得到的\(\hat{F}_{t \rightarrow 0}\)和\(\hat{F}_{t \rightarrow 1}\), 以及基于两个估计光流获取的估计图像\(g()\), 作者将他们合并输入到插值U-net中, 目的是微调光流信息, 并最终获取预测的中间帧.
代码细节的笔记: 来自 https://zhuanlan.zhihu.com/p/79719747
模型一:flow computation flowComp:UNet(6, 4) 输入两幅图像,所以是6个通道,输出两个光流,所以是4个通道(光流分为x方向和y方向)。
模型二:arbitrary-time flow interpolation ArbTimeFlowIntrp:UNet(20, 5) 输入两幅图像(6)、两幅光流(4)、两个g(10),输出两个光流差(4)和1个遮挡判断(1)
模型三:trainFlowBackWarp:backWarp(352, 352)
模型四:validationFlowBackWarp:backWarp(640, 352)Loss:L1_lossFn 、 MSE_LossFn
optimizer = optim.Adam
scheduler = MultiStepLRvgg16_conv_4_3 禁用梯度
validate过程
取三帧,把前后两帧送入flowComp,得到双向光流。
然后用这两个光流来近似计算中间帧的双向光流 \(F_{t_0}\)、\(F_{t_1}\)
然后用backWarp来warp出中间图像 \(g\left(I_{0}, F_{t \rightarrow 0}\right)= I_0 + F_{t \rightarrow 0}\) \(g\left(I_{1}, F_{t \rightarrow 1}\right)= I_1 + F_{t \rightarrow 1}\)
然后把一堆东西输入 ArbTimeFlowIntrp( \(I_0\)(3) + \(I_1\)(3) + \(F_{0\rightarrow1}\)(2) +\(F_{1\rightarrow0}\)(2) + \(F_{t\rightarrow1}\)(2) + \(F_{t\rightarrow0}\)(2) + \(g\left(I_{0}, F_{t \rightarrow 0}\right)\)(3) + \(g\left(I_{1}, F_{t \rightarrow 1}\right)\)(3) = 20 )
输出 intrpOut( Δ\(F_{t \rightarrow 0}\)(2) + Δ\(F_{t \rightarrow 1}\)(2) + \(V_{t \leftarrow 0}\)(1) = 5 )
由网络输出的光流Δ量来计算 F_t_0_f = ΔF_t_0_f + F_t_0 F_t_1_f = ΔF_t_1_f + F_t_1
然后用这两个光流来warp出中间图像 g_I0_F_t_0_f = I0 + F_t_0_f g_I1_F_t_1_f = I1 + F_t_1_f
然后用这两个中间图像和遮挡变量V来算出 Ft_p计算Loss: recnLoss: 由Ft_p和IFrame(中间帧)计算L1重建损失、prcpLoss: 用vgg16来提取特征,再用MSE来计算两个图像的语义差、warpLoss: g_I0_F_t_0和IFrame的L1损失+g_I1_F_t_1和IFrame的重建损失+由I0和F_1_0 warp出的图像和I1的L1损失 + 由I1和F_0_1 warp出的图像和I0的L1损失
然后smooth一下loss,再计算出来加起来就好了训练过程
过程和validate一样
论文阅读——Super SloMo: High Quality Estimation of Multiple Intermediate Frames for Video Interpolation
标签:array 一个 基于 out 通过 并且 rcp 算法 双向
原文地址:https://www.cnblogs.com/Xuang/p/13555355.html