视频重建论文EDVR: Video Restoration with Enhanced Deformable Convolutional Networks阅读笔记

论文来源:CVPRW2019

论文链接:http://ieeexplore.ieee.org/document/9025464

项目地址:GitHub - xinntao/EDVR: Winning Solution in NTIRE19 Challenges on Video Restoration and Enhancement (CVPR19 Workshops) - Video Restoration with Enhanced Deformable Convolutional Networks. EDVR has been merged into BasicSR and this repo is a mirror of BasicSR.

作者:商汤

概述:

NTIRE2019视频恢复和增强挑战赛的冠军解决方案,在所有四个赛道中(视频去模糊(clean/压缩伪影)、视频超分(clean/blur))都赢得了冠军,并以巨大的优势超过了第二名。EDVR在视频超分辨率和去模糊方面的性能也达到了当时的sota效果。


以视频去模糊为例,网络输入为当前帧和其前后N帧共(2N+1)帧,首先使用步长>2的卷积来下采样降低分辨率从而减少计算开销,然后先用一个PreDeblur模块对输入进行预去模糊,从而提升后续PCD对齐模块的对齐精度。


PCD对齐模块整体框架是一个金字塔结构,对于每一帧图像,分别用卷积来提取特征,对于金字塔的第l层特征,都是由l-1层的所有特征concat后用步长为2的卷积得到的,而l层的偏移量是由l层的特征和l+1层的偏移量上采样后concat进行卷积得到的。在上采样过程中,第l层的特征是由对应层串联特征应用可变形卷积提取特征后,与l+1层的特征上采样后concat再进行卷积得到的。采用这种将可变形卷积与金字塔网络结合的方式,可以由粗到细的对特征进行对齐,从而使多帧之间的对齐更精确。在金字塔之后,把L1层的浅层特征和深层特征concat再卷积得到一个偏移量,然后对最后的特征进行可变形卷积得到最后的对齐特征。对于对齐后的特征,将其输入到一个TSA融合模块中。


TSA融合模块是用来为每一帧分配像素级的融合权重。用于进一步融合时空信息,解决遮挡、模糊区域、不同帧信息量不对等以及前一阶段可能的未对准问题,对于每一帧,先卷积,再用每一帧的卷积结果与当前参考帧的卷积结果点乘,然后用sigmoid来得到一个权重矩阵,然后将这个矩阵和每一帧的特征图进行像素级相乘,从而实现多通道上的空间注意力,自适应的融合多帧信息,再将得到的结果串联卷积后送入一个三层金字塔网络中,TSA的输出结果被输入到一个重建模块中,重建模块由40个残差块组成,最后的重建结果上采样之后与输入相加得到最后的增强结果。
采用单个EDVR网络已经可以达到sota的效果,但在比赛中为了获得更好的结果,作者在一个EDVR网络后级联了第二个深度较浅的EDVR网络来进一步提升性能。

Abstract

视频恢复任务,包括超分辨率、去模糊等,越来越受到计算机视觉界的关注。一个名为REDS的具有挑战性的基准在NTIRE19挑战赛中发布。这个新的基准从两个方面挑战了现有的方法:(1)如何在给定大运动的情况下对齐多个帧;(2)如何有效地融合具有不同运动和模糊的不同帧。在这项工作中,我们提出了一个新的视频恢复框架与增强可变形卷积,称为EDVR,以解决这些挑战。首先,为了处理大的运动,我们设计了一个Pyramid, Cascading和Deformable (PCD)对齐模块,在该模块中,帧对齐是在特征级使用从粗到精的可变形卷积来完成的。其次,我们提出了一个时空注意(TSA)融合模块,该模块在时间和空间上同时应用注意力,以强调后续恢复的重要特征。得益于这些模块,我们的EDVR在NTIRE19视频恢复和增强挑战赛的所有四个赛道中都赢得了冠军,并以巨大的优势超过了第二名。EDVR在视频超分辨率和去模糊方面的性能也优于最新公布的方法。代码可在https://github.com/xinntao/EDVR.

1. Introduction

balabala

我们提出了一个统一的框架,称为EDVR,它可以扩展到各种视频恢复任务,包括超分辨率和去模糊。EDVR的核心是(1)一个金字塔、级联和可变形卷积(PCD)的对齐模块,(2)一个称为时空注意(TSA)的融合模块。

PCD模块受TDAN[40]的启发,使用可变形卷积将每个相邻帧与特征级的参考帧对齐。与TDAN不同,我们以从粗到精的方式执行对齐,以处理大型和复杂的运动。具体来说,我们使用金字塔结构,首先将低尺度的特征与粗略估计对齐,然后将偏移和对齐的特征传播到更高的尺度,以便于精确的运动补偿,类似于光流估计中采用的概念[7,9]。此外,我们在金字塔对齐操作之后级联一个额外的可变形卷积,以进一步提高对齐的鲁棒性。

