SepConv视频插帧-通过自适应可分离卷积进行视频插帧
一.简介
标准的视频插帧方法首先估计两帧之间的光流,然后在运动的指导下生成中间帧,就是不是端到端的方法,而作者提出的方法是end-to-end的。而且光流的方法对遮挡,模糊,亮度突变情况处理的并不好。所以最近的方法(其实就是本篇论文作者自己提出的方法AdaConv-之后会在下一篇文章介绍)用空间自适应卷积核估计中间帧,但是这种方法需要比较大的核,因为要处理幅度比较大的运动,而且要为每个像素生成一个卷积核,因此计算量是十分的大的。那么本文提出了自适应可分离的卷积,大大减小了运算量,用一对1D卷积核替代原先的2D卷积核。大大减小了参数量,由 n 2 n^2 n2减小到 2 n 2n 2n,并且加入了感知损失(perceptual loss)。
二.网络结构
下图即为本文的网络结构,是一个encoder-decoder的结构。(图与代码并不是完全一样,建议看一下源代码)
github链接:https://github.com/sniklaus/sepconv-slomo
对网络结构简单做一个介绍,前面是encoder的结构,之后经过decoder并通过skip connection链接,提取较为丰富的语义信息。之后通过四个子网络得到两对儿插帧要用的卷积核。原先的单像素生成公式为:
I
^
(
x
,
y
)
=
K
1
(
x
,
y
)
∗
P
1
(
x
,
y
)
+
K
2
(
x
,
y
)
∗
P
2
(
x
,
y
)
\hat I(x,y)=K_1(x,y)*P_1(x,y)+K_2(x,y)*P_2(x,y)
I^(x,y)=K1(x,y)∗P1(x,y)+K2(x,y)∗P2(x,y)
关于P1,P2只是在原始帧上采的一小块区域(要生成的像素点(x,y)位于中间位置)。作者使用两个1D卷积核近似2D的卷积核,关于此处的参数问题,最好参考源代码,也就是由5151640384变成2151384640最好对照代码进行理解。每个151对应一个像素点。
三.损失函数
作者采用两个损失函数结合,L1 loss和perceptual loss:
L
1
=
∥
I
^
−
I
g
t
∥
1
L_1=\| \hat I-I_{gt} \|_1
L1=∥I^−Igt∥1
L
F
=
∥
ϕ
(
I
^
)
−
ϕ
(
I
g
t
)
∥
2
2
L_F=\| \phi(\hat I)-\phi(I_{gt}) \|_2^2
LF=∥ϕ(I^)−ϕ(Igt)∥22
ϕ
\phi
ϕ也就是从图像中提取的特征
四.实验细节补充
为了加速,作者稍微修改了一下CUDA的代码,感兴趣的小伙伴可以了解一下CUDA编程。
关于边界问题,作者尝试了zero padding,reflective padding,repetition padding,最后发现repetition padding效果比较好。
超参数的选择,大多是根据实验结果进行选择。
五.结果对比以及不足
)
可以看到作者的结果还是不错的,之后作者做了定量评价:
在对视频进行处理的时候,运动的物体旁边还是会有鬼影出现,不过对比之前的已经很好了。
还有就是池化层太多有更大的感受野是没错,就是可能会丢失更多的语义信息,可以考虑采用下今年的soft pooling。
之后我将会讲一下本文的代码以及之前的文章。
注意:跑代码过程中要用到moviepy库,可以参考https://zhuanlan.zhihu.com/p/161530919