书接上回,咱继续写paperwithcode中VID4排行榜上的论文
相关的论文可以查看地址
经典视频超分论文总结1
经典视频超分论文总结2
经典视频超分论文总结3
经典视频超分论文总结4
经典超分论文总结5
7、Detail-revealing Deep Video Super-resolution(DRDVSR, ICCV2017)
港中文的工作,贾佳亚大佬背书,虽然有公开代码,但是直接使用pb文件,所以无法查看具体模型。即使把pb用tensorboard可视化出来也超级乱。网络整体结构如下:
7.1 先说一下动量估计(Motion Estimation, ME)
直接采用第一篇讲解中VESPCN的MCT模块获得光流预测图F,该部分不需要原文模块中最后的warp操作。
7.2 主要说一下SPMC
这部分所有分析都说很重要,但是原文讲的我感觉蛮乱的,而且使用的字母表达和下图中字母也不一样。比如文中示用 J L J^{L} JL、 J H J^{H} JH表达图像,下面图示又是用 I L I^{L} IL、 Y Y Y。你再看看上面图示,又是 I L I^{L} IL、 J H J^{H} JH。我建议不要看图示了,直接看公式,因为这俩也不匹配。
![](https://i-blog.csdnimg.cn/blog_migrate/49ff4b90e81ebe7377f20065708be375.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ea750b1b58937a50e85aa59ced813ae7.png)
SPMC包含采样栅极发生器(Sampling Grid Generator)和图像采样器(Image Sampler)前者用于将光流放大,后者用于将图像放大并与光流结合。
7.2.1 采样栅极发生器(Sampling Grid Generator)
令 F = ( u , v ) F=(u, v) F=(u,v),图像坐标 ( x , y ) (x, y) (x,y)。坐标转换表示为:
![](https://i-blog.csdnimg.cn/blog_migrate/f4d2c4ec86bff4bdf46518b473d876cd.png)
这时候得到的
(
x
s
,
y
s
)
(x^{s}, y^{s})
(xs,ys)还只是坐标变换值。
代码实现很简单:
mapping = (get_coords(img) + flow) * scale
7.2.2 可导的图像采样器(Differentiable Image Sampler)
这段甚是麻烦,作者网络实现都还没讲清,就介绍可导性了。图像采样的实现公式表达如下
![](https://i-blog.csdnimg.cn/blog_migrate/26a4f2e74c6bbc143676784c9cef7df7.png)
其中
M
(
x
)
=
m
a
x
(
0
,
1
−
∣
x
∣
)
M(x) = max(0, 1 − |x|)
M(x)=max(0,1−∣x∣),为双线性插值核。看公式很简单,将采样后的坐标
(
x
p
s
,
y
p
s
)
(x^{s}_{p}, y^{s}_{p})
(xps,yps)与放大后的坐标
(
x
q
,
y
q
)
(x_{q}, y_{q})
(xq,yq)做差,然后计算双线性插值,再与原图
J
p
L
J^{L}_{p}
JpL相乘。
但问题是1)坐标与LR图像相乘的意义是什么?2)对LR的坐标p求和,又是什么意义?表示双线性插值的那个求和吗?
我个人觉得具体实现是这样的:一般的warp得到光流F后,直接在LR空间对LR图像进行warp。得到的结果依旧是在LR空间的。本文作者将光流F通过乘以系数
α
\alpha
α变换到HR空间,同时将LR图像也经过双线性插值变换到HR空间,然后在HR空间进行warp。个人能力有限,欢迎大佬拍砖解答
7.2.3 SPMC优点
1)将第0帧映射到第i帧,而非其他常用的超分方法将第相邻帧映射到中间帧。
2)提升动量补偿可以直接就产生高质的SR结果,因此用SPMC。
3)在动量补偿时同时扩大尺寸
7.3 最后聊聊细节融合网络(Detail Fusion Net)
说 J H J^{H} JH是大尺寸,而且稀疏具有很多0,所以先降采,然后中间使用LSTM融合多帧信息。此处有个点说之前的VSR可以产生尖锐边缘,但不知道是输入帧固有的,还是从额外数据学的,经过证明发现只有真实的HR细节有用。
7.4 loss
phase1: ME时使用L1 loss
phase2: DF时使用L2 loss
phase3: 最后用上述两者联合训练
8、Recurrent Back-Projection Network for Video Super-Resolution(RBPN,CVPR2019)
这篇很好理解,大概看图就懂。代码
与其他网络通过warp或者stack将多帧堆叠在一起不同,本文将每对(距离当前帧相同远的)上下文信息帧作为分开的信息源。意思就是👇图一样,每个
I
t
−
n
I_{t-n}
It−n和
F
t
−
n
F_{t-n}
Ft−n单独和
I
t
I_{t}
It输入网络。
其中F为预先得到的光流图。代码实现为:
def get_flow(im1, im2):
im1 = np.array(im1)
im2 = np.array(im2)
im1 = im1.astype(float) / 255.
im2 = im2.astype(float) / 255.
# Flow Options:
alpha = 0.012
ratio = 0.75
minWidth = 20
nOuterFPIterations = 7
nInnerFPIterations = 1
nSORIterations = 30
colType = 0 # 0 or default:RGB, 1:GRAY (but pass gray image with shape (h,w,1))
u, v, im2W = pyflow.coarse2fine_flow(im1, im2, alpha, ratio, minWidth, nOuterFPIterations, nInnerFPIterations,nSORIterations, colType)
flow = np.concatenate((u[..., None], v[..., None]), axis=2)
#flow = rescale_flow(flow,0,1)
return flow
网络分为三部分。
8.1、初始特征提取(Initial feature extraction)
如上图所示,就是一个卷积。
8.2 多个投影 (Multiple Projections)
公式和图像都很容易理解,将 L t − n − 1 L_{t-n-1} Lt−n−1和 M t − n M_{t-n} Mt−n输入Encoder网络,得到输出 L t − n L_{t-n} Lt−n用于下一投影的输入, H t − n H_{t-n} Ht−n用于重建
![](https://i-blog.csdnimg.cn/blog_migrate/e90a19046a2fe9f905438c5405cad1d8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/28c3560174678d828d563ee32adf35e0.png)
8.3 重建
多个 H t H_{t} Ht concat然后卷积
9、Frame-Recurrent Video Super Resolution (FRVSR,CVPR2018)
google大佬18年工作,但是效果比很多19,20的还要好。
9.1 摘要
本文认为当前的VSR是把多帧图输入,得到一帧HR结果,然后划窗式移动。但是缺点在于1)每个帧处理和warp很多次,增加计算消耗。2)每个输出帧都是根据输入帧独立估计的,这限制了系统产生时间一致结果的能力。(bb一下:这句对比RNN就知道他在说什么了,rnn会一直把隐藏信息向后传)。本文提出帧循环的RNN框架,用之前推断的HR帧推测之后的帧。这自然会鼓励时间一致的结果,并通过在每个步骤中仅扭曲一个图像来降低计算成本。此外,由于其循环性质,所提出的方法能够在不增加计算需求的情况下同化大量先前的帧。(bb一下,我觉得不怎么能,因为rnn问题就是记不住太长序列,要不然也不会有LSTM)
9.2 网络结构
网络结构还是蛮简单的,基本看图就能理解,简单提几点。
1、图中显示了RNN一次循环的过程,输入图像有
I
t
I_t
It和
I
t
−
1
I_{t-1}
It−1,上一帧的输出
I
t
−
1
e
s
t
I^{est}_{t-1}
It−1est会继续用于当前帧的输入。
2、
F
L
R
F^{LR}
FLR 经双线性插值得到
F
H
R
F^{HR}
FHR
3、
L
f
l
o
w
L_{flow}
Lflow用于学习FNet,将warp后的
I
t
−
1
L
R
I^{LR}_{t-1}
It−1LR与
I
t
L
R
I^{LR}_{t}
ItLR做L2 loss。
L
s
r
L_{sr}
Lsr用于学习SRNet。
9.3 FNet和SRNet的网络结构
如图,上面是FNet,下面是SRNet。