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

tech2022-08-16  128

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)用运动向量来捕获运动而不是独立的编码最后的结果。这个技术能够实现有效的压缩,因为运动向量比起完整的图片来说需要更少的信息。运动补偿典型的包括两步:第一,对于宏块中的每一个区域,编码器决定最优的运动向量,通过搜索其他的帧来获得最优匹配参考区域,这个过程叫做运动估计。然后编码器从最佳匹配参考区域减去当前区域,产生残差。残差数据一样的经过变换,量化和游程编码跟帧内编码一样。这些残差数据会有更多的小的系数值相比于帧内编码。结果就是,帧间编码比帧内编码能更好的节省码率。

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会降低,失真会增加。

拉格朗日优化

之前的描述给编码器设计提出了很大的挑战。直觉上,编码器应该做出最优的模式决策在给定的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 ) J(S,I) = D(S,I) + \lambda R(S,I) J(S,I)=D(S,I)+λR(S,I) 最小,这里的D(S,I)是失真,R(S,I)是码率, λ \lambda λ 是拉格朗日乘数,这个乘数说明了码率限制。

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,表示小的量化。结果是高码率和低损失,这时的目标是小损失而不管码率。小 λ \lambda_{} λ 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

最新回复(0)