这篇文章不再是只针对Single-Image做超分,而是主要为了提升视频的分辨率;本文由Twitter推出了一种称之为VESPCN的网络结构,主要利用运动估计模块和时序空间模块来对连续帧输入做超分。VESPCN是第二代ESPCN,解决了ESPCN无法利用视频具有高度时间冗余的特点,因此VESPCN将ESPCN升级成Spatial-Temporal-sub-pixel卷积网络,并结合运动补偿完成视频超分任务,此外VESPCN在single-Image上可以减少一定程度的资源消耗。
参考目录:
①深度学习端到端超分辨率方法发展历程
②Pytorch代码-VESPCN
③论文笔记 |《Real-Time Video Super-Resolution with Spatio-Temporal Networks and Motion Compensation》
④(VESPCN)Real-Time Video Super-Resolution with Spatio-Temporal Networks and Motion Compensation
⑤[video super resolution] ESPCN论文笔记
⑥3D卷积(动图)
Real-Time Video Super-Resolution with Spatio-Temporal Networks and Motion Compensation
Abstract
①:VESPCN是ESPCN的升级版本,ESPCN在视频超分上只是单纯地处理每一帧图像,将每一帧图像看成是独立的个体,因此其没有很好地利用视频中帧与帧之间高度的时间冗余关系,因此为了利用起视频的这个天然优势, 作者将时间冗余信息加入到ESPCN中,并结合运动补偿模块来形成VESPCN——一个主要应用于视频超分的算法。
②:具体来说,如下图所示:
- VESPCN主要由Spatio-Temporal网络和Motion-Estimation网络组成。Spatio-Temporal网络是以ESPCN为基础的SR网络,其主要利用亚像素卷积层来进行上采样,此外该模块需要结合early fusion、slow fusion或者3D卷积来将时间信息加入进来。
- 运动补偿模块以STN网络为基础,预测出前后帧的像素值,由于STN网络本身就是可导的,因此整个运动补偿+时序空间网络的训练是一个端对端的训练。VESPCN中整个运动补偿网络在VSR中本质就是个时间对齐网络,其基于Flow-based方法,属于Image-wise。
③:VESPCN通过利用了视频的时序冗余特性,在视频超分上取得了不错的重建表现力,同时可以到到real-time
的效果;不仅如此,VESPCN还可以应用于Single-Image
。
④:VESPCN在当时公开的数据集上取得了SOAT的表现,证明了时序空间网络和运动补偿网络的结合对于视频超分有着重要的意义。
1 Introduction
- SISR只对单张图像做处理,其一般包括特征提取、上采样、重建等过程,核心是利用了单张图像内部的空间冗余来弥补 L R LR LR图像相对 H R HR HR图像丢失的一些细节。
- 而视频超分需要同时利用空间冗余和时间冗余,通过引入时间信息(一般是相邻帧上的时间关系)来实现 L R → S R LR\to SR LR→SR。
1.1 Related work
略。
1.2 Motivation and contributions
如上图所示是VESPCN的整体网络结构,从中我们可以知道以下几个方面:
- VESPCN由运动补偿网络和时序空间网络组成,是一个端对端的网络框架。其中运动补偿网络基于STN网络,而时序空间网络是结合了ESPCN的亚像素卷积层(上图绿色箭头的过程)以及诸如
early fusion
、slow fusion
、3D卷积
等将时间信息和图像特征信息一起融合进行训练的Spatio-Temporal网络——利用了视频中高度的时间冗余特点,也正是因为有了这三种特征融合方式,才使得我们从SISR到视频超分的转变。 - VESPCN的输入是相邻帧,输出一般是当前时间步对应的高分辨率图像。
- VESPCN结构清晰,从左到右分别是相邻3帧连续视频、运动补偿网络、时序空间网络、亚像素卷积网络(也可以放到时序空间网络内部一起统称spatio-temporal network)
2 Methods
2.1 Sub-pixel convolution SR
超分的目标就是将
L
R
LR
LR图像
I
L
R
I^{LR}
ILR重建成
H
R
HR
HR图像
I
S
R
I^{SR}
ISR,表达式为:
I
S
R
=
f
(
I
L
R
;
θ
)
(1)
I^{SR} = f(I^{LR};\theta)\tag{1}
ISR=f(ILR;θ)(1)其中
θ
\theta
θ是SR模型的参数,
f
(
⋅
)
f(\cdot)
f(⋅)表示
S
R
→
H
R
SR\to HR
SR→HR的映射关系。
我们假设网络共有
L
L
L层,则每一层
l
∈
[
0
,
L
−
1
]
l\in[0,L-1]
l∈[0,L−1]都可以看成是在做特征提取:
f
l
(
I
L
R
;
θ
l
)
=
ϕ
l
(
W
l
∗
f
l
−
1
(
I
L
R
;
θ
l
−
1
)
+
b
l
)
,
∀
l
.
(2)
f_l(I^{LR};\theta_l) = \phi_l(W_l*f_{l-1}(I^{LR};\theta_{l-1})+b_l),\forall l.\tag{2}
fl(ILR;θl)=ϕl(Wl∗fl−1(ILR;θl−1)+bl),∀l.(2)
网络参数的学习是Loss函数优化的结果:
θ
∗
=
arg min
θ
∣
∣
I
H
R
−
f
(
I
L
R
;
θ
)
∣
∣
2
2
.
(3)
\theta^* = \argmin_\theta ||I^{HR}-f(I^{LR};\theta)||^2_2.\tag{3}
θ∗=θargmin∣∣IHR−f(ILR;θ)∣∣22.(3)
在这一节中,我们用 n l − 1 × n l × k l × k l n_{l-1}\times n_l\times k_l\times k_l nl−1×nl×kl×kl表示第 l l l层的滤波器参数,意味着第 l l l层有 n l n_l nl个卷积核,前一层有 n l − 1 n_{l-1} nl−1个滤波器,特别的 n 0 = 1 n_0 = 1 n0=1(即将通道 C C C维放到Batch里)。对于类似于SRCNN的超分结构,其直接对输入图像先做bicubic插值到 H R HR HR层级,其输出往往是一张feature map,即 n L − 1 = 1 n_{L-1}=1 nL−1=1,表示第 l l l层有 1 1 1个滤波器,输出1张特征图。而在ESPCN中指出了这种方法不仅消耗较多的计算资源而且会很慢,使得无法满足实时性的要求,故提出了亚像素卷积层,使得特征提取发生在 L R LR LR层级。亚像素卷积层会在第 L − 1 L-1 L−1层输出的 r 2 r^2 r2张feature map的基础上(即 n L − 1 = r 2 n_{L-1}=r^2 nL−1=r2)进行PixelShuffle,来达到 ( b a t c h , r 2 , H , W ) → ( b a t c h , 1 , r H , r W ) (batch, r^2, H, W)\to (batch, 1, rH, rW) (batch,r2,H,W)→(batch,1,rH,rW)的效果,从而完成上采样操作输出 r H × r W rH\times rW rH×rW格式的高分辨率图像。
- 关于亚像素卷积层,其来自于ESPCN这篇论文,关于这篇论文的解读可参考我的超分之ESPCN。此外PyTorch提供了相应的使用方法:
torch.nn.PixelShuffle(r)
,其中 r r r为SR缩放倍率,具体可参考我的另一篇PyTorch之PixelShuffle。
2.2 Spatio-temporal networks
作者在ESPCN文章末尾的展望中写道:ESPCN无法利用好视频中的时间信息,其只是机械的一帧一帧独立去处理,因此作者将会在ESPCN的基础上利用视频时间冗余的特点,即在原本图像二维的基础上新增时间维度,然后利用3D卷积去提取特征,这就是ESPCN的进化版本——Spatio-temporal network
,即时序空间网络。
图像层面的特征提取本质是利用了图像中的空间冗余性质,采用一个卷积核去逐步提取图像的特征信息;而对于视频来说,除了像素间的空间冗余特性,还有相邻帧之间的时间冗余特性。因此在时序空间网络中我们引入时间维度
D
l
D_l
Dl,其表示第
l
l
l层时间的深度,比如连续3帧进行合并之后,
D
l
=
3
D_l=3
Dl=3。在论文中,作者设置初始时间深度为
D
0
D_0
D0(奇数),表示输入端有
D
0
D_0
D0帧图像,故时序半径为
R
=
D
0
−
1
2
R=\frac{D_0-1}{2}
R=2D0−1,所以输入端的
L
R
LR
LR图像组可以表示为
I
[
t
−
R
,
t
+
R
]
L
R
∈
R
H
×
W
×
D
0
I^{LR}_{[t-R,t+R]}\in\mathbb{R}^{H\times W\times D_0}
I[t−R,t+R]LR∈RH×W×D0。
式(1)可更改为:
I
t
S
R
=
f
(
I
[
t
−
R
:
t
+
R
]
L
R
;
θ
)
.
I_t^{SR} = f(I^{LR}_{[t-R:t+R]};\theta).
ItSR=f(I[t−R:t+R]LR;θ).其中,第
l
l
l层滤波器参数
W
l
W_l
Wl的shape为
d
l
×
n
l
−
1
×
n
l
×
k
l
×
k
l
d_l\times n_{l-1}\times n_l\times k_l\times k_l
dl×nl−1×nl×kl×kl,其中
d
l
d_l
dl表示滤波器每次卷积的时间帧个数。
时序空间网络提取特征的方式主要有3种:
- Early fusion。
- Slow fusion。
- 3D convolutions。
接下来我们分别介绍下这3种方式。
Note:
- 在接下来的3种方式中,彩色图像表示feature map拥有时间维度,其具有多种时间信息的融合,而灰色图代表只具备一种时间信息(时间维度为1)或者忽略时间信息(具体见2.2节图)。
- 为了方便介绍,我将原论文种2.2.2和2.2.3顺序颠倒了一下。
- Large-scale Video Classification with Convolutional Neural Networks这篇文章介绍了Late fusion、Early fusion、Slow fusion三种融合方式的对比,有兴趣的可以看看,不看也不影响本文的理解。
2.2.1 Early fusion
Early fusion是最简单的一种时序融合方式,如上图所示,它只需要在卷积之前的输入层就直接concat不同时序的信息(这种就是通常的多通道卷积)或者说对各个时间帧做分组卷积,最后再concat起来(上图展示的就是这种方式,相比而言后者可节省更多的参数,但是可能会造成泛化能力的下降),图中
D
0
=
5
D_0 = 5
D0=5,表示输入是相邻的5帧图像。而之后就像对待普通图像一样去用conv2d去卷积它来提取特征即可,即
d
l
=
1
,
∀
l
≥
1
d_l=1,\forall l\ge 1
dl=1,∀l≥1。如上图所示,灰色图案代表时间深度
t
e
m
p
o
r
a
l
−
d
e
p
t
h
=
1
temporal-depth=1
temporal−depth=1。
Note:
- 为了减小网络参数,可以使用分组卷积,理论上分组卷积是普通卷积的参数的 1 G \frac{1}{G} G1,其中 G G G为分组个数。Pytorch分组卷积实现:
nn.Conv2d(in_channels*groups, out_channels*groups, kernel_size, groups=groups, stride=stride,
padding=(kernel_size // 2), bias=bias)
2.2.2 3D convolutions
3D卷积是Slow fusion的权重共享版本,3D卷积核它在时间维度上共享参数,因此这是一种省资源的做法。多通道卷积的滤波器只是在2D平面上左右上下移动,而3D卷积可以在2D平面以及时间轴上移动。3D卷积的对象是
C
×
T
×
H
×
W
C\times T\times H\times W
C×T×H×W,因此可以看成是
C
C
C个
T
×
H
×
W
T\times H\times W
T×H×W的立方体,对于每个立方体都用一个小立方体滤波器去抽取特征,并且共享同一组参数,不同通道才使用不同的滤波器参数,3D卷积只是其本身卷积核存在一个“深度”,其卷积核是个3D窗口,因此就会造成和多通道2D卷积因深度不同而产生不同参数相对应,从而就有了3D卷积权重共享这种说法。
Note:
- 3D卷积的PyTorch实现Conv3d:输入图像:
(
N
,
C
,
T
,
H
,
W
)
(N,C,T,H,W)
(N,C,T,H,W),3D卷积核参数:
(
C
,
o
u
t
_
c
h
a
n
n
e
l
s
,
F
D
,
F
H
,
F
W
)
(C,out\_channels, FD, FH, FW)
(C,out_channels,FD,FH,FW),其中
o
u
t
_
c
h
a
n
n
e
l
s
out\_channels
out_channels为输出通道数,
(
F
D
,
F
H
,
F
W
)
(FD,FH,FW)
(FD,FH,FW)为3D滤波器卷积核。例如
nn.Conv3d(3, 16, kernel_size=(3,3,3), stride=1, padding=1)
中的 W W W参数就是一个size为 ( 16 , 3 , 3 , 3 , 3 ) (16, 3, 3, 3, 3) (16,3,3,3,3)的张量,而 b b b参数就是一个 ( 16 , ) (16, ) (16,)的张量,从中可以看出3D卷积核需要 16 × 3 16\times 3 16×3个 3 × 3 × 3 3\times 3\times 3 3×3×3的卷积核。 - 不同的通道数相加是在卷积过程中,不同通道上进行不同参数的卷积的结果是相加产生的;而其右边的一对多则是对于同一个通道使用多个卷积核而产生多个通道的feature map的结果。
- 当3D卷积的 F D = T FD=T FD=T的时候,那么对于输入格式为 ( N , C , T , H , W ) (N,C,T,H,W) (N,C,T,H,W)的3D卷积就相当于对输入格式为 ( N , C ∗ T , H , W ) (N,C*T,H,W) (N,C∗T,H,W)的2D卷积,这在这篇文章Understanding Deformable Alignment in Video Super-Resolution中也得到了验证。
2.2.3 Slow fusion
Slow fusion是每次融合指定的帧数,如
d
l
=
2
,
d
l
∈
[
1
,
D
0
)
d_l=2,d_l\in [1,D_0)
dl=2,dl∈[1,D0),其表示第
l
l
l层需要融合2个时间帧并做特征提取。在论文中设置当
l
≤
3
l\leq 3
l≤3的时候
d
l
=
2
d_l=2
dl=2,否则
d
l
=
1
d_l=1
dl=1。Slow fusion是3D卷积的权值不共享版本,意味着时间深度的卷积使用不同参数的卷积核,而且每一次卷积融合的时间维度只能是
d
l
d_l
dl,除非时间维度缩小到了1。Slow fusion可以这么理解:每一次都对不同时间维度的feature map做分组卷积,分组个数
G
=
d
l
G=d_l
G=dl,然后进行concat融合起来;不同于Early fusion在
l
≥
1
l\ge1
l≥1的时候都忽略时间深度信息,而Slow fusion从头到尾一直保留着时间信息,并以
d
l
=
2
d_l=2
dl=2不断在时间深度上进行卷积直到时间深度为1为止,之后就像普通的conv2d卷积那样去提取特征就好了。
Note:
- Early fusion是Slow fusion的一种特例,即在第一层之后忽略时间信息。
- 当然,和Early fusion一样,Slow fusion也可以不用分组卷积,可以理解为先concat不同时间帧信息,然后进行多通道卷积;每次只合并 d l = 2 d_l=2 dl=2帧信息,并且不同帧的卷积参数是不共享的。
- 3D卷积是slow fusion的权重共享版本,他们的关系可以这样理解:第一次卷积的时候,3D卷积以 F D = d l = 2 FD=d_l=2 FD=dl=2在输入时间深度 T = 5 T=5 T=5上提取特征,每次时间窗口为2,以stride为1依次提取每相邻的两个时间帧,并且整个过程都是使用同一个三维卷积核;而slow fusion中,每次提取的也是时间窗口为 d l = 2 d_l=2 dl=2的特征,也是依次将相邻的两帧逐个提取,但是区别在于每次卷积不同的相邻2个时间帧都是使用不同的卷积核(这里是二维卷积核),具体图示如下:
2.3 Spatial transformer motion compensation
在已经有了3D卷积之后,为什么还需要运动补偿这个模块?
①其实只使用时序空间网络就可以将视频中的时间详细利用起来,从而可以运用到视频超分中去。而如果再加入本文提出的运动补偿模块,就可以进一步提升视频重建的质量,因此将运动补偿模块和SR网络(spatio-temporal network)结合起来比单独使用时序空间网络超分视频更好。
②通过基于光流的运动补偿可以作为对齐模块来使得支持帧的估计值靠近参考帧。而对齐之后的相邻帧输入给SR网络可以利用时间和空间相关性来提升网络性能。
接下来我们开始正式介绍基于STN的运动补偿网络结构,其本质就是用来做视频帧对齐的。
VESPCN的运动补偿是用Spatial transformer network
(以下简称STN)的时间版本(STN变体——TSTN)来做的,它的整体输入是视频中
D
0
D_0
D0帧连续图像,输出是一个经过多级(multi-scale)变换后的一帧图像,它将被输送给SR网络——spatio-temporal network中。
在VESPCN中,运动补偿网络输入端由连续3帧图像组成: I t − 1 L R 、 I t L R 、 I t + 1 L R I^{LR}_{t-1}、I^{LR}_{t}、I^{LR}_{t+1} It−1LR、ItLR、It+1LR。但为了接下来讨论方便,只分析连续2帧 I t L R 、 I t + 1 L R I^{LR}_{t}、I^{LR}_{t+1} ItLR、It+1LR下的运动补偿是如何进行的。至于 I t − 1 L R I_{t-1}^{LR} It−1LR,对于接下来的分析,只要将 I t + 1 L R I^{LR}_{t+1} It+1LR直接替换成 I t − 1 L R I_{t-1}^{LR} It−1LR就行了。
运动补偿是根据运动矢量和帧间信息,求得当前帧估计值的过程。我们的目标是根据
I
t
L
R
、
I
t
+
1
L
R
I^{LR}_{t}、I^{LR}_{t+1}
ItLR、It+1LR求得
I
t
+
1
L
R
I_{t+1}^{LR}
It+1LR估计值
I
t
+
1
′
L
R
I_{t+1}^{'LR}
It+1′LR。一般来说,
I
t
L
R
、
I
t
+
1
L
R
I^{LR}_{t}、I^{LR}_{t+1}
ItLR、It+1LR之间存在一个很小的变化,比如说是行人的位移变化
Δ
\Delta
Δ(这个变换我们一般称为运动估计,是为了求出帧间的运动矢量),那么STN就可以学习到这个变化,从而根据参考帧
I
t
L
R
I^{LR}_{t}
ItLR求出一个在
I
t
L
R
I^{LR}_{t}
ItLR基础上进行平移
Δ
\Delta
Δ之后的图像
I
t
+
1
′
L
R
I_{t+1}^{'LR}
It+1′LR,这就是
I
t
+
1
′
L
R
I_{t+1}^{'LR}
It+1′LR的估计值。这个求估计值的过程就是STN所做的事情。
Note:
- 具体如何求出估计值需要涉及到STN中
Localisation network
、parameterised Sampling Grid
以及Differentiable sampling
三个过程了,他们分别是为了求出变换矩阵、求出输出feature map在输入feature map上相对应的坐标、根据坐标以及输入feature map来通过重采样求出输出feature map。 - STN的baseline和本文中用到的STN略微有点不一样,但是核心思想还是一样的。在STN-baseline中,我们先学得一个变换矩阵,然后遍历输出网格点坐标一一映射到输入feature map上得到相应得亚像素坐标;最后通过双线性插值获得最终得输出图像。而在VESPCN中,我们是先学会两帧之间的运动估计,得到运动矢量 Δ \Delta Δ,然后 Δ \Delta Δ基于 I t L R I_{t}^{LR} ItLR的网格点坐标一一获得 I t + 1 L R I^{LR}_{t+1} It+1LR中的亚像素坐标,接下来根据亚像素坐标在 I t + 1 L R I_{t+1}^{LR} It+1LR上进行双线性插值获得输出图像 I t + 1 ′ L R I_{t+1}^{'LR} It+1′LR。总之,二者主要是两点的不同:①STN-baseline只根据单张feature map学得变换矩阵 θ \theta θ,而VESPCN是根据两张feature map学得运动矢量 Δ \Delta Δ;②STN-baselin的是用输出feature map产生的网格点对输入feature map做重采样获得输出feature map的,而VESPCN是用输入feature map产生的网格点对输入feature map I t + 1 L R I_{t+1}^{LR} It+1LR做重采样获得输出feature map的。接下来讲述的STN默认都指代VESPCN这种STN的变体。
- I L R I^{LR} ILR和 I ′ L R I^{'LR} I′LR是两张不同的图像,后者是前者的估计值, I L R I^{LR} ILR通过STN网络的处理产生了 I ′ L R I^{'LR} I′LR,两者几乎差不多,可能略微有点不同。
- 我们一般称 I t L R I_t^{LR} ItLR为参考帧, I t + 1 L R 、 I t − 1 L R I_{t+1}^{LR}、I_{t-1}^{LR} It+1LR、It−1LR为支持帧。
接下来我们根据STN来建模出VESPCN
中的运动补偿模型,它实际上就是个flow-based对齐模型:
设
Δ
t
+
1
\Delta_{t+1}
Δt+1表示目标输出feature map为
I
t
+
1
′
L
R
I_{t+1}^{'LR}
It+1′LR的时候,STN输出的运动(optical flow)估计矢量,或者说,
Δ
t
+
1
\Delta_{t+1}
Δt+1表示光流flow;
(
x
,
y
)
(x,y)
(x,y)为
I
t
L
R
I_{t}^{LR}
ItLR某一个格点坐标;
θ
Δ
,
t
+
1
\theta_{\Delta, t+1}
θΔ,t+1为STN模型参数。
在STN论文中,其作者采用了双线性插值作为最终STN中重采样的baseline,在本文中,作者也采样这种插值方法,我们设
I
{
⋅
}
\mathcal{I}\{\cdot\}
I{⋅}为bilinear interpolation,故重采样可表示为:
I
t
+
1
′
L
R
(
x
,
y
)
=
I
{
I
t
+
1
(
x
+
Δ
t
+
1
x
,
y
+
Δ
t
+
1
y
⏟
s
a
m
p
l
i
n
g
g
r
i
d
)
}
(1)
I_{t+1}^{'LR}(x,y) = \mathcal{I}\{I_{t+1}\underbrace{(x+\Delta_{t+1}x,y+\Delta_{t+1}y}_{sampling \;grid})\}\tag{1}
It+1′LR(x,y)=I{It+1samplinggrid
(x+Δt+1x,y+Δt+1y)}(1)
Note:
- 公式(1)中下括号部分可以看成是STN中的parameterised sampling grid环节,该环节是将 I t L R I_{t}^{LR} ItLR的坐标和运动矢量相结合得到,由于ESPCN只考虑平移变化,所以结合方式为简单相加减,故 ( x , y ) + Δ ( x , y ) (x,y) + \Delta(x,y) (x,y)+Δ(x,y)表示 I t + 1 L R I_{t+1}^{LR} It+1LR中的像素坐标(一般都是亚像素坐标)。
- 整个公式(1)表达的就是重采样。由于亚像素坐标无法读取
I
t
+
1
L
R
I_{t+1}^{LR}
It+1LR上相应的像素值,故需要用亚像素周围的整像素点进行插值求得,大致如下图所示:
对于
∀
(
x
,
y
)
∈
R
H
×
W
\forall (x,y)\in \mathcal{R}^{H\times W}
∀(x,y)∈RH×W,其中
H
,
W
H,W
H,W为
I
t
+
1
L
R
I_{t+1}^{LR}
It+1LR的高和宽,我们都使用重采样获取估计值
I
t
+
1
′
L
R
I_{t+1}^{'LR}
It+1′LR,这就是VESPCN的运动补偿模块,可以看出它就是将连续视频帧作为输入,用STN方法获取估计值的过程,运动补偿如下图所示:
如果上图是算运动补偿的1级结构,那么在论文中作者采用了2级运动补偿,其结构如下图所示:
①:Coarse/Fine flow estimation
就是个运动估计网络,用于产生运动矢量
Δ
\Delta
Δ的,他们两的区别在于:
- 网络参数不同,我们在STN-baseline网络使用的是简单的全连接网络用于表示仿射变换,那么在VESPCN中网络结构如下:
其中最后都接一层亚像素卷积层(PyTorch实现),注意这里和最后的亚像素卷积层不是同一个! - 在第一次估计之后,将估计值 I t + 1 ′ c I_{t+1}^{'c} It+1′c和 I t 、 I t + 1 I_t、I_{t+1} It、It+1再次输入到STN网络中进行二次估计,第二次估计会对第一次估计进一步校正,使得 I t + 1 I_{t+1} It+1和 I t + 1 ′ c I_{t+1}^{'c} It+1′c的差距进一步缩小,这个更精确的输出即为 I t + 1 ′ I_{t+1}^{'} It+1′,因此第二轮变换才叫Fine estimation(精确估计),而第一次相对不那么准确,所以叫coarse estimation(粗略估计)。
②:Warp
:STN-baseline的Differentiable sampling过程,是一个重采样过程,输出的就是
I
t
+
1
L
R
I_{t+1}^{LR}
It+1LR的估计值。2级结构的运动补偿最后的估计值输出为
I
t
+
1
′
=
I
{
I
t
+
1
(
Δ
t
+
1
c
+
Δ
t
+
1
f
)
}
I_{t+1}' = \mathcal{I}\{I_{t+1}(\Delta_{t+1}^c+\Delta_{t+1}^f)\}
It+1′=I{It+1(Δt+1c+Δt+1f)}。Wrap的源码如下:
def warp(self, img, flow):
# img:I_{t-1}或者I_{t+1}
# flow:运动估计模块的输出\Delta^c
# self.identity_flow:I_t的所有标准网格点->(1, H, W, 2)
img_compensated = F.grid_sample(img,
(-flow.permute(0, 2, 3, 1)+self.identity_flow).clamp(-1, 1), # 式(1)的sampling grid
mode='bilinear', # 双线性插值
padding_mode='border')
return img_compensated # 估计值I'_{t+1}
③:第一次变换使用early fusion
,其将相邻两帧在通道维进行concat,然后像普通卷积那样提取特征;第二次变换也是将5个数据在通道维进行concat,然后做卷积。
Note:
- 从上图中看出,整个运动补偿模块中,光流信息的顺序依次是 ( I t L R 、 I t + 1 L R ) → ( I t + 1 ′ c ) → ( I t + 1 ′ ) (I_{t}^{LR}、I_{t+1}^{LR})\to (I_{t+1}^{'c})\to ({I_{t+1}^{'}}) (ItLR、It+1LR)→(It+1′c)→(It+1′)。
- 第二轮估计的变换矩阵为 Δ f + Δ c \Delta^f + \Delta^c Δf+Δc。
- 运动估计网络最后使用tanh激活函数将变换矩阵的每个元素都限定在 [ − 1 , 1 ] [-1, 1] [−1,1]之间,这其实是为了避免变化过大导致误差不可控制,较小的变换可以通过增加迭代次数来让估计值不断缩小和原图的差距,这就有点像梯度下降中,在训练后期往往选用较小的学习率来控制更新步伐。
- 第二次运动补偿输入的特征信息更多,且运动矢量考虑了新旧两次运动矢量的信息,因此他会产生更加精确的估计值。
运动补偿模块的训练:
运动补偿模块的Loss函数:
θ
Δ
,
t
+
1
∗
=
arg max
θ
Δ
,
t
+
1
∣
∣
I
t
−
I
t
+
1
′
∣
∣
2
2
+
λ
H
(
∂
x
,
y
Δ
t
+
1
)
⏟
H
u
b
e
r
l
o
s
s
.
(2)
\theta^*_{\Delta,t+1} = \argmax_{\theta_{\Delta, t+1}}||I_t - I'_{t+1}||^2_2 + \lambda\underbrace{\mathcal{H}(\partial_{x,y}\Delta_{t+1})}_{Huber\;loss}.\tag{2}
θΔ,t+1∗=θΔ,t+1argmax∣∣It−It+1′∣∣22+λHuberloss
H(∂x,yΔt+1).(2)
Note:
- H ( ∂ x , y Δ ) = ϵ + ∑ i = x , y ( ∂ x Δ i 2 + ∂ y Δ i 2 ) \mathcal{H}(\partial_{x,y}{\Delta}) = \sqrt{\epsilon+\sum_{i=x,y}(\partial_x \Delta i^2 + \partial_y \Delta i^2)} H(∂x,yΔ)=ϵ+∑i=x,y(∂xΔi2+∂yΔi2),其中 ϵ = 0.01 \epsilon=0.01 ϵ=0.01。
- 后一项为Huber Loss,他是Smooth L1 Loss的扩展版本,有关两者的不同可参考Huber&Smooth-L1。
- 前一项表明我们优化的目的是为了让 I t + 1 ′ I'_{t+1} It+1′和 I t I_t It越相近越好,但是不是应该是让估计值 I t + 1 ′ I_{t+1}' It+1′和 I t + 1 I_{t+1} It+1越近越好吗?我觉得这样做是为了产生时间上更加连续的相邻帧,使得接下来输入进SR网络能产生更好的重建效果;因为首先 I t + 1 ′ I_{t+1}' It+1′一定是不可能达到和 I t I_t It完全一样的(nn的泛化性能+小批量随机梯度下降),而 I t + 1 ′ I'_{t+1} It+1′又是 I t I_t It后一帧 I t + 1 I_{t+1} It+1的估计值,所以不断迫使 I t I_t It和 I t + 1 ′ I_{t+1}' It+1′靠近,会产生使得 I t + 1 ′ I_{t+1}' It+1′在 I t I_t It和 I t + 1 I_{t+1} It+1之间的效果,故这样会使得帧与帧之间比原样本之间更加连续了。个人认为这也是之所以需要增加运动补偿模块的原因,也正是因为添加了这个模块,使得表现力会比单独一个spatio-temoral network重建的表现力更好!
VESPCN的运动补偿模块可以直接和后面的SR网络相连,并且STN和spatio-temporal network都是可以训练的,从而两者可相连形成一个端对端的网络。具体的训练Loss如下:
(
θ
,
θ
Δ
∗
)
=
arg min
θ
,
θ
Δ
∣
∣
I
t
H
R
−
f
(
I
t
−
1
:
t
+
1
′
L
R
;
θ
)
∣
∣
2
2
⏟
S
R
l
o
s
s
+
∑
i
=
±
1
[
β
∣
∣
I
t
+
i
′
L
R
−
I
t
L
R
∣
∣
2
2
+
λ
H
(
∂
x
,
y
Δ
t
+
i
)
]
⏟
c
o
m
p
e
n
s
a
t
i
o
n
l
o
s
s
.
(3)
(\theta, \theta^*_{\Delta}) = \argmin_{\theta, \theta_\Delta} \underbrace{||I_t^{HR} - f(I_{t-1:t+1}^{'LR};\theta)||^2_2}_{SR\;loss} + \underbrace{ \sum_{i=\pm 1}[\beta||I_{t+i}^{'LR} - I^{LR}_t||_2^2 + \lambda\mathcal{H}(\partial_{x,y}\Delta_{t+i})]}_{compensation \;loss}.\tag{3}
(θ,θΔ∗)=θ,θΔargminSRloss
∣∣ItHR−f(It−1:t+1′LR;θ)∣∣22+compensationloss
i=±1∑[β∣∣It+i′LR−ItLR∣∣22+λH(∂x,yΔt+i)].(3)如公式(3)所示,VESPCN的总体loss由SR网络的loss和运动补偿模块的loss共同组成。
3 Experiments and results
- 实验的核心主要是为了分析单独使用spatio-temporal network对视频超分的表现力以及增加运动补偿模块之后对视频超分表现力的影响。
- 实验只针对SR缩放系数为 3 、 4 3、4 3、4进行相关实验。
- 实验数据集为1080p的HD视频。
- 作者给出了一个计算网络第 l l l层所需浮点运算(复杂度)的公式: H W ⋅ D l + 1 n l + 1 [ ( 2 k l 2 d l − 1 ) n l ⏞ c o n v o l u t i o n s + 2 ⏟ b i a s & a c t i v a t i o n ] . (4) HW\cdot D_{l+1}n_{l+1}[\overbrace{(2k_l^2d_l-1)n_l}^{convolutions} + \underbrace{2}_{bias \;\&\; activation}].\tag{4} HW⋅Dl+1nl+1[(2kl2dl−1)nl convolutions+bias&activation 2].(4)
3.1 Experimental setup
3.1.1 Data
论文中的数据集采用CDVL
数据集,这是一个包含115个高清(HD)无压缩的视频,作者挑选其中100个视频作为训练集,并对每个视频随机选取30个样本,组成3000个
H
R
−
L
R
HR-LR
HR−LR对;其中150个作为验证集,剩余2850个作为训练集;其余的15个高清视频作为测试集。
3.1.2 Network training and parameters
实验中一些SR方法的对比都是在相似超参数的情况下对比的,比如:
- 卷积核大小都为 k l = ( 3 , 3 ) k_l=(3,3) kl=(3,3)。
- 参数初始化。
- 相同数目的隐藏层。
- batch个 33 × 33 33\times 33 33×33的视频输入。
- Adam优化方式且学习率为 1 0 − 4 10^{-4} 10−4。
- batch初始设置为1,每过10个epochs,就翻一倍。
- 在spatio-temporal network中,当第 l l l层的时间深度为1的时候,设置 n l = 24 n_l=24 nl=24;当 l > 0 l>0 l>0时, n l = 24 / D l n_l=24/D_l nl=24/Dl。例如,对于Slow fusion模式下 D 0 = 5 , d l = 2 D_0=5,d_l=2 D0=5,dl=2下各层的输出通道如下:
3.2 Spatio-temporal video SR
这一节只研究时序空间网络。
3.2.1 Single vs multi frame early fusion
作者在这一节主要是探究单帧模式下(single frame:SF)的SR网络(类似于ESPCN)和early fusion模式下的spatio-temporal网络在PSNR表现以及模型复杂度上的影响。此外后者设置
D
0
=
3
,
5
,
7
\bm{D_0=3, 5,7}
D0=3,5,7来进一步探究不同输入帧个数会带来什么影响,我们分别命名为E3、E5、E7。对于模型复杂度,我们对网络设置6-11层卷积层,共6种情况下带来的表现力影响。
实验结果如下图所示:
Note:
- GOps指标是衡量神经网络算力的一个指标,GOps代表每秒进行10亿次运算,越低代表速度越快。
从结果中可得出以下结论:
- 利用了时间冗余的时序空间网络具有比ESPCN这种只能独立一帧一帧处理视频的方法具有更好表现力。
- 对于Early fusion来说,不同输入帧所造成的复杂度是微小的,因为只是在输入帧的时候造成了复杂度的影响,接下去都直接合并然后输出相同的 n l n_l nl张feature map,故上图中E3、E5、E7在GOps上差别不大。
- E7的表现力要低于E3、E5,说明了输入帧的的信息过于复杂,导致网络无法学习到有用的信息。相对而言 D 0 = 5 D_0=5 D0=5是个不错的选择。
3.2.2 Early vs slow fusion
这一小节主要探究spatio-temporal network中Early fusion和Slow fusion对PSNR和GOps的影响。
我们分别对比以下几种设置:
SF(single-frame)、E5(Early fusion,
D
0
=
5
D_0=5
D0=5)、S5(Slow fusion,
D
0
=
5
,
d
l
=
2
D_0=5,d_l=2
D0=5,dl=2)、S5-SW(3D convolution,
D
0
=
5
D_0=5
D0=5)
针对7和9个卷积层,作者得出实验结果如下:
我们可以得出的实验结果如下:
- Slow fusion拥有比Early fusion更高的计算效率,这得益于2方面,一方面是初始输入特征上,Slow fusion只需要处理 d l = 2 d_l=2 dl=2,而Early fusion要处理 D 0 = 5 D_0=5 D0=5;此外根据公式(4),Slow fusion只需要更少的浮点操作。
- 在7层卷积层下,Early fusion拥有比Slow fusion更好的表现力,但是在9层下,Slow fusion在拥有更高的计算效率下兼具和E5一样的表现力,这说明了浅层网络下,early fusion比Slow fusion更合适,但是深层网络下,Slow fusion比Early fusion更好!
- 3D卷积模式展现了最佳的计算效率,这是因为它有很多参数可以共享,但带来的缺陷就是表现力不足,泛化能力还有待提升。从实验中看,7层的E5不管在效率还是在表现力上都超过了9层的S5-SW。
- S5和S5-SW都展现了比SF(ESPCN)更快的执行速度,意味着spatio-temporal network展现了比ESPCN更加高效的特性,且表现力还能提升!
3.3 Motion compensated video SR
这一节开始我们探究:
- 运动补偿的功能。
- 研究运动补偿模块为SR带来的影响。
Note:
- D 0 = 3 D_0=3 D0=3,spatio-temporal network采用Early fusion模式。
首先我们来探究单独的运动补偿模块的功能。
我们设置Loss为公式(2),以及
λ
=
0.01
\lambda=0.01
λ=0.01,下图是实验结果:
上图中第一行是光流flow信息,它是用来突出运动的物体;第二行是运动补偿模块的效果图,可以看出拥有运动补偿后,相邻帧的差距在变小,拥有MC之后,
I
t
−
1
′
≈
I
t
≈
I
t
+
1
′
I_{t-1}'\approx I_t\approx I_{t+1}'
It−1′≈It≈It+1′,这就使得相邻3帧变得更加的连续了,将运动的变化更加细致化。
接下来探究MC模块结合Early fusion的SR网络的实验。
MC模块和Early fusion模块得初始化是分开来预训练的,但是整个模块是一起做优化的,具体的:根据公式(3),我们联合训练SR网络和MC网络,其中
β
=
0.01
,
λ
=
0.001
\beta=0.01,\lambda=0.001
β=0.01,λ=0.001,
r
=
3
r=3
r=3,在CDVL上的结果如下:
其中SF代表single-frame,相当于ESPCN,E3代表没有运动补偿的Early fusion(
D
0
=
3
D_0=3
D0=3),E3-MC代表有运动补偿模块的Early fusion(
D
0
=
3
D_0=3
D0=3),我们得出的实验结论如下:
- E3-MC对SF在PSNR的提升是E3对SF的2倍左右,这意味着有MC的SR网络在视频超分上可以最大化利用时间冗余信息,这也证明了MC模块产生更加连续的时间信息会造成SR网络产生更加不错的表现力提升。
3.4 Comparison to state-of-the-art
在这一节我们将VESPCN和SRCNN、ESPCN、VSRnet进行对比,其中VESPCN设置2个变体:5L-E3(Early fusion,5层卷积层,且
D
0
=
3
D_0=3
D0=3)以及9L-E3-MC(Early fusion,9层卷积层,
D
0
=
3
D_0=3
D0=3,包含运动估计模块)。评价指标为PSNR/SSIM、MOVIE。
Note:
- MOVIE指标是一个用于评价视频质量的指标,它表征了人类对视频质量的感知以及对视频连续性的评价。该值越小越好。
3.4.1 Quality comparison
实验结果如下图所示:
实验结论:
- VESPCN在表现力上碾压其余几种算法的存在,从PSNR、SSIM、MOVIE上就可以看出来。
- 有MC的VESPCN展现的时间连贯性有效降低了MOVIE,说明了MC产生的时间连贯性对SR表现力的提升很有作用。
3.4.2 Efficiency comparison
模型的复杂度受到网络结构和输入图像大小两方面影响。
实验结果如下:
- SRCNN和VSRnet都采用将输入图像先进行上采样,然后在 H R HR HR层级进行一系列特征提取,而ESPCN和VESPCN采用 L R LR LR层级特征提取,然后最后使用亚像素卷积层来进行上采样。后者因为采用更加高效的方式使得计算复杂度大大降低。
- 从3.2.2节可以可知,spatio-temporal网络拥有比SF更加高效的特性,因此在本次实验中,5L-E3也展现了比ESPCN更加快速的运算。
- 此外,拥有运动补偿的9L-E3-MC的计算效率也不错!
4 Conclusion
- 文章推出了一种具备实时特性的视频超分方法,其将ESPCN的亚像素卷积层和3种时间空间融合的方式(early fusion、slow fusion、3D卷积)进行结合,产生了ESPCN的加强版本——spatio-temporal network,它利用了视频时间冗余特性,在运算效率和表现力上都强于ESPCN在视频上的处理。
- 文章推出了一种STN的变体——运动补偿模块,它可以和spatio-temporal网络联合训练,使得VESPCN可以进行端对端的训练。MC模块的加入使得SR网络的输入端具有更加连续的时间特性,这也让表现力相比单独使用spatio-temporal网络得到了进一步提升!