超分之EDVR

在这里插入图片描述

这篇文章是2019年在视频超分领域上的作品,由商汤联合实验室出版。作者推出的EDVR结合了TDAN中时间可变形对齐网络的优势和Robust-LTD中融合注意力机制的优势,推出了一种基于金字塔级联可变形对齐网络(PCD)和时空注意力融合超分网络(TSA)的新型VSR方法——EDVR

参考文档:
源码
REDS数据集
视频超分:EDVR
论文笔记之EDVR

Abstract

一、出现问题
EDVR为何被推出?在EDVR提出之前,现存的VSR方法都面临这无法解决的两大难题:

  1. 首先是针对VSR的对齐网络:大运动下的视频相邻帧,很难做到内容对齐
  2. 其次是针对VSR的融合SR网络:如何在多运动以及视频模糊下进行融合。

NTIRE19超分挑战赛上出现了REDS视频数据集,这个包含了大运动的数据集就是专门针对之前算法的上述缺陷而存在的,因此为了能在该数据集上表现出色,就必须设计出一个新的VSR算法。

二、分析问题
Q 1 Q_1 Q1:大运动为何带来了VSR表现力的下降呢?
如下图所示:在这里插入图片描述
①当你运动幅度过大,那么对齐带来的难度就会增加,因为大运动就意味运动轨迹的可能性增加,故运动估计的方向和精确性都会受到影响,上述就列举了3种情况下通过对齐网络(比如VESPCN的TSTN对齐方法、TDAN的TDCN对齐方法、Robust-LTD的TSTN对齐方法)产生的对齐情况,一旦如上述橙色球所示,那么就会导致对齐出错,这样不仅会使得对齐之后的图像出现artifacts;还会直接影响融合SR网络的性能,试想一下融合的时候,一旦其中一帧对齐不当,那么融合就会出现重叠或者模糊,最后超分重建的效果一定不会好。关于对齐出错导致最后SR性能下降的例子可以在Robust-LTD这篇文章的实验部分得到验证
②此外,在平滑、小幅度运动上也会因为对齐网络能力受限从而影响融合SR网络表现力受限,这起源于不管是基于Flow-based的对齐网络(如STN系列的VESPCN、Robust-LTD)还是基于Flow-free的对齐网络(如DCN系列的TDAN)都会存在一个粗略估计或者说无法做到精确对齐的问题
Flow-based对齐方法还有个问题就是其严重依赖于运动估计的准确性,一旦运动估计出现问题,就会使得最后的对齐出现artifacts,故会给后续融合SR网络的性能带来影响。不仅如此,Flow-based方法在预估出现artifacts的情况下也无法去调整校正减少artifacts的出现;与之对比的是基于DCN的flow-free对齐方法,它的对齐基于feature map,虽然这种方式也会因为offset的粗略计算等问题使得对齐的feature map同样出现artifacts,但feature-wise好就好在它还有可以校正的空间,如TDAN论文中的对齐网络结构所示,它在对齐支持feature map之后接了一层 3 × 3 3\times 3 3×3的卷积层来进行校正来减少artifacts的出现,具体结构如下所示:在这里插入图片描述

Q 2 Q_2 Q2:当对齐使得输入SR网络的对齐帧中出现了模糊、重影等artifacts或者当视频中存在多运动,如何进行有效融合来提升超分重建性能呢?
通过引入注意力机制,让网络更加关心对重建质量提升的特征信息,而对于模糊、重影等特征信息就给予较少的注意力。也就是说并不是和之前的VSR算法一样,对于什么特征信息都进行融合,而是要挑选有用的信息

三、解决问题

  1. 在VSR中,主要包括时间对齐网络和融合SR网络两部分,针对上述两个问题,作者提出了EDVR。它对于两个部分分别进行了改进
  2. 针对大运动问题,EDVR引出了金字塔级联可变形卷积对齐网络(PCD),PCD基于可变形卷积DCN这种feature-wise方法,其多级的级联设置产生出一种从粗略估计到精确估计结构;此外在不同层级的特征上基于不同的信息进行可变形卷积对齐也使网络会去学习一种更加复杂的网络参数来对大运动甚至复杂运动做对齐。
  3. 针对多运动和模糊的融合,EDVR引出了时空注意力融合SR网络(TSA),TSA基于注意力机制,强调网络更加注重一些重要有意义的特征信息,而不要什么信息都进行融合。
  4. EDVR在2019年超分挑战赛上取得了冠军,并在表现力上比当时所有的VSR方法都要出色(SOTA)。

1 Introduction

