H264编码器的一种率失真优化(1)

H264编码器的一种率失真优化(1)

1 介绍和背景

数字视频压缩给学术和工业提出了很多挑战性的问题。在学术中,数字视频压缩给出了压缩理论的最终实践。视频数据来源于大量的原始数据,但是很多对于人类视觉系统来说是冗余的和不相关的。视频压缩致力于删除这部分数据。在工业应用中,消费者在非常多的地方需要数字视频:电视,电影,电话和网络。各大公司的对于这些做了最大的努力。但是数字视频使用中,收到很多的资源限制,包括带宽,处理速度,内存大小和功耗限制。例如手机在这些方面都有限制。
在这些限制当中,当给出固定的受限资源时,如何获得最高质量的视频?这个理论描述了一种可能的方法通过使用率失真理论来优化H264编码过程中的模式选择。
第一部分提供了背景介绍和率失真理论,也介绍了一些前人的成果。第二部分描述了这个理论当中特定的问题。第三部分使用相应的参数建模,这些参数是:码率,失真和 λ \lambda λ(拉格朗日乘子). 第四部分提供了基于模型的最终解决方案。

1.1 成果回顾

当在保持最小损失的情形下获得最高的质量的理论叫做率失真理论(rate-distortion theory). 这个词汇来自于关于这个问题的香农第一准则。在这个问题中他提出了当以规定的速率通过噪声信道传输离散符号时获得的失真的期望。他给出了在码率小于信道容量时,失真可以达到任意小的值(或者没有失真)但是当码率大于信道容量时,失真是不能被消除的。
因为香农的通信理论是在50年前提出的,现在的技术实践发现在高码率和高信道容量之间具有竞争关系。当前可以满足现在大多数应用的视频通信的视频规格,如果是原始数据并且不带有音频的话,需要至少6Mbit/s的速率才能在另一端精确的重建。很少的存储介质,非常少的传输信道能够处理这样的大数据量。
因为这些资源限制,需要压缩视频来减少它的码率。许多应用领域,比如通过网络传输文件需要无损压缩,这样的情形使用经典的Lemple-Ziv 算法。这些无损压缩算法使用了数据源的统计特性来减小码率。例如,给出现概率高的符号赋予短的的bit长度,出现概率低的符号赋予长的bit长度。不幸的是无损压缩技术不能有效的压缩原始数据视频。
更多的,无损压缩,它每一个bit都是可重建的,对于视频来说他是不需要的。人类的视觉系统
不能捕获有些信息。这些信息是无关紧要的,并且是可以在压缩的时候在不损失视频质量的前提下删除的。同样的,特定的可见属性对于人类视觉系统来说比其他的部分更重要。最重要的布冯要精确的呈现,通常是分配更多的bit给他们,同时给不重要的部分给与少的bit。一个简单的例子,考虑一个在视频序列中带有尖锐边缘的对象。当对象是固定的,任何由失真导致的模糊的边缘是可见的和不允许出现的。当物体快速移动,模糊的边缘在感觉上是实际存在的。视频压缩算法要充分利用这个现象,通过分配少的bit给边缘,当出现快速移动的序列时。

1.2 codec

