《DVC: An End-to-end Deep Video Compression Framework》
论文:点这里
原作代码:点这里
TensorFlow开源实现:OpenDVC
Guo Lu, Wanli Ouyang, Dong Xu, Xiaoyun Zhang, Chunlei Cai, Zhiyong Gao
CVPR 2019 (Oral)
DVC是首个端到端的深度学习视频压缩框架,在深度学习视频压缩领域也常被视为基准算法,在它之后仍有多篇paper对其进行优化和改进,并且一些方法的代码也开源了,很值得学习。
Abstract
传统的视频压缩方法使用预测编码架构并对相应的运动信息和残差信息进行编码。本文利用传统视频压缩方法中的经典体系结构和强大的神经网络非线性表示能力,提出了第一个端到端视频压缩深度模型,该模型联合优化了视频压缩的所有模块。具体地,基于学习的光流估计被用来获得运动信息并重建当前帧。然后,采用两个自编码器样式的神经网络来压缩相应的运动和残差信息。所有模块都是通过单个损失函数共同学习的,其中,它们通过考虑减少压缩位数和提高解码视频质量之间的权衡来相互协作。实验结果表明,该方法在PSNR指标上可以优于广泛使用的视频编码标准H.264,在MS-SSIM指标上甚至可以与最新标准H.265媲美。
1. Introduction
现如今,视频内容贡献了80%以上的互联网流量[26],而且这一比例有望进一步提高。因此,在给定的带宽预算下,构建高效的视频压缩系统并生成更高质量的帧至关重要。另外,大多数与视频相关的计算机视觉任务(例如:视频目标检测或视频目标跟踪)对压缩视频的质量敏感,并且有效的视频压缩可能为其它计算机视觉任务带来好处。同时,视频压缩技术也有助于行为识别(action recognition)[41]和模型压缩(model compression)[16]。
然而,在过去的几十年中,视频压缩算法[39、31]依靠手动设计的模块,例如基于块的运动估计和离散余弦变换(DCT)(原文:block based motion estimation and Discrete Cosine Transform (DCT)),来减少视频序列中的冗余。尽管每个模块都经过精心设计,但整个压缩系统并未进行端到端优化。 期望通过联合优化整个压缩系统来进一步提高视频压缩性能。
最近,用于图像压缩的基于深度神经网络(DNN)的自动编码器[34,11,35,8,12,19,33,21,28,9]已获得与JPEG [37]、JPEG2000 [29]或BPG [1]等传统图像编解码器相当甚至更好的性能。一种可能的解释是,基于DNN的图像压缩方法可以利用大规模的端到端训练和高度非线性的变换,而传统方法则没有使用这种方法。
但是,直接应用这些技术来构建用于视频压缩的端到端学习系统并非易事。首先,学习如何生成和压缩针对视频压缩量身定制的运动信息仍然是一个悬而未决的问题。视频压缩方法严重依赖运动信息来减少视频序列中的时间冗余。一种简单的解决方案是使用基于学习的光流来表示运动信息。然而,当前基于学习的光流方法旨在产生尽可能精确的流场。但是,对于特定的视频任务,精确的光流通常不是最优的[42]。此外,与传统压缩系统中的运动信息相比,光流的数据量显着增加,并且直接应用[39,31]中的现有压缩方法来压缩光流值将大大增加存储运动所需的位数信息。第二,目前尚不清楚如何通过最小化残差和运动信息的率-失真(rate-distortion)来构建基于DNN的视频压缩系统。率-失真优化(RDO,Rate-distortion optimization)的目的是在给出用于压缩的位数(或比特率)(bits (or bit rate))时,实现更高质量的重构帧(即失真更少)。RDO对于视频压缩性能很重要。为了利用基于学习的压缩系统的端到端训练能力,需要使用RDO策略来优化整个系统。
在本文中,作者提出了第一个端到端深度视频压缩(DVC)模型,该模型可以共同学习运动估计、运动压缩和残差压缩。该网络的优点可总结如下:
-
视频压缩中的所有关键组件,即运动估计、运动补偿、残差压缩、运动压缩、量化和比特率估计,都是通过端到端的神经网络实现的。
-
视频压缩中的关键组件通过单个损失函数,在率-失真权衡的基础上进行联合优化,提高了压缩效率。
-
传统的视频压缩方法和我们提出的DVC模型之间存在一对一的映射关系。这项工作为从事视频压缩、计算机视觉和深层模型设计的研究人员提供了一座桥梁。例如,可以很容易地将更好的光流估计和图像压缩模型插入到该框架中。从事这些领域的研究人员可以使用DVC模型作为未来研究的起点。
实验结果表明,利用本文的神经网络方法对运动信息进行估计和压缩,可以显著提高压缩性能。当用PSNR衡量时,该框架优于广泛使用的视频编解码器H.264,当用多尺度结构相似性指数(MS-SSIM)衡量时,该框架与最新的视频编解码器H.265不相上下[38]。
2. Related Work
2.1. Image Compression
在过去的几十年里,人们提出了很多图像压缩算法[37,29,1]。这些方法严重依赖手工技术。例如,JPEG标准通过使用DCT将像素线性映射到另一个表示,并在熵编码之前量化相应的系数[37]。一个缺点是这些模块是单独优化的,可能无法达到最佳的压缩性能。
近年来,基于DNN的图像压缩方法越来越受到关注[34,35,11,12,33,8,21,28,24,9]。在文献[34,35,19]中,利用递归神经网络(RNNs)建立了一种渐进式图像压缩方案。采用CNN的其它编码方式进行网络压缩。为了优化神经网络,文献[34,35,19]中的工作只是尽量减少原始帧和重构帧之间的失真(例如,均方误差,mean square error),而没有考虑用于压缩的比特数。[11,12,33,21]采用了率-失真优化技术,通过在优化过程中引入位数来提高压缩效率。为了估计比特率,在[28,21,24]中学习了自适应算术编码方法的上下文模型,而在[11,33]中使用了非自适应算术编码。此外,为了提高图像压缩性能,还提出了其他技术,如广义除法归一化(generalized divisive normalization)(GDN)[11]、多尺度图像分解(multi-scale image decomposition)[28]、对抗训练(adversarial training)[28]、重要性图(importance map)[21,24]和帧内预测(intra prediction)[25,10]。这些现有的工作是本文视频压缩网络的重要组成部分。
2.2. Video Compression
在过去的几十年里,人们提出了几种传统的视频压缩算法,如H.264[39]和H.265[31]。这些算法大多遵循预测编码结构。尽管它们提供了高效的压缩性能,但它们是手动设计的,不能以端到端的方式联合优化。
对于视频压缩任务,已经提出了许多基于DNN的帧内预测和残差编码方法(intra prediction and residual coding)[13]、模式决策(mode decision)[22]、熵编码(entropy coding)[30]、后处理(post-processing)[23]。这些方法用来改善传统视频压缩算法中某一特定模块的性能,而不是建立端到端的压缩方案。在[14]中,Chen等,提出了一种基于块的视频压缩学习方法。然而,它不可避免地会在块之间的边界产生块度伪影(blockness artifact)。另外,他们利用先前重建的帧通过传统的基于块的运动估计传播的运动信息,这将降低压缩性能。Tsai等,提出了一种自动编码器网络来压缩特定领域视频的来自H.264编码器的残差[36]。这项工作没有使用深度模型进行运动估计、运动补偿或运动压缩。
最相关的工作是[40]中基于RNN的方法,其中视频压缩被定义为帧插值(frame interpolation)。然而,他们的方法中的运动信息也是由传统的基于块的运动估计产生的,而这些运动估计是由现有的基于非深度学习的图像压缩方法编码的[5]。也就是说,运动估计和压缩不是通过深度模型来完成的,也不是与其它组件联合优化的。另外,文献[40]中的视频编解码器只着眼于使原始帧和重建帧之间的失真(即均方误差)最小化,而没有考虑训练过程中的率-失真权衡。相比之下,在本文网络中,运动估计和压缩是由DNN来实现的,DNN通过考虑整个压缩系统的率-失真权衡,与其它组件联合优化。
2.3. Motion Estimation
运动估计是视频压缩系统中的一个重要组成部分。传统的视频编解码器使用基于块的运动估计算法[39],该算法很好地支持硬件实现。
在计算机视觉任务中,光流被广泛应用于时间关系的挖掘。近年来,人们提出了许多基于学习的光流估计方法[15,27,32,17,18]。这些方法激励我们将光流估计整合到我们的端到端学习框架中。与现有视频压缩方法中基于块的运动估计方法相比,基于学习的光流方法可以在像素级提供精确的运动信息,并且可以进行端到端的优化。然而,如果用传统的视频压缩方法对光流值进行编码,则需要更多的比特来压缩运动信息。
3. Proposed Method
Introduction of Notations.
V
=
{
x
1
,
x
2
,
.
.
.
,
x
t
−
1
,
x
t
,
.
.
.
}
\ V={x_1,x_2,...,x_{t-1},x_t,...}
V={x1,x2,...,xt−1,xt,...},表示当前视频序列;
x
t
\ x_t
xt,时间步长
t
\ t
t处的帧;
x
ˉ
t
\ \bar{x}_t
xˉt,预测帧;
x
^
t
\ \hat{x}_t
x^t,重构/解码帧;
r
t
\ r_t
rt,原始帧
x
t
\ x_t
xt和预测帧
x
ˉ
t
\ \bar{x}_t
xˉt之间的残差(误差);
r
^
t
\ \hat{r}_t
r^t,表示重建/解码残差;
为了减少时间冗余,需要运动信息。其中, v t \ v_t vt表示运动矢量或光流值, v ^ t \ \hat{v}_t v^t 是其相应的重构版本。可以采用线性或非线性变换来提高压缩效率。因此,残差信息 r t \ r_t rt被变换为 y t \ y_t yt,运动信息 v t \ v_t vt可以变换为 m t \ m_t mt, r ^ t \ \hat{r}_t r^t 和 m ^ t \ \hat{m}_t m^t 分别是对应的量化版本。
3.1. Brief Introduction of Video Compression
在本节中,简要介绍视频压缩。在[39,31]中提供了更多详细信息。通常,视频压缩编码器基于输入的当前帧生成比特流。并且解码器基于接收到的比特流来重构视频帧。在图2中,所有模块都包括在编码器侧,而蓝色模块不包括在解码器侧。
图2(a)中经典的视频压缩框架遵循预测转换架构。具体地说,输入帧 x t \ x_t xt被分成相同大小(例如8×8)的一组块,即正方形区域。编码器端传统视频压缩算法的编码过程如下:
-
Step 1. Motion estimation. (运动估计)
估计当前帧 x t \ x_t xt和前一重构帧 x ^ t \ \hat{x}_t x^t之间的运动,得到每个块对应的运动矢量 v t \ v_t vt。 -
Step 2. Motion compensation. (运动补偿)
基于Step 1中定义的运动矢量 v t \ v_t vt,通过将前一重构帧中的对应像素复制到当前帧来获得预测帧 x ˉ t \ \bar{x}_t xˉt。原始帧 x t \ x_t xt与预测帧 x ˉ t \ \bar{x}_t xˉt之间的残差为 r t \ r_t rt= x t \ x_t xt− x ˉ t \ \bar{x}_t xˉt。 -
Step 3. Transform and quantization. (变换与量化)
来自Step 2的残差 r t \ r_t rt被量化为 y ^ t \ \hat{y}_t y^t。在量化之前使用线性变换(例如,DCT),以获得更好的压缩性能。 -
Step 4. Inverse transform. (反变换)
Step 3中的量化结果 y ^ t \ \hat{y}_t y^t通过逆变换得到重构残差 r ^ t \ \hat{r}_t r^t。 -
Step 5. Entropy coding. (熵编码)
Step 1中的运动矢量 v t \ v_t vt和Step 3中的量化结果 y ^ t \ \hat{y}_t y^t都通过熵编码方法编码成比特(bits),并发送到解码器。 -
Step 6. Frame reconstruction. (帧重构)
Step 2中的预测帧 x ˉ t \ \bar{x}_t xˉt和Step 4中的重构残差 r ^ t \ \hat{r}_t r^t相加来获得重构帧 x ^ t \ \hat{x}_t x^t。重构帧将被第 ( t + 1 ) \ (t+1) (t+1)帧用于Step 1中的运动估计。
对于解码器,基于在Step 5中由编码器提供的比特,在Step 2执行运动补偿,在Step 4执行反量化,然后在Step 6执行帧重构以获得重构帧 x ^ t \ \hat{x}_t x^t。
3.2. Overview of the Proposed Method
图2(b)提供了端到端视频压缩框架的概述。传统的视频压缩框架与本文提出的基于深度学习的框架之间存在一一对应关系。两者之间的关系及差异简要如下:
-
Step N1. Motion estimation and compression. (运动估计与压缩)
使用CNN模型来估计光流[27],它被认为是运动信息 v t \ v_t vt。图3中提出了一个MV编解码器网络来压缩和解码光流值,而不是直接编码原始光流值。通过运动编码器网络编码得到 m t \ m_t mt,量化后的运动信息表示为 m ^ t \ \hat{m}_t m^t,运动信息 v t \ v_t vt经过MV解码器网络解码得到重构运动信息 v ^ t \ \hat{v}_t v^t。详见第3.3节。 -
Step N2. Motion compensation. (运动补偿)
基于Step N1中获得的光流,通过运动补偿网络来获得预测帧 x ˉ t \ \bar{x}_t xˉt。详见第3.4节。 -
Step N3-N4. Transform, quantization and inverse transform. (变换、量化与反变换)
使用高度非线性的残差编解码网络替换了Step 3中的线性变换,并通过残差编码网络将残差 r t \ r_t rt非线性映射到 y t \ y_t yt上。 然后将 y t \ y_t yt量化为 y ^ t \ \hat{y}_t y^t。为了建立端到端的训练方案,采用了文献[11]中的量化方法。然后 y ^ t \ \hat{y}_t y^t经过残差解码网络得到重构残差 r ^ t \ \hat{r}_t r^t。详见第3.5和3.6节。 -
Step N5. Entropy coding. (熵编码)
在测试阶段,将来自Step N1的量化运动信息 m ^ t \ \hat{m}_t m^t和来自Step N3的残差表示 y ^ t \ \hat{y}_t y^t编码为比特,然后发送到解码器。
在训练阶段,为了估算比特数成本,使用CNNs(图2中的比特率估算网络)来获得 m ^ t \ \hat{m}_t m^t和 y ^ t \ \hat{y}_t y^t中每个符号的概率分布。详见第3.6节。 -
Step N6. Frame reconstruction. (帧重构)
和3.1中的Step 6一样。Step N2中的预测帧 x ˉ t \ \bar{x}_t xˉt和Step N4中的重构残差 r ^ t \ \hat{r}_t r^t相加来获得重构帧 x ^ t \ \hat{x}_t x^t。重构帧将被第 ( t + 1 ) \ (t+1) (t+1)帧用于Step N1中的运动估计。
3.3. MV Encoder and Decoder Network
为了在Step N1压缩运动信息,设计了一个CNN将光流转换为相应的表示形式,以获得更好的编码效果。 具体来说,利用自动编码器样式的网络来压缩光流,这是[11]首次提出的用于图像压缩的任务。整个MV压缩网络如图3所示。光流
v
t
\ v_t
vt进过一系列的卷积运算和非线性变换。除最后一个反卷积层等于2之外,用于卷积(反卷积)的输出通道数为128。给定光流
v
t
\ v_t
vt的大小为M×N×2,MV编码器将生成大小为M/16×N/16×128的运动表示
m
t
\ m_t
mt,然后
m
t
\ m_t
mt被量化为
m
^
t
\ \hat{m}_t
m^t。MV解码器接收量化表示
m
^
t
\ \hat{m}_t
m^t并重构运动信息得到
v
^
t
\ \hat{v}_t
v^t。此外,量化表示
m
^
t
\ \hat{m}_t
m^t还将用于熵编码。