在2019超分挑战赛NTIRE上出现了Realistic and Diverse Scenes datasets(REDS)数据集,这是一个比以往视频集包含更大且更复杂的运动。大而复杂的运动很容易会使得以往的VSR方法在对齐后出现artifacts,从而使得融合的时候提取不到有用的信息,故之前的VSR方法诸如VESPCN、DUF、TDAN、Robust-LTD等都会在这个数据集上吃瘪。

VESPCN在VSR上的出色表现使我们更加肯定了一套明确的视频超分pipeline:特征提取、对齐、融合、重建(或者也可以对齐网络+融合SR网络)。故如何在大运动复杂视频中进行对齐,以及如何在存在模糊重影下的融合下提升重建表现是EDVR的当务之急。


接下来我们分别对近年来融合和对齐的发展进行简要介绍:
①对齐
  对齐主要分为2个派别,一个是flow-based对齐,其直接在Image-wise上对支持帧进行warp,典型的VSR结构有VESPCN、Robust-LTD等;另一个是基于flow-free对齐,其在feature-wise上对支持帧的feature map进行对齐,是一种隐式运动补偿的对齐方式,典型的VSR结构有DUF、TDAN等。
  但是上述的这些算法,不管是flow-based还是flow-free都无法在大运动视频中进行有效对齐,主要原因在于他们都只是在单一分辨率尺度下进行对齐。此外,还有个对齐精确度的问题,上述的算法中除了VESPCN采用了2级的由粗到细的对齐之外,其余都只用了1级的对齐,故无法保证运动补偿的准确性。但VESPCN这种flow-based方法一来高度依赖于运动估计的准确性,二来其属于two-stage方法,故如果需要完成多级的对齐就需要花费更多的时间资源,相对flow-free这种one-stage方式来说更慢!

②融合
  在VESPCN中采用了Early fusion、Slow fusion、3D卷积等融合方式;Frame-Recurrent Video Super-ResolutionRecurrent Back-Projection Network for Video Super-Resolution采用循环神经网络进行特征融合;Robust-LTD采用时间自适应网络来设计一个基于注意力机制来自动选择时间尺度的融合方式。
  但是上述的这些融合方式对待不同的帧都是相同的方式,但客观事实是不同的帧、不同的feature point具有对于超分来说不同的价值,即有的feature map对于最后的重建是有益的,而有的特征信息被不精确的对齐给弄模糊了或者出现重影等artifacts,那么显然这些信息是不益于超分网络的训练的,我们就要给与它一个很微小的权重。而一些重要的信息我们要去学习注意力权重,使那部分有价值的特征信息被赋予较大的权重。


基于上述对于近年来VSR的优缺陷分析,EDVR取长补短,对于对齐网络和融合SR网络都做出了改进:

  1. 对于对齐网络部分,使用one-stage、基于flow-free的对齐方式,具体而言:我们仍然使用DCN这种feature-wise方法来作为对齐网络隐式的运动补偿的核心部分,因为DCN训练速度比使用STN要来得快,且其不依赖于运动估计的准确性。为了增加运动补偿的准确性,EDVR设计了多层的DCT级联结构,此外为了学习更复杂的运动,各级的DCN基于不同层级的feature map。故这种金字塔(CNN不断卷积使得feature map不断变小,结构上长得像金字塔,故称之为Pyramid,这有点类似于15年用于目标识别的SppNet)、级联(Cascade)的可变形卷积(Deformable Convolution Network)网络就用来充当EDVR的对齐网络——PCD。关于PCD的具体信息,可参考3.2节,这里我们简要说明下其结构:PCD是一个类似金字塔的结构,最顶层是较低分辨率的feature map,最底层是参考帧和支持帧,不同层级代表不同频率的特征信息。PCD先对最小分辨率的参考feature map进行对齐形成粗略的对齐,然后offset和对齐feature map传到更大分辨率的层上去,就这样每次都将offset和不断对齐的feature map往底层传过去,从而自顶向下形成从粗糙到精确的隐式运动补偿;此外在金字塔外PCD额外设置一个DCN来进一步提升对齐网络的鲁棒性。
  2. 对于融合部分,为了避免提取重影、模糊部分的特征信息或者需要去提取特殊位置的特征(如多个运动物体),EDVR使用时空注意力网络(Temporal Spatial Attention)去更关注对超分重建有意义的特征信息,而一些不好的特征信息就给与较小的注意力甚至为0(关于注意力机制,典型代表有SISR中的RCAN以及VSR中的Robust-LTD)。在TSA中,作者不仅使用了类似RCAN中的空间注意力(SA),还使用了时间注意力(TA)。TA的计算是基于参考帧和支持帧之间的时间依赖(冗余),因为这样获取的权重可以用来衡量支持帧每个位置相对于参考帧的相关性(注意力机制会更加关注相关的东西),我们根据这个相关性来表示当前位置的信息对于重建参考帧的重要程度。之后我们将时间注意力在各支持帧上的结果进行concat成 F f u s i o n F_{fusion} Ffusion并输入一个空间金字塔结构获取element-wise的空间注意力,最后和 F f u s i o n F_{fusion} Ffusion结合输出最后融合后的feature map。