视频包含大量的可压缩信息。视频应用的商业需求导致了开发了很多压缩标准,被叫做codecs。两个重要的codecs组件出现了,它们是来源于Motion Picture Experts Group(MPEG)MPEG-x系列和H.26x系列来源于International Telecommunications Union(ITU-T). 它们中的很多已经在商业重广泛的运用,比如MPEG-2 用在高清电视,H263用于视频会议。
每一个连续的下一代codecs会实现更高级的压缩技术。MPEG和ITU-T一起开发了下一代codec,叫做H.264 也叫作MPEG-4 version 10. H.264的完整说明超级复杂,但是一个好的概览可以在这里找到。
所有的codecs说明朝向一个统一的目标:提供一个可以通用可解码的bit流语法。
在这里插入图片描述
bit流实际上只代表了完整视频压缩系统的一部分。标准说明只定义了视频流这个范畴,并没有对编码器和解码器的实际进行说明。一个编码器在压缩一个视频序列的时候失败了,但是仍然能够产生兼容标准的视频流。
结果就是,工程师在设计H264编码器的时候有很大的弹性。编码器的设计严重依赖它的应用目标。有些应用需要高视频质量,例如HDTV. 其他的需要实时性编码,例如电话会议。其他的一些应用必须处理不可靠的信道,例如网络视频流。另外,给定视频的内容在不断变化。编码器必须动态的决定如何能最好的表现静态图像,场景变化,和物体移动。要完成这个要求,编码器必须平衡最小码率和最小失真的竞争。
一版情况下,虽然大部分编码器都共享一个相似的结构。如下图
在这里插入图片描述
第一步,将视频帧分成叫做宏块的小区域。编码器以两种方式编码宏块:没有移动补偿(帧内编码),带有移动补偿(帧间编码). intra-coded宏块只依赖于当前的视频帧而不依赖于其他的帧。它们首先由原始RGB数据转化为YIQ数据格式,Y是亮度分量,IQ是色度分量。YIQ比RGB更适合用来压缩,因为色度分量可以用更少的采样率来采样而不损失视觉质量。
YIQ值会经过DCT变换或者小波变换处理。这些变换能够将宏块的能量集中在少量的前几个比较大的系数中。他们同时也会生成大量的小系数。这个特性有利于下一步的量化传输系数。量化负责压缩中的有损部分。这部分限制系数值到附近的量同时删除小系数。因为转换出的系数阵列中有大量的小系数,量化允许有效的减少bit rate。最后,量化后的系数会被编码进bit流中,以及保存在buffer中用来最后的输出。
INTER-coded (帧间编码)的宏块依赖于帧间的时间冗余来减小bit rate。在很多视频序列中,相邻的帧的不同之处只是因为物体的移动。运动补偿(Motion compensation)用运动向量来捕获运动而不是独立的编码最后的结果。这个技术能够实现有效的压缩,因为运动向量比起完整的图片来说需要更少的信息。运动补偿典型的包括两步:第一,对于宏块中的每一个区域,编码器决定最优的运动向量,通过搜索其他的帧来获得最优匹配参考区域,这个过程叫做运动估计。然后编码器从最佳匹配参考区域减去当前区域,产生残差。残差数据一样的经过变换,量化和游程编码跟帧内编码一样。这些残差数据会有更多的小的系数值相比于帧内编码。结果就是,帧间编码比帧内编码能更好的节省码率。

1.3 H264中的模式决策

现代的codecs例如H264有更多的模式而不仅仅是帧内编码和帧间编码。在这些模式中的选择过程叫做模式决策。在帧级别下,帧可以分成I帧(帧内编码),P帧(预测编码),B帧(双向预测编码)。I帧只包括帧内编码的宏块。P帧中的是帧间编码的宏块,这些宏块利用之前的帧作为参考帧来进行运动补偿。B帧也能够后边的帧作为参考帧。
在宏块级别,选择变的更多。H264中的宏块包括16x16亮度采样和8x8的色度分量采样。有两种帧内宏块模式存在:intra-4x4 和intra-16x16. H264中的帧内宏块于其他的帧是独立的。他们能在同一帧中利用邻接的宏块进行空间预测。空间预测可以降低bitrate,因为邻接的宏块经常是相似的。在16x16模式下,整个宏块从其他的宏块中预测得到。在4x4模式下,每个4x4块在一个宏块中用邻接的块预测得到。
四种帧间宏块模式:inter-16x16, inter-16x8, inter-8x16和inter-8x8. 帧间编码的宏块都带有运动向量。mxn标记代表运动向量所属的亮度采样分区大小。例如inter-8x8宏块有4个运动向量。实际上,8x8分区能够继续划分为8x4,4x8,4x4模式,因此一个宏块最多能够有16个运动向量。
对于每一个帧间编码宏块,编码器必须决定什么运动向量能最精确的捕捉从一帧到另一帧的运动。运动向量有四分之一的精度,表示物体运动能够以四分之一亮度像素的精度来描述。运动向量越精确,残差就越小。快速运动估计技术例如log search 能够简化决策精确运动向量的计算。
最后, 所有的模式,无论是INTRA 或者INTER, 依赖于量化参数QP, QP决定了压缩是丢失信息的多少。在H264中,QP 有52个值。它对应的量化步长公式如下:
Q = 2 ( Q P − 4 ) / 6 Q = 2^{(QP-4)/6} Q=2(QP4)/6
当QP增加时, bitrate会降低,失真会增加。

