视频超分算法EDVR:Video Restoration with Enhanced Deformable Convolutional Network超分辨率重建
Posted 暖风️
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了视频超分算法EDVR:Video Restoration with Enhanced Deformable Convolutional Network超分辨率重建相关的知识,希望对你有一定的参考价值。
这篇文章结合了TDAN中时间可变形网络的优势和Robust-VSR中融合注意力机制的优势,在此基础上注入了金字塔结构,提出了一种新的VSR方法EDVR(Enhanced Deformable Video Restoration),主要分为两个具体部分:金字塔级联可变形对齐网络(PCD) 和 时空注意力融合超分网络(TSA)。是适用于多种视频恢复任务的通用体系结构,包括超分辨率、去模糊、去噪、去块等。
原文链接:EDVR: Video Restoration with Enhanced Deformable Convolutional Networks[CVPR 2019]
参考目录:超分之EDVR
TDAN:Temporally-Deformable Alignment Network for Video Super-Resolution
DCN:Deformable Convolution Network
Robust-VSR:Robust Video Super-Resolution With Learned Temporal Dynamics
EDVR: Video Restoration with Enhanced Deformable Convolutional Networks
Abstract
EDVR整体结构上还是和往常的视频超分架构一样分为四部分:特征提取、对齐、融合和重建。只是深入研究了对齐和融合部分,使视频在包含大运动、遮挡和严重模糊时,仍能保持优异的性能。
2019年NTIRE视频超分挑战赛上发布了一个新的数据集,REalistic and Diverse Scenes dataset (REDS)。与现有数据集相比,REDS视频包含更大、更复杂的运动,使视频重建任务更真实、更具挑战性。之前的很多视频重建方法在该数据集上性能下降了很多。这也正推动了视频超分辨率重建任务的进步。
提出了金字塔级联可变形卷积对齐网络(PCD)和时空注意力融合SR网络(TSA)。
- 金字塔级联可变形卷积对齐网络(PCD),PCD基于可变形卷积DCN这种feature-wise、one-stage、flow-free的对齐方法,使用金字塔结构令DCN基于不同层级的feature map做对齐(不同层级代表不同频率的特征信息),并向更高分辨率的feature map层级传递和融合不同层级对齐后的feature map(offset),产生一种从粗略到精确的隐式运动补偿结构。
- 时空注意力融合SR网络(TSA),TSA基于注意力机制,因不同帧和不同feature point包含的信息对图像重建的重要程度不同,通过分配不同的权重来关注重要信息,忽略无用或者错误的信息。在该网络中不仅使用了类似RCAN的空间注意力(SA),还使用了时间注意力(TA)。
1 Introduction
通常视频超分任务的pipeline由四个部分组成,即特征提取、对齐、融合和重建。当视频包含遮挡、大运动和严重模糊时,挑战在于对齐和融合模块的设计。为了获得高质量的输出,必须抓住两个关键:
- 如何在多个帧之间对齐并建立精确的对应关系,大而复杂的运动很容易使得重建后的视频帧出现artifacts。
- 如何有效地融合没法精确对齐的特征以进行重建。
而REDS数据集就是专门针对之前算法的上述缺陷而存在的。
大运动为什么会导致表现力下降?
- 大运动导致
对齐的难度
增加。我们需要利用时间上的冗余信息来补充单帧的细节,前提是在前后图像对齐的情况下,否则两帧之间相差太多内容上完全不相关,肯定没法利用信息。大运动的存在导致运动轨迹很难捕捉,中间过程只能是随机推测,对齐的精确性肯定受到很大的影响,很可能会出现artifacts。对齐不准确在下个阶段融合的时候,会出现重叠或者模糊等等,影响SR的性能。 - 在平滑、小幅度运动上也会因为对齐网络能力受限而影响融合SR网络表现力。原因:不管是基于Flow-based的对齐网络(如STN系列的VESPCN、Robust-LTD)还是基于Flow-free的对齐网络(如DCN系列的TDAN)都会存在一个粗略估计或者说
无法做到精确对齐
的问题。 - 而flow-based对齐方法还有个严重的缺陷就是其严重依赖于运动估计的准确性,一旦估计出现问题就会使对齐出现artifacts,且后期很难修正。相对的基于DCN的flow-free对齐方法,是在特征级进行对齐,offset的粗略计算也可能会使得对齐的feature map出现artifacts,但feature-wise好在还有校正的空间,在后面接一层卷积可以减少artifacts的出现(TDAN中)。
如何进行有效融合来提升超分重建性能?
当对齐使得输入SR网络的对齐帧中出现了模糊、重影等artifacts或者当视频中存在多运动的情况下,在融合部分引入注意力机制
,让网络更加关注能提高重建质量的特征信息,而忽略模糊、重影等特征信息,利用注意力机制来按重要性分配权重。
对近年来融合和对齐的发展进行简要回顾:
对齐:
对齐主要分为2种方式:
- 基于光流的方法(flow-based),使用STN作为基础,直接在Image-wise上对支持帧进行warp:典型的VSR结构有VESPCN、Robust-LTD等
- 不依赖光流的方法(flow-free),使用DCN作为基础,在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-Resolution和Recurrent Back-Projection Network for Video Super-Resolution采用循环神经网络进行特征融合;
- Robust-LTD采用时间自适应网络来设计一个基于注意力机制来自动选择时间尺度的融合方式。
问题:
- 不同的帧中包含不同程度重要性的信息,但是上述的这些融合方式对待不同的帧都是相同的方式,
- 不同的feature point具有对于超分来说不同的价值,有的特征信息被不精确的对齐给弄模糊了或者出现重影等artifacts。
因此在EDVR中引入注意力机制,学习对特征中不同重要程度的信息分配不同的权重值。对那些不益于超分网络的训练的信息,分配微小的权重,而对有价值的信息分配较高的注意力权重。
针对以上问题,作者提出了EDVR方法,分别在对齐和融合两方面进行改进,提出了金字塔级联可变形卷积对齐网络(PCD)和时空注意力融合SR网络(TSA)。
对齐部分:
针对大运动问题,EDVR引出了金字塔级联可变形卷积对齐网络(PCD),PCD基于可变形卷积DCN这种feature-wise、one-stage、flow-free的对齐方法,使用金字塔结构令DCN基于不同层级的feature map做对齐(不同层级代表不同频率的特征信息),并向更高分辨率的feature map层级传递和融合不同层级对齐后的feature map(offset),产生一种从粗略到精确的隐式运动补偿结构;此外在金字塔外PCD额外设置一个TDAN来进一步提升对齐网络的鲁棒性。
融合部分:
针对多运动和模糊的融合,EDVR引出了时空注意力融合SR网络(TSA),TSA基于注意力机制,因不同帧和不同feature point包含的信息对图像重建的重要程度不同,通过分配不同的权重来关注重要信息,忽略无用或者错误的信息。在该网络中不仅使用了类似RCAN的空间注意力(SA),还使用了时间注意力(TA)。时间注意力是计算支持帧与参考帧之间的相似度来获取权重,利用的是支持帧和参考帧之间的时间依赖。
2 Method
EDVR是个多功能视频重建网络,其包括超分、去模糊、去噪声、去块功能。
去模糊任务不在我们讨论的范围内,所以不详细讲。红色虚线圈住的灰色部分就是预模糊功能。
视频超分部分结构: 和其他VSR方法一样,输入是2N+1帧连续视频流
I
[
t
−
N
:
t
+
N
]
L
R
I_[t-N:t+N]^LR
I[t−N:t+N]LR,其中中间帧
I
t
L
R
I_t^LR
ItLR为参考帧。经过PCD对齐网络
在特征级将每个相邻帧与参考帧对齐,得到对齐后的2N帧支持帧和一帧参考帧。再经过TSA融合模块
融合不同帧的图像信息并提取特征后重建出SR’,重建模块
是多个残差块的级联(可以用SR任务中其他高级模块替换),在网络的末端执行上采样
操作以增大图像分辨率,再使用LR参考帧上采样后的图像作为正则化项进行修正,最后得到高分辨率SR。(去模糊模块对于超分也是有用的,它放在对齐模块之前可以有效减少输入端带来的模糊问题,从而提升对齐质量。)
对于具有高分辨率输入的其他任务(例如视频去模糊):输入帧首先使用卷积下采样,使整个过程在低分辨率空间中进行计算(节省计算成本)。在对齐模块之前使用预模糊模块
来预处理模糊输入并提高对齐精度。中间是超分的部分。最后的上采样层会将特征调整回原始输入分辨率。
note:作者使用了两份阶段策略,级联了两个EDVR网络,但第二个网络深度较浅,主要是为了细化第一阶段的输出帧。级联网络可以进一步消除先前模型无法处理的严重运动模糊。
2.1 Alignment with PCD
PCD(Pyramid, Cascading and Deformable Convolution)金字塔级联可变形卷积,是基于可变形卷积DCN(Deformable Convolution Net)的一种方法,类似于TDAN中包含时间信息的变体。但是TDAN中的对齐是比较粗糙的,只对齐了一次,而在PCD中作者引入了金字塔结构,分级逐步提取并融合特征,是一种由粗到细、feature-wise的方法。
先简单的了解下这个结构的概况:每次输入两帧图像 I t I_t It和 I t + i I_t+i It+i,第一步顺着倒金字塔的左边黄线方向做拼接和获取偏移量,第二步顺着紫线方向从最高层特征开始利用偏移做可变形卷积并往上一层合并(上采样,融合)。第三步是右上角浅紫色背景色的部分,将多层融合后的支持帧特征再和参考帧拼接单纯做一次TDAN,得到最终的对齐版特征图Aligned Features。
这一节需要用到TDAN的知识,实际上是一个加入时间信息的DCN的变体结构。
简单说一下为什么说是由粗到精的方法,这个粗略和精确针对的是位置特征的精确度。我们要做的工作是对齐,对齐最重要的是位置信息。在金字塔底层,图像特征分辨率最高(图像大小最大),位置信息更加精确。黄线部分的特征提取只是可变形卷积的一个预处理工作。PCD先对分辨率最小的feature map 进行可变形卷积进行粗略的对齐,然后将offset和feature map向更高分辨率的特征图像传递,每次对齐都将变得更加精确。
PCD对齐模块基于DCN(可变形卷积),它和TDAN中对于DCN的用法几乎完全一样,唯一不同的是,TDAN中只用了一个DCN网络;而PCD使用了多个DCN网络和卷积网络进行级联形成金字塔结构,并且每个DCN都是基于不同层级的feature map进行对齐,故PCD的对齐是一种从粗到细、自顶向下的过程。
首先介绍一下PCD中可变形卷积是怎么做的:
不同于经典的DCN,VSR中的DCN由于需要结合时间信息,输入为两帧图像,因此需要先将参考帧和支持帧简单融合,一般是使用Early fusion进行直接concat后接一个卷积层减少通道维度。再通过一个卷积层学习得到offset,使用算子
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帧图像(每个样本包含2N+1帧图像),其中
F
t
F_t
Ft为参考帧,其余为支持帧,则偏移矩阵
Δ
P
\\Delta P
ΔP表达式为:
Δ
P
t
+
i
=
f
(
[
F
t
+
i
,
F
t
]
)
,
i
∈
−
N
,
⋯
,
1
,
⋯
,
N
.
(1)
\\Delta P_t+i = f([F_t+i, F_t]),i\\in\\-N,\\cdots, 1, \\cdots,N\\.\\tag1
ΔPt+i=f([Ft+i,Ft]),i∈−N,⋯,1,⋯,N.(1)
其中
Δ
P
=
Δ
p
\\Delta P =\\\\Delta p\\
ΔP=Δp,
[
⋅
,
⋅
]
[\\cdot,\\cdot]
[⋅,⋅] 表示concat操作。
Δ
P
t
+
i
\\Delta P_t+i
ΔPt+i的分辨率和
F
t
+
i
F_t+i
Ft+i是一样的(得到的是整个patch中每个位置的偏移量),深度为2K或者K均可(2K表示x、y两个方向)。
有了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(\\underbracep_0+p_k+\\Delta p_k_p) + b(p_k),\\tag2
Ft+ia=k=1∑Kw(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卷积,则 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表示一个卷积核的参数个数。
接下来介绍金字塔级联结构是怎么样的:(PCD整体过程)
第一步:(黄色指向线①)
首先将同一时间窗口下的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
∈
[
媒体应用视频超分AI神器!360P视频一键转换HD
作为多媒体应用的开发者,你是否想为媒体播放器快速开发创新AI功能?例如:
- 在播放低画质视频过程中对其进行逐帧超分
- 让满屏飘飞的弹幕自动绕过画面的主体人物
HMS Core 6.0.0开放的多媒体管线服务(AV Pipeline Kit),帮助媒体应用开发者降低创新功能的开发难度。通过定义插件的标准接口和数据流在插件之间的流转方式,开发者只需要按照标准接口完成插件开发,就可以迅速构建出新型的媒体场景。
多媒体管线服务(AV Pipeline Kit)定义了一套插件标准接口,且已经内置了对插件的数据流管理、线程管理、内存管理、消息管理等,开发者只需要实现插件的核心处理逻辑即可,无需关注线程同异步、流控、音视频同步等逻辑。目前已预置了3个可应用在播放场景的Pipeline:视频播放、视频超分、声音事件检测,并提供Java接口供开发者使用,同时也支持开发者通过C++接口直接调用单个预置插件。若预置插件或预置Pipeline不满足使用要求,开发者可以自定义插件、自定义Pipeline。
技术方案
视频超分
下面我们详细描述内置的高性能视频超分插件,穿插在视频流的解码和显示流程之间,将低分辨率视频实时转换成高分辨率视频,改善视频清晰度,增加视频细节表现力,提升用户观看体验。
开发准备
1. 新建Android Studio工程,修改工程级build.gradle文件如下
在“allprojects > repositories”里面增加Maven仓地址。
allprojects
repositories
google()
jcenter()
maven url 'https://developer.huawei.com/repo/'
2. 修改项目级build.gradle文件如下
targetSdkVersion设为28;并在dependencies中添加编译依赖。
dependencies
implementation 'com.huawei.hms:avpipelinesdk:6.0.0.302'
implementation 'com.huawei.hms:avpipeline-aidl:6.0.0.302'
implementation 'com.huawei.hms:avpipeline-fallback-base:6.0.0.302'
implementation 'com.huawei.hms:avpipeline-fallback-cvfoundry:6.0.0.302'
3. 配置manifest
修改AndroidManifest.xml文件,添加读取外部存储的权限。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
4. 同步工程
点击工具栏中的gradle同步图标,完成“build.gradle”文件的同步,将相关依赖下载到本地。
开发步骤
详细示例代码请参见GitHub
1. 动态申请存储权限
String[] permissionLists =
Manifest.permission.READ_EXTERNAL_STORAGE
;
int requestPermissionCode = 1;
for (String permission : permissionLists)
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED)
ActivityCompat.requestPermissions(this, permissionLists, requestPermissionCode);
2. 初始化AV Pipeline框架
Context context = getApplicationContext();
boolean ret = AVPLoader.initFwk(context);
if(!ret) return;
3. 创建MediaPlayer实例
播放过程的控制由该实例来完成。
MediaPlayer mPlayer = MediaPlayer.create(MediaPlayer.PLAYER_TYPE_AV);
if (mPlayer == null) return;
4. 设置graph配置文件
AV Pipeline框架依赖于该配置文件来编排各个插件。此外还需要将MEDIA_ENABLE_CV的值设置为1,使能视频超分插件。
MediaMeta meta = new MediaMeta();
meta.setString(MediaMeta.MEDIA_GRAPH_PATH, getExternalFilesDir(null).getPath() + "/PlayerGraphCV.xml");
meta.setInt32(MediaMeta.MEDIA_ENABLE_CV, 1);
mPlayer.setParameter(meta);
5. 设置以下参数后调用prepare接口,启动MediaPlayer准备工作。
若需要监听某些事件,通过setOnPreparedListener、setOnErrorListener等接口设置回调函数。(可选)
// 设置视频渲染的surface
SurfaceView mSurfaceVideo = findViewById(R.id.surfaceViewup);
SurfaceHolder mVideoHolder = mSurfaceVideo.getHolder();
mVideoHolder.addCallback(new SurfaceHolder.Callback()
// 用户自定义回调函数内容,可参考codelab_视频播放
);
mPlayer.setVideoDisplay(mVideoHolder.getSurface());
// 设置待播放媒体文件的路径
mPlayer.setDataSource(mFilePath);
// 若需要监听某些事件,则还需要通过setXXXListener接口设置回调函数
// 例如需要监听prepare完成的事件,需进行如下设置
mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener()
@Override
public void onPrepared(MediaPlayer mp, int param1, int param2, MediaParcel parcel)
// 用户自定义回调函数内容
);
mPlayer.prepare();
6. 调用start开始播放
mPlayer.start();
7. 调用stop停止播放
mPlayer.stop();
8. 销毁播放器
mPlayer.reset();
mPlayer.release();
9. 其他注意事项
视频超分插件的约束详见文档
访问华为多媒体管线服务官网,了解更多相关内容
获取华为多媒体管线服务开发指导文档
华为多媒体管线服务开源仓库地址:GitHub、Gitee
华为HMS Core官方论坛
解决集成问题请到Stack Overflow
点击右上角头像右方的关注,第一时间了解HMS Core最新技术~
以上是关于视频超分算法EDVR:Video Restoration with Enhanced Deformable Convolutional Network超分辨率重建的主要内容,如果未能解决你的问题,请参考以下文章
大淘宝技术斩获NTIRE视频增强和超分比赛冠军(内含夺冠方案)
可生成高清视频的Stable Diffusion来了!分辨率提升4倍,超分算法来自腾讯,支持Colab在线试玩...