Note:

  1. TA和SA都是element-wise的,

小结:
EDVR是一个具备VSR和去模糊(Handling Motion Blur in Multi-Frame Super-Resolution)的framework。其核心是一个金字塔级联可变形卷积网络(PCD)和一个时空注意力融合网络(TSA)

2 Related Work

3 Methodology

3.1 Overview

在这里插入图片描述

如上图所示是整个EDVR的网络结构(红线上为超分部分):

  1. 和其他VSR方法一样,输入是 2 N + 1 2N+1 2N+1帧连续的 L R LR LR视频流 I [ t − N : t + N ] L R I_{[t-N:t+N]}^{LR} I[tN:t+N]LR,其中中间帧 I t L R I_t^{LR} ItLR为参考帧,其余 2 N 2N 2N帧为支持帧(或相邻帧)。最终的输出是参考帧的SR重建结果 O ^ t \hat{O}_t O^t,我们的目标就是通过优化MSE损失函数(或者其他Loss)来将超分结构接近Ground Truth O t O_t Ot
  2. EDVR是个多功能视频重建网络,其包括超分、去模糊、去噪声、去块功能。
  3. EDVR的前向过程为: 2 N + 1 2N+1 2N+1帧连续图像首先通过去模糊模块;然后在对齐模块中,每次输入一帧参考帧和时间窗口内的一帧支持帧,最终输出1帧参考feature map和 2 N 2N 2N张对齐版本的支持feature map;将对齐后的 2 N + 1 2N+1 2N+1张一起输入TSA模块中进行融合,将融合后的feature map进行重建并通过上采样层生成 H R HR HR层级图像,最后该预测的图像和来自输入端直接通过上采样获取的图像进行相连,最后输出高分辨率图像。

下面分步骤介绍EDVR中pipeline各个模块:
①输入层:输入层分为两部分,如果是超分任务,则输入 2 N + 1 2N+1 2N+1帧连续的 L R LR LR图像;如果是去模糊任务,则输入 2 N + 1 2N+1 2N+1帧连续的 H R HR HR图像,并通过降采样到 L R LR LR层级来降低去模糊任务的复杂度。
②去模糊:去模糊模块对于超分也是有用的,它放在对齐模块之前可以有效减少输入端带来的模糊问题,从而提升对齐质量。
③PCD:金字塔级联可变形卷积层,PCD基于feature-wise,每次对齐2张feature map,分别是参考feature map和时间大小内的支持feature map,一共要对齐 2 N 2N 2N次,最后输出参考feature map以及 2 N 2N 2N张对齐feature map。
④TSA:时空注意力融合模块,输入为 2 N + 1 2N+1 2N+1帧对齐feature map,结合时间注意力融合和空间注意力融合机制,输出融合后的feature map。
⑤重建层:EDVR中使用残差块,作者指出重建层可以是任意SISR方法,即意味着这一层其实就是SR网络的特征提取层。
⑥上采样层:通过反卷积、亚像素卷积等方式来提升feature map的大小,不仅如此和DCSCN中采取一样的措施,和来自输入端的参考帧的上采样相加最后才输出超分图像,这里的这个连接可以作为一种正则化项迫使网络去学习残差信息,即如何重建出较高质量的参考帧。


如果说上述是一个EDVR网络,那么作者提出了一个二阶段版本的EDVR,第一阶段还是一个较深的网络,而第二个几段采用较浅的网络。

3.2 Alignment with Pyramid, Cascading and Deformable Convolution