1.4 拉格朗日优化

之前的描述给编码器设计提出了很大的挑战。直觉上,编码器应该做出最优的模式决策在给定的bitrate限制之下最小化失真。这个问题可以用以下的方式公式化。
考虑一个源采样向量S, 模式向量I, 其中 I k I_{k} Ik对应于给 S k S_{k} Sk选择的模式。设 D ( S , I ) D(S,I) D(S,I)是失真, R ( S , I ) R(S,I) R(S,I)是bitrate。 目标是,找到合适的 I I I使得 D ( S , I ) D(S,I) D(S,I)最小,同时满足 R ( S , I ) < = R c R(S,I) <= R_{c} R(S,I)<=Rc
使用之前的规则,模式选择的任务就转变为典型的受限的最优化问题。本科微积分中拉格朗日乘数法可以应用在这个问题上。然而,拉格朗日乘数法只适用于微分方程,$D(S,I) 和 和 R(S,I)$显然不是。幸运的是,Everett已经证明,对于最大最小优化,微分和连续不是必要的。结果是,这个问题可以描述为找到I 使得拉格朗日损失函数
J ( S , I ) = D ( S , I ) + λ R ( S , I ) J(S,I) = D(S,I) + \lambda R(S,I) J(S,I)=D(S,I)+λR(S,I)
最小,拉个朗日乘数 λ \lambda λ表示bitrate限制,如下边的率失真曲线。
在这里插入图片描述
理论上,编码器可以尝试每一个可能I 来找到最小的 J ( S , I ) J(S,I) J(S,I). 然而,这个方法需要测试 K N K^{N} KN不同的I, 这里的K是源采样的数目,N是可选模式的数量。通常情况下源采样S是由宏块构成,这是计算上不可接受的。因此,基于独立性假设的分治处理方式描述如下:
J ( S , I ) = ∑ K = 1 K J ( S k , I K ) J(S,I) = \sum_{K=1}^{K}J(S_{k}, I_{K}) J(S,I)=K=1KJ(Sk,IK)
独立性假设不是完全符合实际的。宏块明显的依赖其他的宏块,无论通过帧内空间预测或者帧间的空间预测。将依赖性考虑进来的理论也是存在的,但是对于这里的独立性假设理论,它对最终解决问题来说影响很小。
最后的模式选择的公式如下,对于每一个源采样选择一种模式I使得
J ( S , I ) = D ( S , I ) + λ R ( S , I ) ( 1.2 ) J(S,I) = D(S,I) + \lambda R(S,I) \quad{(1.2)} J(S,I)=D(S,I)+λR(S,I)(1.2)
最小,这里的D(S,I)是失真,R(S,I)是码率, λ \lambda λ 是拉格朗日乘数,这个乘数说明了码率限制。

1.5 H.264 中的实际考虑