提出的TSA是一个融合模块,有助于跨多个对齐特征聚合信息。为了更好地考虑每一帧上的视觉信息,我们通过计算参考帧和每一相邻帧特征之间的元素相关来引入时间注意。然后,相关系数对每个位置处的每个相邻特征进行加权,指示其对于重构参考图像的信息量。然后对所有帧的加权特征进行卷积和融合。在与时间注意融合后,我们进一步应用空间注意为每个通道中的每个位置分配权重,以更有效地利用交叉通道和空间信息。

我们参与了视频恢复和增强挑战[29,28]中的所有四个赛道,包括视频超分辨率(清晰/模糊)和视频去模糊(清晰/压缩伪影)。由于有效的对齐和融合模块,我们的EDVR在所有四个具有挑战性的赛道中都获得了冠军,证明了我们方法的有效性和可推广性。除了比赛结果,我们还报告了对现有的视频超分辨率和去模糊基准的比较结果。在这些视频恢复任务中,我们的EDVR显示出比最先进的方法优越的性能。

3. Methodology

3.1. Overview

给定2N+1个连续的低质量帧,我们将中间帧表示为参考帧,其他帧表示为相邻帧。视频恢复的目的是估计一个高质量的参考帧ˆOt,接近ground truth帧Ot。所提出的EDVR的总体框架如图2所示。它是一种适用于多种视频恢复任务的通用架构,包括超分辨率、去模糊、去噪、去块等。

以视频SR为例,EDVR采用2N+1低分辨率帧作为输入,产生高分辨率输出。每个相邻帧通过PCD对齐模块在特征级与参考帧对齐。TSA融合模块融合不同帧的图像信息。有关这两个模块的详细信息,请参见第3.2节和第3.3节。融合后的特征通过重建模块,重建模块是EDVR中剩余块的级联,可以很容易地被单个图像SR中的任何其他高级模块替换[46,51]。在网络的末端执行上采样操作以增加空间大小。最后,高分辨率帧通过将预测图像残差与直接上采样图像相加得到^Ot。

对于具有高空间分辨率输入的其他任务,例如视频去模糊,首先使用跨步卷积层对输入帧进行下采样。然后大部分的计算是在低分辨率空间进行的,这大大节省了计算成本。最后的上采样层会将特征调整回原始的输入分辨率。在对齐模块之前使用Predeblur模块对模糊输入进行预处理,提高对齐精度。

虽然单个EDVR模型可以达到最先进的性能,但我们采用了两阶段策略来进一步提升NTIRE19竞赛中的性能。具体来说,我们级联相同的EDVR网络,但深度较浅,以细化第一阶段的输出帧。级联网络可以进一步消除先前模型无法处理的严重运动模糊。详情见第3.4.节。

3.2. Alignment with Pyramid, Cascading and Deformable Convolution

如图3所示,整体采用三层特征金字塔的结构,对于每一帧,分别用卷积来提取特征,然后用步长为2的卷积下采样,对于金字塔的第l层特征,都是由l-1层的所有特征concat后用步长为2的卷积得到的,而l层的偏移量是由l层的特征和l+1层的偏移量上采样后concat进行卷积得到的。在上采样过程中,第l层的特征是由对应层串联特征应用可变形卷积提取特征后,与l+1层的特征上采样后concat再进行卷积得到的。在金字塔之后,把L1层的浅层特征和深层特征concat再卷积得到一个偏移量,然后对最后的特征进行可变形卷积得到最后的对齐特征。

3.3. Fusion with Temporal and Spatial Attention

为了进一步融合时空信息,解决遮挡、模糊区域、不同帧信息量不对等以及前一阶段可能的未对准问题,提出了TSA融合模块来为每一帧分配像素级的融合权重。对于每一帧,先卷积,再用每一帧的卷积结果与当前参考帧的卷积结果点乘,然后用sigmoid来得到一个权重矩阵,然后将这个矩阵和每一帧进行像素级相乘,再将得到的结果串联卷积后送入一个三层金字塔网络中。

3.4. Two-Stage Restoration

尽管单个EDVR可以达到目前的sota水平,但恢复后的图像质量不完美,尤其是当输入帧模糊或严重失真时。在这种恶劣的环境下,运动补偿和细节聚集会受到影响,导致重建性能下降。

直观地说,粗略恢复的帧将大大减轻对齐和融合的压力。因此,我们采用两阶段策略来进一步提高性能。具体而言,级联类似但较浅的EDVR网络以细化第一级的输出帧。其优点有两个:1)有效地去除了前一种模型无法处理的严重运动模糊,提高了恢复质量;2) 它缓解了输出帧之间的不一致性。

4. Experiments

4.2. Comparisons with State-of-the-art Methods

我们将我们的EDVR与几种最新的视频SR和视频去模糊方法进行了比较。没有使用两阶段和自集成策略[20]。在评估中,我们包括所有的输入帧,除了DUF方法[10]外,不裁剪任何边界像素。由于DUF的严重边界效应,我们在图像边界附近裁剪了8个像素。

Video Super-Resolution. 

Video Deblurring. 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设`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`结构体中的各个字段。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值