PCD对齐模块基于DCN(可变形卷积网络),EDVR将DCN用于时间对齐,因此它和TDAN中对于DCN的用法几乎完全一样,唯一不同的是,TDAN中只是用了一个DCN网络;而PCD使用了多个DCN网络和卷积网络进行级联形成金字塔结构,并且每个DCN都基于不同层级的feature map,故PCD的对齐是一种从粗到细、自顶向下的过程。接下来我们简要介绍下PCD中每个DCN的基本原理(关于DCN,可参考我的另一篇深度学习之DCN):
不同于经典的DCN,VSR中的DCN由于需要结合时间,因此offset通过参考帧和支持帧通过简单融合(一般是Early fusion进行直接concat)来学习得到的,我们使用算子 f ( ⋅ ) f(\cdot) f()表示学习offset的网络, F t + i , i ∈ [ − N , N ] F_{t+i},i\in [-N,N] Ft+i,i[N,N]表示 2 N + 1 2N+1 2N+1帧图像(这是一个样本),其中 F t F_t Ft为参考帧,其余为支持帧,则偏移矩阵 Δ P \Delta P ΔP表达式为:
Δ P t + i = f ( [ F t + i , F t ] ) . (1) \Delta P_{t+i} = f([F_{t+i}, F_t]).\tag{1} ΔPt+i=f([Ft+i,Ft]).(1)其中 Δ P = { Δ p } \Delta P =\{\Delta p\} ΔP={Δp} [ ⋅ , ⋅ ] [\cdot,\cdot] [,]表示concat操作。
Note:

  1. Δ P t + i \Delta P_{t+i} ΔPt+i的分辨率和 F t + i F_{t+i} Ft+i是一样的,深度为 2 K 2K 2K或者 K K K均可。

有了offset,我们接下来将offset用于支持帧 F t + i , i ∈ { − N , ⋯   , − 1 , 1 , ⋯   , N } F_{t+i},i\in\{-N,\cdots,-1, 1, \cdots,N\} Ft+i,i{N,,1,1,,N},并对变换之后的支持帧进行卷积,输出对齐之后的支持特征图 F t + i a F^a_{t+i} Ft+ia,具体表达式为:
F t + i a = ∑ k = 1 K w ( p k ) ⋅ F t + i ( p 0 + p k + Δ p k ⏟ p ) + b ( p k ) . (2) F^a_{t+i} = \sum^K_{k=1} w(p_k)\cdot F_{t+i}(\underbrace{p_0+p_k+\Delta p_k}_p) + b(p_k).\tag{2} Ft+ia=k=1Kw(pk)Ft+i(p p0+pk+Δpk)+b(pk).(2)其中 w ( p k ) 、 b ( p k ) w(p_k)、b(p_k) w(pk)b(pk)表示可变形卷积的参数, p k p_k pk表示卷积核中的某一个位置,假设 3 × 3 3\times 3 3×3卷积,则 p k ∈ { ( − 1 , − 1 ) , ( − 1 , 0 ) , ⋯   , ( 1 , 1 ) } p_k\in \{(-1,-1), (-1, 0), \cdots, (1,1)\} pk{(1,1),(1,0),,(1,1)} K K K表示一个卷积核的参数个数。
Note:

  1. 一般来说 p p p是亚像素坐标,故会通过双线性插值去获取最后的 F t + i ( p ) F_{t+i}(p) Ft+i(p)

接下来我们可以介绍基于DCN的金字塔级联可变形卷积网络(PCD)了,其网络结构如下:
在这里插入图片描述

PCD的前向过程如下

  1. 首先将同一时间窗口下的2帧图像(一个是参考帧,一个是支持帧)通过卷积输出各自的feature map,作为第一层的特征信息 F t + i 1 F_{t+i}^1 Ft+i1;接着使用跨步卷积产生下采样为2的特征信息 F t + i l F^l_{t+i} Ft+il,其中某一层 l ∈ [ 1 , L ] l\in[1,L] l[1,L],上图中 L = 3 L=3 L=3,即我们产生了3个层级的特征信息,他们的分辨率依次以 × 2 \times 2 ×2进行衰减。
  2. 然后从顶层 L 3 L3 L3开始,对该层的参考feature map和支持feature map进行简单concat融合输出该层的offset,以及利用offset和该层的支持feature map输出该层对齐之后的参考特征图 ( F t + i a ) 3 (F^{a}_{t+i})^3 (Ft+ia)3(上标中的“3”表示金字塔的第3层)。
  3. 接着我们将第3层学习到的offset和该层对齐之后的参考特征图 ( F t + i a ) 3 (F^{a}_{t+i})^3 (Ft+ia)3输送给下一层,即第二层。第二层的offset的获取不仅来源于该层2个输入feature map,还来源于上一层的offset;此外该层输出的对齐feature map不仅来源于该层可变形卷积的输出,还取决于上一层的对齐feature map;具体表达式为: Δ P t + i l = h ( [ f ( [ F t + i , F t ] ) , ( Δ P t + i l + 1 ) ↑ 2 ] ) , (3) \Delta P_{t+i}^l = h([f([F_{t+i},F_t]), (\Delta P_{t+i}^{l+1})^{\uparrow 2}]),\tag{3} ΔPt+il=h([f([Ft+i,Ft]),(ΔPt+il+1)2]),(3) ( F t + i a ) l = g ( [ D C o n v ( F t + i , Δ P t + i l ) , ( ( F t + i a ) l + 1 ) ↑ 2 ] ) . (4) (F^a_{t+i})^l = g([{\color{teal}DConv(F_{t+i},\Delta P^l_{t+i})},{\color{mediumorchid}((F^a_{t+i})^{l+1})^{\uparrow 2}}]).\tag{4} (Ft+ia)l=g([DConv(Ft+i,ΔPt+il),((Ft+ia)l+1)2]).(4)其中 ( ⋅ ) ↑ 2 (\cdot)^{\uparrow 2} ()2表示使用双线性插值进行2倍上采样; D C o n ( ⋅ ) DCon(\cdot) DCon()表示可变形卷积; g ( ⋅ ) , h ( ⋅ ) g(\cdot),h(\cdot) g(),h()表示一般的卷积过程; [ ⋅ ] [\cdot] []表示concat。
  4. 接着就继续按照公式(3)(4)传到第一层,输出对齐支持feature map。
  5. 在EDVR中,作者在金字塔结构之外(即上图第④步),将第1层的支持帧feature map和 ( F t + i a ) 1 (F^a_{t+i})^1 (Ft+ia)1进行concat输出一个offset,然后利用这个offset和 ( F t + i a ) 1 (F^a_{t+i})^1 (Ft+ia)1进行可变形卷积输出支持特征图 ( F t + i ) 1 (F_{t+i})^1 (Ft+i)1的对齐版本—— F t + i a F^a_{t+i} Ft+ia;这样可以进一步调整校正对齐feature map