当认为宏块是独立时,可能模式的组合仍然很大。没有一个编码器能够尝试每一量化参数,每一个运动向量和每一种帧内和帧间预测选项。需要一种轻复杂的过程,次优化的方法。ITU-T H.264参考软件编码器提供了一种这样的过程。
参考编码器以一种迭代的方式实现拉格朗日优化。首先,设量化参数QP,通常是基于之前帧获得的。接下来寻找宏块S的最优的运动向量m使得最小化代价函数
J M O T I O N ( S , m ) = D D F D ( S , m ) + λ M O T I O N R M O T I O N ( S , m ) J_{MOTION}(S,m) = D_{DFD}(S,m) + \lambda_{MOTION}R_{MOTION}(S,m) JMOTION(S,m)=DDFD(S,m)+λMOTIONRMOTION(S,m)
对于每一种帧间模式(DFD 表示帧损失) 。最后计算代价函数
J M O D E ( S , I ) = D R E C ( S , I ) + λ M O D E R R E C ( S , I ) J_{MODE}(S,I) = D_{REC}(S,I) + \lambda_{MODE}R_{REC}(S,I) JMODE(S,I)=DREC(S,I)+λMODERREC(S,I)
在所有的帧内和帧间模式中决定最优的模式I.
第一眼看上去,这个H264参考软件算法中有三个独立的参数:QP, λ M O D E \lambda_{MODE} λMODE λ M O T I O N \lambda_{MOTION} λMOTION, 然而, H264参考软件中使用下边的经验关系:
λ M O D E = 0.85 ⋅ 2 Q P − 12 ) / 3 \lambda_{MODE} = 0.85 \cdot 2^{QP-12)/3} λMODE=0.852QP12)/3
λ M O T I O N = λ M O D E \lambda_{MOTION} = \sqrt{\lambda_{MODE}} λMOTION=λMODE
这个关系给出一个直觉上的判断,一个固定的量化参数QP严重的影响 λ M O D E 和 λ M O T I O N \lambda_{MODE}和\lambda_{MOTION} λMODEλMOTION的取值。例如,考虑一个小QP,表示小的量化。结果是高码率和低损失,这时的目标是小损失而不管码率。小 λ M O D E \lambda_{MODE} λMODE会使得损失的比重偏大。
SAD( sum of absolute Difference)
SSD(sum of squared difference)
λ M O D E \lambda_{MODE} λMODE开根号获得 λ M O T I O N \lambda_{MOTION} λMOTION
给出 λ M O T I O N \lambda_{MOTION} λMOTION的平方根,是因为H264参考软件使用SAD作为运动估计(motion estimation)的损失度量,使用SSD作为模式决策。结果就是, 唯一独立的变量就只有QP, 他可能是个实验获得的固定的值,或者是通过码率控制算法估计的码率Rc. 3.3节解释了公式1.3的推到过程。

问题开始

精确的计算码率和损失需要对每一种模式下的每一个源采样进行编码和解码。不幸的是,大多数编码器不能对每种模式实现图1-2中的所有操作,因为这需要太多的计算资源。只有一个子集是可能的。结果就是,码率和损失必须从有限的信息中估计得到。这一章描述什么样的信息是可用的。

2.1 编码器描述

这个理论中的H264编码器受限于计算资源的可用性,计算资源的可用性反过来又会影响编码器的架构设置和模式决策过程。这样的编码器是嵌入式系统,尤其是手机芯片组的一部分。像大多数芯片组一样,使用专用芯片处理特定的任务要比使用通用微处理器要更加经济。结果是,编码器单元分成三个部分:一个数字信号处理器核心,视频加速硬件和一个ARM主控核心。DSP芯片是视频编码器中最灵活和最容易编程的组件。它主要作为一个控制单元来告诉硬件何时开始运行。专用硬件实现计算集中和大量重复的任务,例如变换和运动估计。ARM核心完成最后的run-length 编码。这样的设计使得编码器可以以15frame 每秒的速度压缩288 *352大小的尺寸,虽然这个过程需要执行至少20000条软件指令。
因为编码器的架构,模式决策处理过程集中于硬件处理单元中。编码器只支持下面的这几种模式:INTRA-4x4, INTRA-16x16, INTER-16x16 和INTER-8x8. 对于INTER-16x16和INTER-8x8模式,硬件查找之前的帧寻找最佳匹配的运动向量。一旦找到运动向量,硬件使用下边的伪代码选择INTER-16x16或者INTER-8x8:

if (SAD(INTER-16*16)) < SAD(INTER-8*8) + threshold)
	choose INTER-16 * 16;
else
	choose INTER-8 * 8;

SAD表示绝对值误差之和。它是所有残差数据的绝对值之和,残差是用当前运动补偿宏块减去参考宏块获得。直觉是绝对误差和越小越好。小SAD表示小的残差,意味着他们可以被量化为0,进而或者更低的码率。
只基于SAD的选择,有时会导致错误的结果。INTER-8x8 SAD永远不会比INTER16x16 SAD好。INTER-8x8模式用每个子宏块的四个运动向量而不是INTER16x16的一个运动向量。这种方式在运动估计的时候可以获得更大的准确性,因为每个8x8的块都是独立对待的。最坏的情况下,四个运动向量跟一个运动向量会产生大致相同的SAD,这个时候四个块组成一个方格块整体预测。如下图:
在这里插入图片描述
这时,INTER8x8会有额外的开销不会被SAD捕捉到,它需要编码4个而不是1个运动向量,这时会增加码率和额外的开销。threshold估计选择INTER8x8相对于INTER16x16的额外开销。
这个理论给出了如何选择正确的门限来增加编码器的率失真效果。最初这个门限值是固定的,典型值是200. 为了增加这个门限值,在每一级编码过程,需要描述SAD和其他的可用的信息,尤其是QP.

最初的实验结果

作为最初的试验,四个视频序列分别重复独立编码。对于每一个视频序列,门限值在一组数值中变化,其他的变量保持不变。这个过程用不同的QP值重复进行。用等式1.2,计算拉格朗日率失真。所有帧间编码帧的bit总数作为rate。原图像和压缩帧间frame的SSD作为失真。等式1.3用作 λ M O D E \lambda_{MODE} λMODE。 图2-2 展示了一个编码foreman的例子,门限和QP=15时的关系图。

在这里插入图片描述
其他的序列和QPs 生成了与图2-2相似的曲线图。对于小的门限,率失真较高,因为只有INTER-8x8模式被选择,这样就增大了码率。当门限升高时,率失真下降,之后升高。是因为较多的INTER-16x16模式增大了误差。

对于每一个QP, 门限的选择决定了拉格朗日率失真的大小。结果在图2-3的理想曲线中表示。当QP升高时,最优的门限值增加。直觉上,当由QP造成的误差升高时,拉格朗日率失真规则将更大的权重放在码率上。实际上,当最高的QP使得视频序列无法看时,误差很大程度上是常数,所以只有码率起决定作用,这样的话INTER-16x16模式是逻辑上选择。低QP时,码率通常是高的,损失的有更大的影响。
从图2-3中得到,最优门限和QP的关系是指数型关系。图2-4 y轴使用对数表示,对于每一个视频序列,数据符合线性回归。
在这里插入图片描述
在这里插入图片描述
从图中看出,曲线的斜率和截距是高度内容相关的,但是仍然遵循指数关系。
为了解释图2-4, 这个理论建立一个理论框架来说明SAD对拉格朗日率失真的影响。SAD影响率失真函数中的码率和误差,因此首次按单独分析它们,然后再组合起来分析。

损失等式参数模型

等式1.2 包含了三个组件,rate® 码率,distortion(D)失真,和拉个朗日乘数( λ \lambda λ)。每一个组件在本章都会被建模。

Rate

SAD和码率的关系是首先需要测定。码率从直觉是SAD的函数,因为小的SAD意味着残差中会有更多的数据会通过量化来删除掉。编码器计算残差在运动补偿之后计算残差SAD. 然后它变换残差值,用QP量化残差系数,执行游程编码。每一步都会影响最后的码率,这些都会在这里建模。

Distortion

Lambda

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值