Video Frame Interpolation via Adaptive Convolution

title

这是CVPR17的文章,使用KPN来做视频插帧的。

算法思想

KPN

文章的算法思想也是比较直接地使用KPN,如下图:

1

对于输出的(x,y)(x,y)坐标位置,取输入两帧以(x,y)(x,y)为中心的大patch R1和R2,用它们作为输入得到一个kernel,然后用这个kernel和以(x,y)(x,y)为中心的两个小patch P1和P2进行卷积,得到输出帧的(x,y)(x,y)位置的结果。因此,网络的思想也是每个pixel都要生成一个kernel,但是就结构而言,和之前的burst denoising以及realSR有不同的地方:

burst denoising用一个encoder-decoder的结构,使得输出的feature map大小和输入的是一样的,实现了per-pixel的kernel prediction,而realSR用的是一个shuffle downsample + shuffle upsample的方式,也使得输出的feature map和输入的大小一样,这篇文章用的是一个纯downscaling的网络,对一个6×79×796\times79\times79的输入,输出是一个41×82×1×141\times 82\times 1\times1的kernel,因此对一张h×wh\times w的输入图像,pixel-wise的实现需要将网络前向传播h×wh\times w次,这无疑是非常耗费时间的。

Shift-and-stitch

鉴于上述区别,文章提出使用shift-and-stitch方法来实现,shift-and-stitch源自于semantic segmentation,由于CNN网络的下采样,使得网络的输出是coarse的,无法实现输入N×NN\times N,输出也是N×NN\times N,想要得到pixel level的结果的话,其中一个方法就是shift-and-stitch。

假设降采样因子为ss,那么将input map进行平移,偏移量为(x,y)(x,y),其中x,y{0,1,...,s1}x,y \in \{0,1,...,s-1\},这样就可以得到s2s^2个input,通过前向传播,得到s2s^2个output,再经过类似于sub-pixel convolution的交织过程,就可以获得结果了。

文章这里的做法也是这样,因为downsample了三次,每次都是以2为倍数,所以对输入图像shift 64次,经过64次的前向传播,得到每个位置上的kernel,进而进行卷积。至于位置和shift的offset的关系,这个就不再细述,关于shift-and-stitch以及相关的方法,可以参考Shift and stitch理解

Loss function

loss函数是intensity loss和gradient loss的加权,gradient loss的设计是先对输入两帧算gradient,然后与计算出来的kernel进行卷积,与GT的gradient计算loss,这是因为kernel K是用于一个输出pixel的,所以无法用来post地计算梯度。

小结

  1. 文章的优点很明显了,在optical flow之类的matching算法的痛点(occlusion, motion blur和lack of texture)上进行研究,提出使用KPN来对matching和pixel synthesis一起操作,同时使用shift-and-stitch的方式,不像之前的网络那样使用类似于AE的方式,可以减小测试端各个level的feature map,至于运算效率如何,没有实验就不太清楚了。
  2. 文章也有一些问题,第一个就是设定的41×4141\times 41大小的kernel导致网络只能处理41个pixel以内的motion,超过这个大小的motion就会出现blur的情况,这和17年ICCV的EPICNN一样,需要一个参数来控制motion的最大值,这无疑为网络的泛化增加了很大的限制。一种解决方案是使用multi-scale的方式,类似于光流估计里用的那样,另外其他的更加elegant的方式还有待发掘(或者是我还没读到)。
  3. 这是一个pixel by pixel设计的网络,loss function也是per-pixel计算的,每一次前传都只出来一个预测的pixel,使得网络比较难添加全图或者patch-wise的loss,例如一些perceptual的loss。但没有办法做全图的原因也很明显,因为要handle比较大的motion,必须要比较大的kernel,不像burst denoising和realSR一样不需要那么大的kernel,大的kernel如果再乘以全图的分辨率,需要预测的kernel的输出就会超级大,因此才想出这么个办法。
文章目录
  1. 1. 算法思想
    1. 1.1. KPN
    2. 1.2. Shift-and-stitch
    3. 1.3. Loss function
  2. 2. 小结
|