PCD结构分析:
那么PCD这样金字塔结构有什么好处呢?

  1. 首先利用DCN作为变形的基础功能块,是看中了其one-stage带来对齐速度的优势,其次是其基于feature-wise这种隐式运动补偿带来减少对齐后artifacts的影响,且其并不依赖于运动估计的精度。
  2. 其次多个DCN进行级联使得整个对齐基于从粗到细的运动补偿,多级的DCN结构有助于提升对齐的准确性,从而为后续融合SR重建提供有益的帮助。顶层一般位置信息较模糊,而DCN主要依赖于位置的变换,所以其对齐较粗糙;而底层含有更准确的位置信息,因此传到底层时候的对齐更加准确。
  3. 每个DCN基于不同层级的feature map,而不同层级的feature map拥有不同的分辨率,不同的特征信息。在EDVR的金字塔结构中,高层拥有更多的结构信息,但是其位置信息会发生略微的改变,因为经过不断的卷积池化之后其位置信息会变得模糊一些;而底层拥有更多的例如边缘纹理等信息,且其位置信息更加准确。例如下图是某一卷积层中不同滤波器输出的feature map,他们都包含了不同的特征信息。因此基于不同的特征图进行可变形卷积会产生更多复杂的变换,从而让PCD对齐学习到大运动或者复杂运动下如何去对齐支持帧到参考帧
    在这里插入图片描述

3.3 Fusion with Temporal and Spatial Attention

在VSR中,帧间相关性和帧内相关性都很重要,但是不同帧之间由于包含信息的重要程度不同:

  1. 支持帧中可能存在一些artifacts,比如重影、模糊、遮挡等问题。
  2. 此外,如果之前的相邻帧对齐出现精度较低或者对齐不准确问题,那么在融合的时候,在卷积核看来,前后帧在内容上是有不同的,这种不对齐就相当于变模糊了,自然就会影响到后续SR重建。

因此为了解决这个问题,我们就需要在时间和空间上都引入注意力机制,对于不好的特征信息进行忽略,而更加注重对重建有益的特征信息。

EDVR提出TSA模块,其主要分为时间注意力和空间注意力两个部分,其具体网络结构如下图所示:
在这里插入图片描述
①时间注意力
时间注意力的设计是基于参考feature map和支持feature map之间的相关性:在支持feature map中每个通道中每个位置上和支持feature map相关性高的,或者说支持feature map上和参考feature map相关性较高的位置被赋予更多的注意力权重。
时间注意力网络的设计是简单的先进行卷积,然后通过element-wise将输入和注意力权重相结合。我们用 θ ( ⋅ ) 、 ϕ ( ⋅ ) \theta(\cdot)、\phi(\cdot) θ()ϕ()分别表示对支持feature map和参考feature map的卷积,故时间注意力权值的数学表达式为:
h ( F t + i a , F t a ) = s i g m o i d ( θ ( F t + i a ) T ϕ ( F t a ) ) . (5) h(F^a_{t+i},F_t^a) = sigmoid(\theta(F^a_{t+i})^T \phi(F_t^a)).\tag{5} h(Ft+ia,Fta)=sigmoid(θ(Ft+ia)Tϕ(Fta)).(5)
关于更多注意力机制中注意力函数的介绍,可参考我的另一篇NLP之Seq2Seq s i g m o i d ( ⋅ ) sigmoid(\cdot) sigmoid()在注意力设计中是结合门机制来将权重缩进在0~1之间,在RCAN中CA可以看成是residual scaling的一种方式,用于稳定训练,故sigmoid这种缩减也有助于增加训练的稳定性。
Note:

  1. h ( F t + i a , F t a ) h(F^a_{t+i},F_t^a) h(Ft+ia,Fta) F t + i a F_{t+i}^a Ft+ia具有相同的size。
  2. 需要特别指明的是,公式(5)表达的是patch-wise注意力计算,使用点积来构成不同token-embedding向量之间的相关性,其并不适用本文提出的时间注意力TA,因为公式(5)计算的是行与行之间的相关性,并不是TA想要的点与点之间的相关性。因此,若想要获取不同帧之间元素与元素之间的相关性,就必须要修改公式(5)为: h ( F t + i a , F t a ) = s i g m o i d ( θ ( F t + i a ) ⊙ ϕ ( F t a ) ) h(F^a_{t+i},F_t^a) = sigmoid(\theta(F^a_{t+i})\odot \phi(F_t^a)) h(Ft+ia,Fta)=sigmoid(θ(Ft+ia)ϕ(Fta)),这属于context-attension的element-wise的局部注意力机制。与之对应的TA示意图为:在这里插入图片描述。对应的TA源码为:在这里插入图片描述

获取注意力权值之后,就可以进行时间融合输出 F f u s i o n F_{fusion} Ffusion,数学表达式如下:
F ~ t + i a = F t + i a ⊙ h ( F t + i a , F t a ) , (6) \tilde{F}^a_{t+i} = F^a_{t+i} \odot h(F^a_{t+i},F_t^a),\tag{6} F~t+ia=Ft+iah(Ft+ia,Fta),(6)
F f u s i o n = C o n v ( [ F ~ t − N a , ⋯   , F ~ t a , ⋯   , F ~ t + N a ] ) . (7) F_{fusion} = Conv([\tilde{F}_{t-N}^a,\cdots, \tilde{F}_{t}^a, \cdots, \tilde{F}_{t+N}^a]).\tag{7} Ffusion=Conv([F~tNa,,F~ta,,F~t+Na]).(7)其中 [ ⋅ , ⋅ ] [\cdot, \cdot] [,]表示concat,式(7)本质就是个Early fusion。

②空间注意力
通过时间融合后的结果可以看成是个不含时间维度的feature map,然后我们开始做空间注意力,其网络结构是一个金字塔状,先使用2次卷积下采样,然后从顶层开始自顶向下通过上采样、相加等操作获取和 F f u s i o n F_{fusion} Ffusion相同size的空间注意力,最后通过element-wise的相乘来输出结合空间注意力融合的feature map—— F F F,接下来就直接使用融合后的 F F F送进SR网络进行超分重建出高分辨率版本的支持帧。空间注意力的具体表达式如下:
F 0 = C o n v ( F f u s i o n ) , F 1 = C o n v ( F f u s i o n ) , F 2 = F 0 + F 1 ↑ , F = F 2 ↑ + F f u s i o n ⊙ F 2 ↑ . F_0=Conv(F_{fusion}),F_1 = Conv(F_{fusion}),\\ F_2 = F_0 + F_1^{\uparrow},\\ F = F_2^{\uparrow} + F_{fusion}\odot F_2^{\uparrow}. F0=Conv(Ffusion),F1=Conv(Ffusion),F2=F0+F1,F=F2+FfusionF2.其中 ( ⋅ ) ↑ 、 ⊙ (\cdot)^{\uparrow}、\odot ()分别表示上采样和element-wise相乘。
Note:

  1. EDVR中共有2处金字塔,一处是PCD中,另一处在TSA的空间注意力结构中。
  2. F 2 ↑ F_2^{\uparrow} F2 F f u s i o n F_{fusion} Ffusion具有相同的size。

3.4 Two-Stage Restoration

在这里插入图片描述

为了更进一步提升VSR的质量,作者提出了一个two-stage的EDVR,即将2个EDVR串接起来。首先使用一个 ( E D V R ) 1 (EDVR)_1 (EDVR)1来做视频超分,然后将其超分的结果输入给下一个级联的 ( E D V R ) 2 (EDVR)_2 (EDVR)2来做进一步的调整。
作者指出这种two-stage有2个好处:

  1. 去除了原来1个EDVR无法完全去除的模糊问题。
  2. 减缓了1个EDVR输出的帧间不连续情况。

4 Experiments

4.1 Training Datasets and Details

①训练集:

  1. 首先是REDS数据集,这个数据集分辨率为720p,训练集一共240个视频,测试集和验证集各有30个视频,但是现在测试集不公开,所以作者抽取了4个视频作为测试集(REDS4),其余的266个视频作为训练和验证来用。
  2. 其次是Vimeo-90K训练数据集。这个数据集分辨率较低,但是数量多,其通常在Vid4Vimeo-90K-T上测试。

Note:

  1. Vid4中的4个视频相对运动较慢;Vimeo-90K-T相对较大,有很多运动和场景;REDS4是一个高清且有更大更复杂的运动视频。

②训练设置:

  1. PCD中特征提取阶段使用5个残差块提取特征。
  2. ( E D V R ) 1 (EDVR)_1 (EDVR)1中的SR重建部分使用40个残差块; ( E D V R ) 2 (EDVR)_2 (EDVR)2中的SR重建部分使用20个残差块。残差块的通道一律设置为128。
  3. r = 4 r=4 r=4
  4. 超分训练patch为 64 × 64 64\times 64 64×64,对于去模糊任务的花patch选 256 × 256 256\times 256 256×256
  5. batch=32。
  6. 1个样本包含连续5帧。
  7. 训练时候采用水平翻转和旋转90°两种自增强。
  8. 训练损失函数为 L = ∣ ∣ O ^ t − O t ∣ ∣ 2 + ϵ 2 , ϵ = 1 0 − 3 \mathcal{L}=\sqrt{||\hat{O}_t - O_t||^2 + \epsilon^2},\epsilon=10^{-3} L=O^tOt2+ϵ2 ,ϵ=103
  9. Adam优化,初始学习率设置为 4 × 1 0 − 4 4\times 10^{-4} 4×104
  10. 先训练浅层的 ( E D V R ) 2 (EDVR)_2 (EDVR)2,然后将它的参数作为深层 ( E D V R ) 1 (EDVR)_1 (EDVR)1的初始化参数来加快收敛。

4.2 Comparisons with State-of-the-art Methods

这一节作者将EDVR和其余几种SOTA方法一起对比,此外EDVR这里只使用one-stage且不使用自集成方法。
实验结果如下:
在这里插入图片描述
实验结论如下:

  1. 在Vid4这种慢性运动视频上,EDVR和DUF取得了最佳的重建性能,但是EDVR没有拉开差距。
  2. 在REDS4测试上,EDVR展示了其适应于大而复杂运动下的超分能力,和DUF拉开了差距。

超分的可视化结果如下:
在这里插入图片描述

EDVR还可以应用于去模糊,但这不是我们超分的研究范畴,所以我直接放一下实验结果:
在这里插入图片描述

4.3 Ablation Studies

这一节我们分别去研究PCD和TSA各自的作用。

①首先是PCD
实验结果如下:
在这里插入图片描述
其中Model1直接使用1个DCN来对齐;Model2使用和TDAN一样的做法,使用4个DCN级联做对齐;Model3和Model4均使用PCD。
实验结论如下:

  1. 在类似计算损耗下(FLOPs)下(FLOPs越低越好),PCD的存在让PSNR提升了0.2~0.4dB左右,证明了PCD的有效性。

接下来作者可视化了有无PCD对齐下的光流图,其中第29帧为参考帧,第28、30为相邻的支持帧,光流图如下所示:
在这里插入图片描述
实验结论如下:

  1. 我们重点关注原图像中红色框部分,这部分做了较大幅度的运动。我们首先注意到不管是有没有使用PCD对齐,都将这部分进行了对齐,在内容上近乎相似,但是显然从光流图可知,PCD拥有更小的光流值,说明了其于第29帧的对齐更加精准。这也说明了PCD可以对齐较大运动下的支持帧和参考帧

②其次是TSA中的时间注意力
实验结果如下:
在这里插入图片描述
实验结论:

  1. 拥有TSA下EDVR的重建表现力提升了0.14dB,证明了TSA对于VSR表现力的提升是有很大帮助的!

此外为了进一步体现时间注意力的作用,作者又进行了光流可视化,实验结果如下:
在这里插入图片描述

实验结论如下:

  1. 从图中可以看出,具有越小光流值的帧会被赋予越高的注意力权值,而越小的光流值意味和支持帧在内容上越相近,对齐的程度越高。这就证明了TSA模块会对对齐的越好的(或者说artifacts越少,其包含有用的信息越多)帧给与越高的权值,从而让其在SR重建中发挥更高的作用。

③数据集偏差
此外,作者还做了一项数据集偏差的实验,实验结果如下右表:
在这里插入图片描述
实验结论:

  1. 不同的训练集会在相同的测试集上产生较大的偏差。

4.4 Evaluation on REDS Dataset

首先是EDVR在2019超分挑战赛的表现结果:
在这里插入图片描述

进一步探究self-ensembletwo-stage对EDVR性能提升作用,其中在训练期间我们只使用2种自集成,而在测试中使用4种自集成,实验结果如下:
在这里插入图片描述
实验结论如下:

  1. 自集成对于VSR性能提升效果很小,而two-stage策略对于性能提升较大
  2. 当输入是模糊图像的时候,EDVR仍然可以提升视频的质量。

5 Conclusion

  1. EDVR对经典VSR结构的对齐网络和融合网络都进行了改进,分别使用了PCDTSA模块。PCD的存在使得EDVR可以应对大而复杂的运动;而TSA的存在使得EDVR更加注重对重建效果好的特征信息,对于存在模糊或对齐不佳的特征进行忽略。此外EDVR使用two-stage的策略可以较大提升表现力。
  2. EDVR是一个可以处理超分和去模糊任务的多功能VSR网络,并取得了2019超分挑战赛的冠军以及在性能上取得了SOTA!
  • 22
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
假设`Edvr.cfg`文件内容如下: ``` [General] Version=1.0 Name=Edvr [Parameters] InputFile=input.mp4 OutputFile=output.mp4 FrameRate=30 ``` 可以通过以下步骤将`Edvr.cfg`文件解析为一个`Config`结构体: 1. 定义`Config`结构体,包含`General`和`Parameters`两个结构体。`General`结构体包含版本号和名称,`Parameters`结构体包含输入文件名、输出文件名和帧率。 ```c typedef struct { struct { float version; char name[50]; } general; struct { char input_file[100]; char output_file[100]; int frame_rate; } parameters; } Config; ``` 2. 编写解析函数,读取`Edvr.cfg`文件,并将读取的内容存储到`Config`结构体中。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> Config parse_config_file(const char* file_name) { Config config = {0}; char line[100]; char section[20] = ""; FILE* fp; fp = fopen(file_name, "r"); if (fp == NULL) { printf("Failed to open file: %s\n", file_name); return config; } while (fgets(line, sizeof(line), fp) != NULL) { // 去除行末换行符 if (line[strlen(line) - 1] == '\n') { line[strlen(line) - 1] = '\0'; } // 处理段落信息 if (line[0] == '[' && line[strlen(line) - 1] == ']') { strcpy(section, line + 1); section[strlen(section) - 1] = '\0'; } else { // 处理键值对信息 char* key = strtok(line, "="); char* value = strtok(NULL, "="); if (strcmp(section, "General") == 0) { if (strcmp(key, "Version") == 0) { config.general.version = atof(value); } else if (strcmp(key, "Name") == 0) { strncpy(config.general.name, value, sizeof(config.general.name) - 1); config.general.name[sizeof(config.general.name) - 1] = '\0'; } } else if (strcmp(section, "Parameters") == 0) { if (strcmp(key, "InputFile") == 0) { strncpy(config.parameters.input_file, value, sizeof(config.parameters.input_file) - 1); config.parameters.input_file[sizeof(config.parameters.input_file) - 1] = '\0'; } else if (strcmp(key, "OutputFile") == 0) { strncpy(config.parameters.output_file, value, sizeof(config.parameters.output_file) - 1); config.parameters.output_file[sizeof(config.parameters.output_file) - 1] = '\0'; } else if (strcmp(key, "FrameRate") == 0) { config.parameters.frame_rate = atoi(value); } } } } fclose(fp); return config; } ``` 上面的代码中,使用`fgets()`函数逐行读取`Edvr.cfg`文件的内容,然后根据行内容的不同,分别处理段落信息和键值对信息。具体来说: - 如果行内容以方括号开头和结尾,说明这是一个段落信息,需要将方括号中的内容作为当前段落的名称。 - 如果行内容中包含等号,说明这是一个键值对信息,需要将等号左边的字符串作为键,等号右边的字符串作为值。根据当前段落的名称和键的名称,将值存储到`Config`结构体的相应字段中。 3. 调用解析函数,读取`Edvr.cfg`文件并打印配置信息。 ```c int main() { Config config; config = parse_config_file("Edvr.cfg"); printf("General:\n"); printf("Version: %.1f\n", config.general.version); printf("Name: %s\n", config.general.name); printf("Parameters:\n"); printf("InputFile: %s\n", config.parameters.input_file); printf("OutputFile: %s\n", config.parameters.output_file); printf("FrameRate: %d\n", config.parameters.frame_rate); return 0; } ``` 上面的代码中,调用`parse_config_file()`函数解析`Edvr.cfg`文件,并将解析结果存储到`config`结构体中。然后,打印`config`结构体中的各个字段。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值