作者:王洋、许继征
什么是量化
在数字信号处理领域,量化是指将信号的连续取值近似为有限多个离散值的过程,或者将大量可能的离散取值近似为少量的离散值的过程。量化通常可以分为标量量化和矢量量化。标量量化是将图像或视频中样本点的取值范围划分成若干个区间,每个区间仅用一个数值(标量)表示其中所有可能的取值。每个样本点的量化取值是一个标量,并且独立于其他样本点的量化取值。矢量量化是将 n 个样本点作为一个 n 维矢量,将 n 维矢量的取值空间划分为若干个子空间,每个子空间用一个 n 维矢量来表示该子空间所有的取值。由于矢量量化利用了多个样本点之间的相关性,一般来说,相比于标量量化,矢量量化的压缩效率更高,同时计算复杂度也更高。
具体到视频编码领域,一般情况下,使用变换技术来去除预测后的残差信号中的空间冗余,使能量集中在低频区域,体现为低频区域的变换系数较大,高频区域的变换系数较小,此时使用量化技术对变换系数进行量化,将较大的变换系数的取值范围映射到较小的量化系数的取值范围,同时利用人眼对高频信息不敏感的特性,将高频区域的变换系数量化为零值,从而达到提高压缩性能的目的。对于某些特定视频信号(比如屏幕视频),残差信号有时不需要经过变换技术的处理,而是直接使用量化技术对残差信号进行处理。量化技术通常包括量化和反量化两个过程,量化过程把变换系数转换成量化系数,编码端需要决策出最优的量化系数,并对量化系数进行熵编码;反量化过程把熵解码之后得到的量化系数转换成变换系数,变换系数再经过反变换过程得到残差并用于编码块的重构过程。
H.266/VVC 中的量化技术
H.266/VVC 中的量化技术包括均匀标量量化 (Uniform Reconstruction Quantization, URQ)、符号位隐藏 (Sign Data Hiding, SDH)、网格编码量化 (Trellis-coded Quantization, TCQ)[1]。其中 URQ 属于标量量化,而 SDH 和 TCQ 是一种多系数联合量化。URQ 和 SDH 是 HEVC 中已经存在的技术,在 H.266/VVC 中没有进行大的改变。TCQ 是 H.266/VVC 中新引进的量化技术,也称为依赖性量化 (Dependent Quantization, DQ)。
均匀标量量化 (URQ)
URQ 的反量化过程
在均匀标量量化中,量化系数的重构值是由一个单独的参数(量化步长)决定的,即 ,其中 表示量化系数的重构值, 表示量化系数(整数),表
示量化系数的索引。和 HEVC 一样,H.266/VVC 也支持量化矩阵,通过调整不同块的量化权重提高视频的主观质量,即 , 表示量化权重系数,量化矩阵在 H.266/VVC 中也称为 Scaling list。表示量化参数(Quantization parameter, QP),用整数表示。和 QP 之间是指数关系,如下所示:
其中, 表示样本点的位深 (Bit depth),反量化获取量化系数的重构值的过程可以用如下公式表示:
为了降低计算复杂度和避免重构误差,H.266/VVC 的反量化过程全部采用整数运算。在H.266/VVC 中,一个块大小为 的反变换过程增加了一个 的缩放因子,因此这个缩放过程也需要体现在反量化过程,加上缩放过程后的反量化公式如下所示:
设 ,,,,和分别表示向下取整和向上取整, 表示取模运算,因为变换块的宽 (W) 和高 (H) 都是 2 的次幂,所以 ,反量化过程可以用如下公式表示:
为了实现整数运算,圆括号内的两项可以近似为整数, 的乘法可以用移位操作来实现,修改后的公式如下所示:
其中, 和 表示按位左移和按位右移,,用 的二维数组 表示 的整数近似值:, 称为Scaling list,也就是量化矩阵。如果 Scaling list 不使用, 的默认值为 16,这时 。
在变换跳过模式 (transform skip) 中,不需要进行反变换,所以反量化没有额外的缩放过程,同时Scaling list 也不能应用于变换跳过模式,这时 因此对于变换跳过模式的反量化过程可以简化为如下所示:
此外,H.266/VVC 中的 Palette 模式也是用 URQ 进行量化,Palette 模式的反量化过程和上述变换跳过模式相同,Palette 模式中只有 Escape value 需要进行量化。
URQ 的量化过程
量化死区 (Quantization dead-zone)
如上所述,一般的 URQ 的反量化过程可以简单的表示为:,那么对应的量化过程为:,其中 表示正负号函数。这种量化器是向下取整,会把区间的变换系数量化成 0,量化后为 0 的区域称为量化死区(dead-zone)[2]。残差变换系数在帧间编码比帧内编码分布得更为集中,因此引入参数量化偏移量 ,引入参数 后量化公式为:
当 变大时,量化死区减小;当 变小时,量化死区增大。量化死区大小可以直接影响到视频的主观质量。经过变换后,视频中高频部分的数值通常较小,离 0 值较近。如果死区比较大,0 值附近的值会被量化为 0,则视频会损失这些细节。一般情况下,帧内预测时 ,帧间预测时 。
率失真优化量化 (Rate-distortion optimized quantization,RDOQ)
在编码端,一般利用率失真优化技术来选择最优的编码参数(如块划分结构、预测模式等),将率失真优化技术应用在量化阶段(即率失真优化量化)来获取最优的量化系数[3]。率失真优化量化可以分为3个步骤:变换系数的量化、系数组(Coefficient group, CG)的消除、第一个非零量化系数(解码顺序)的决策。
- 在对变换系数进行量化时,首先使用均匀量化器获取每个变换系数的量化系数,需要比较每个量化系数以及微调后的率失真代价,此时需要考虑每个量化系数的当前值、和当前值减1情况(当前量化系数 0 和 2 除外:当前值为 0,只考虑 0;当前值为 2,考虑 2,1,0),根据不同量化候选值计算率失真代价的大小,为当前位置的系数选择该步骤的量化结果。
- 在系数组消除的步骤中,编码器计算将整个系数组中的量化系数全部置为 0 时的率失真代价,和第一步中最优的量化结果进行比较,如果此时的率失真代价是最小的,那么该系数组内的全部量化系数置 0。通过仅编码全零系数组标识位而不需要编码系数组的量化系数可以带来可观的码率节省,同时也会带来一定的失真。
- 在最后一步中,已经遍历完变换块内的所有系数组,需要考虑第一个非零量化系数(解码顺序)的位置,通过计算不同位置的率失真代价,选择最优的第一个非零量化系数的位置。
符号位隐藏 (SDH)
H.266/VVC 中的符号位隐藏技术和 HEVC 相比没有变化,SDH 的基本思想是通过在解码端推导出一个系数组的最后一个非零量化系数(解码顺序)的符号,而不用编码这个非零量化系数的符号,从而达到提高压缩效率的目的。和标量量化在相同量化步长的条件下相比,使用 SDH 技术对于每个系数组能够节省一个比特。
SDH 的解码技术
从解码端的角度来看,一组连续的量化系数组成一个系数组(CG),如果 CG 的最后一个非零系数和第一个非零系数的扫描索引的差值大于3,这个 CG 的最后一个非零系数的符号位就不需要解码,而是通过判断所有量化系数的绝对值之和的奇偶性来导出:如果量化系数的绝对值之和为奇数,最后一个非零系数的符号位为负,否则为正。
SDH 的编码技术
从编码端的角度来看,如果一个 CG 内所有量化系数绝对值之和的奇偶性恰好满足 SDH 的条件,那么编码端不再需要额外的操作就可以节省用来传输最后一个非零系数符号的一个比特。如果这个 CG 内的所有量化系数绝对值之和的奇偶性不能满足 SDH 的条件,编码端需要改变某个量化系数的值来满足这个条件。
文献[4] 提出了 SDH 和 RDOQ 联合优化时的编码优化算法,当 RDOQ 确定了一个 CG 内解码顺序的第一个非零系数和最后一个非零系数之后,如果这两个非零系数的扫描索引的距离不大于3或者已经满足 SDH 的条件(CG 内所有量化系数的绝对值之和的奇偶性和最后一个非零系数的符号位满足SDH的条件),编码端只需要跳过 SDH 的编码优化步骤即可;否则需要对 CG 内的系数进行微调,使其能够满足 SDH 的条件。微调时需要考虑第一个非零系数到最后一个非零系数之间的全部量化系数加 1 或者减 1 时的率失真代价,选取率失真代价最小的调整作为最优的量化系数。需要考虑以下几种特殊情况:
a) 最后一个非零系数不能调整为 0;
b) 如果第一个非零系数被调整为 0,新的第一个非零系数和最后一个非零系数之间的距离仍然要大于 3;
c) 第一个非零系数到最后一个非零系数之间为 0 的量化系数也可以进行调整,如果它的源信号为正,量化系数可以加 1;如果它的源信号为负,量化系数可以减 1;
d) 量化系数等于 1 时,既可以做加 1 的调整也可以做减 1 的调整;
e) 调整后的量化系数不能超过熵编码时的量化系数取值的最大值或最小值。
文献[5] 提出了当编码端不使用 RDOQ 时的 SDH 编码优化算法,计算一个 CG 内每个量化系数的原始值(变换系数)和它的量化值之间的差,为了降低编码复杂度,只考虑调整最大差值的量化系数,如果这个差值为正数,将量化系数加 1;如果这个差值为负数,将量化系数减 1。这样的调整能够保证,将量化系数绝对值之和的奇偶性的调整对编码性能的影响降到最小。
网格编码量化 (TCQ)
TCQ 的基本概念
TCQ 的概念最早见于文献[6],网格编码量化借鉴于网格编码调制 (Trellis-coded Modulation, TCM)。TCQ 通过对信号空间的扩展,提高了量化器的均方误差性能,因而能够以适当的计算复杂度获得比较好的量化性能,是一种对无记忆信源及高斯-马尔科夫(Gauss-Markov)信源比较高效的量化方法。
TCQ 包含若干个标量量化器,在大部分情况下,标量量化器的重构值是量化步长的整数倍。如图 1 所示,TCQ 包含两个标量量化器 和 ,其中能够表示量化步长的所有偶数倍的重构值, 能够表示量化步长的所有奇数倍的重构值。此外,两个量化器都包含了零倍量化步长(即重构值等于0)的情况,这样的设计能够提高低码率场景下的编码性能。两个量化器的取值分别用量化索引来表示,如在 量化器中,量化索引等于3表示的重构值为 ;在 量化器中,量化索引等于 -2 表示的重构值为 。
图1. TCQ 中两个标量量化器的示意图[7]
在标量量化中,只需要通过量化索引就能够得到一个量化系数的重构值,但是在 TCQ 中存在两个标量量化器,除了量化索引外,还需要知道该量化系数是使用哪个量化器(或者)得到的。在 TCQ 中,标量量化器的选择是通过状态机中的状态转移确定的,假设状态机有 个状态,其中每个状态分配一个量化器(或者多个状态分配一个量化器),当前状态由前一个状态和前一个量化索引共同确定。在视频编码领域,大部分变换块仅包含少量的非零变换系数,因此 H.266/VVC 中采用了最简单的 4 个状态()的状态机来表示两个标量量化器之间的转换过程,这样的设计能够保证尽可能低的编码复杂度。
图2. 用于两个量化器选择的状态转移过程[8]
如图2所示,状态 0 和状态 1 时使用量化器 ,状态2和状态3时使用量化器 。状态机中的状态转移是按照系数扫描顺序进行的,因此采用 TCQ 时,一个编码块中的系数必须按照一定的扫描顺序进行处理,这个扫描顺序可以用索引值 来表示。状态机的初始状态 设置为 0,给定当前状态 以及当前量化索引 ,那么下一个状态 由当前状态 和当前量化索引 唯一决定(图 2 中由 的奇偶性 决定)。对于一个变换系数 ,当其对应的状态 等于 0 或者 1 时,使用量化器 对 进行量化;当其对应的状态 等于 2 或者 3 时,使用量化器 对 进行量化。这样状态转移的过程能够隐式地将每个量化器的量化索引划分为两个子集:一个子集由量化索引为偶数组成(如 中的 )和另一个子集由量化索引为奇数组成( 中的 )。
TCQ 的解码过程
和标量量化不同,当采用 TCQ 时,由于量化器的选择依赖于前一个状态和前一个量化系数的奇偶性,因此一个块内的量化系数只能串行地进行重构。给定一个块的 N 个量化索引 ,其中 表示编码顺序或解码顺序,对应的重构后的反变换系数 可以通过如下算法得到:
其中 表示正负号函数, 表示量化步长,2 维数组 stateTransTable 表示状态转移表(如图3所示),操作符>>表示右移操作,所以 表示使用量化器 或 ,操作符 & 表示位与操作,所以 & 1 表示量化索引 的奇偶值 。
图3. 状态转移表[8]
假设一个块中包含 5 个量化索引分别为 {3, 2, 4, 0, -1},量化步长为 ,根据以上 TCQ 的解码过程,量化系数的重构值分别为 {, , , 0, },过程如下所示:
初始状态 等于 0,使用量化器 ,量化索引 重构后为 , 等于 1,所以下一个状态 等于 2;
状态 等于 2,使用量化器 ,量化索引 重构后为 , 等于 0,所以下一个状态 等于 1;
状态 等于 1,使用量化器 ,量化索引 重构后为 , 等于 0,所以下一个状态 等于 2;
状态 等于 2,使用量化器 ,量化索引 重构后为0, 等于 0,所以下一个状态 等于 1;
状态 等于 1,使用量化器 ,量化索引 重构为 , 等于 1,所以下一个状态 等于 0;
该块内所有的量化索引已经完成重构,流程结束。
TCQ 的编码过程
从解码端的角度看,由于具有了唯一的量化索引序列,因此两个标量量化器的状态转移也是唯一的;从编码端的角度看,为了以适当的计算复杂度获取最大的压缩性能,需要决策出最优的量化索引序列。如图 4 所示,两个标量量化器 和 可能的转移状态可以用 个状态的网格来表示,这就是网格编码量化命名的由来。
图4. 编码端决策量化索引的网格结构[7]
和编码端其他模式决策类似,为了最大化编码性能,TCQ 也采用率失真优化来决策出最优的量化索引 来最小化率失真代价 ,其中 表示量化失真, 表示编码量化索引需要的比特数,拉格朗日乘子 通常依赖于量化步长 。一个块的失真可以用每个单独的变换系数的失真和来表示,一个单独的变换系数 的量化失真如下所示:
其中 表示原始的变换系数, 表示对应的量化索引, 表示 TCQ 的状态。
除了图 4 所示的网格中的 4 个状态,在 H.266/VVC 的编码器中,网格还包含一个“未编码”状态。这个“未编码”状态用来表示第一个非零量化索引前一个位置的量化索引等于 0 的情况。理想情况下,不考虑系数之间的熵编码依赖,可以用维特比 (Viterbi) 算法[9]得到该网格的最短路径,进而确定一组最佳的量化索引。但是由于熵编码时系数之间存在比较复杂的依赖性(如编码一个量化索引需要的比特数依赖于前面量化索引的值,这个比特数需要真正的编码才能得到准确值),所以使用维特比算法不能获得最优解。但是仍然可以采用估计的比特数,使用维特比算法在编码性能和计算复杂度之间获得比较好的平衡。
图5. 编码端带有“未编码”状态的决策量化索引的网格结构[8]
率失真的初始代价设置为 。网格中的变换系数是按照编码顺序处理的,网格的每一个阶段都用变换系数的扫描索引来表示 ,其中 表示变换系数的个数。 对于从扫描索引 到 的过程,网格中阶段 到阶段 的所有网格节点的全连接的率失真代价为 ,需要检查以下三种情况:“未编码”状态到“未编码”状态的转换;“未编码”状态到状态 0 或者状态 2 的转换;其他状态的转换。
其中 表示源节点的率失真代价,码率项 表示给定从开始节点到源节点的路径上的量化索引 时编码量化索引 所需要的比特数的估计值,码率项 表示 Coded block flag 从 0 变为 1 以及传输当前扫描顺序 作为第一个非零量化系数的位置 时需要的比特数。需要注意的是,“未编码”状态到状态 0 或者状态 2 的转换,只有当量化索引 时才会发生。这时,对于每个连接只需要检查能够得到最小化失真 的量化索引 。除了图 5 中所示的网格连接,H.266/VVC 的编码端还需要检查 Coded subblock flag = 0 的子块的连接,只有当目标阶段 是一个子块内最后一个扫描索引时才会出现这样需要考虑的连接。
当第 个阶段的所有节点的连接的率失真代价都估计完,对于每个目标节点,只保留最小的率失真代价 的连接。重复以上过程直到 ,这时可以得到网格中存活的 5 条路径。最后,具有最小率失真代价 的路径作为最终的路径,这个路径上的所有量化索引 就是最终要编码的一组量化索引。此外,文献[10]提出了一种低复杂度的网格搜索算法来降低 TCQ 的编码复杂度。
量化参数控制
如上文所述,H.266/VVC 支持 3 种量化技术:URQ、SDH、TCQ,这三种量化技术能够在编码效率和编码复杂度之间获得不同的折中,因此H.266/VVC 的编码器能够选择最适合应用场景的一种或多种量化技术。选择使用哪种量化技术是在 slice header 中标记的,需要注意的是 SDH 和 TCQ 的控制选项不能同时打开。不同的量化和反量化方法的使用条件如下表所示:
为了支持基于块的码率控制算法和感知优化的编码方法,量化参数 QP 可以基于块来调整,此时对应的块被称为量化组(Quantization groups,QG),QG 的大小由 picture header 中的语法元素决定。亮度分量的 QP 采用差分编码,也就是对于每个包含非零系数的 QG,编码实际使用的 QP 和预测的 QP 的差值;而对于色度分量的 QP,是利用其对应的亮度块的 QP,通过查表得到的。H.266/VVC 一共有三个查找表用来获取色度分量的 QP,一个用于 Cb 色度分量,一个用于 Cr 色度分量,一个是用于 Joint coding of chroma component residuals(JCCR)模式。为了支持更广范围的变换函数以及颜色格式,编码端可以自由的选择合适的查找表。这些查找表被定义为分段线性函数,在序列参数集中传输。H.266/VVC 能够支持的 QP 范围是从 到 63,其中 B 表示对应的颜色空间的位深。
H.266/VVC 中用 Scaling list 来表示量化矩阵。对于普通的变换编码模式,Scaling list 中的权重系数默认为 16;对于变换跳过模式,由于不存在反变换过程,所以它的量化过程不受 Scaling list 影响。H.266/VVC 包括 28 个 Scaling lists,每一个 Scaling list 定义了 2x2、4x4、8x8 的权重矩阵。Scaling list 可以在高层语法结构 Adaption parameter set(APS) 中传输,允许直接复用之前的 Scaling list 以及 Scaling list 每个权重系数的差分编码。Scaling list 的选择由变换块的颜色分量、预测模式、宽和高的最大值共同决定,对于大小不等于 2x2、4x4、8x8 的块,权重矩阵通过使用最近邻插值重采样得到。
参考文献
[1] H. Schwarz, M. Coban, M. Karczewicz, T.-D. Chuang, F. Bossen, A. Alshin, J. Lainema, C. R. Helmrich and T. Wiegand, "Quantization and Entropy Coding in the Versatile Video Coding (VVC) Standard," in IEEE Transactions on Circuits and Systems for Video Technology, doi: 10.1109/TCSVT.2021.3072202.
[2] G.J. Sullivan, "On embedded scalar quantization", IEEE International Conference on Acoustics, Speech, and Signal Processing, ICASSP 2004, vol.4, pp. 605-608, Montreal, Canada, May 2004.
[3] J.-R. Ohm, G.J. Sullivan, H. Schwarz, T.K. Tan; T. Wiegand, "Comparison of the Coding Efficiency of Video Coding Standards— Including High Efficiency Video Coding (HEVC)," IEEE Transactions on Circuits and Systems for Video Technology, vol. 22, no. 12, pp. 1669-1684, Dec. 2012.
[4] G. Clare, F. Henry, and J. Jung, Sign Data Hiding, JCTVC-G271, 7th Joint Collaborative Team on Video Coding (JCT-VC) Meeting, Geneva, Switzerland, Nov. 2011.
[5] X. Yu, J. Wang, D. He, G. Martin-Cocher, and S. Campbell, Multiple Sign Bits Hiding, JCTVC-H0481, 8th Joint Collaborative Team on Video Coding (JCT-VC) Meeting, San Jose, CA, Feb. 2012.
[6] M. W. Marcellin and T. R. Fischer, “Trellis coded quantization of memoryless and gauss-markov sources,” IEEE Transactions on Communications, vol. 38, no. 1, pp. 82–93, Jan. 1990.
[7] H. Schwarz, T. Nguyen, D. Marpe and T. Wiegand, "CE7: Transform Coefficient Coding and Dependent Quantization (Tests 7.1.2, 7.2.1)," JVET-K0071, 2018.
[8] H. Schwarz, T. Nguyen, D. Marpe, and T. Wiegand, “Hybrid video coding with trellis-coded quantization,” in 2019 Data Compression Conference (DCC), March 2019, pp. 182–191.
[9] G. D. Forney, Jr., “The Viterbi algorithm,” Proceedings of the IEEE, vol. 61, no. 3, pp.
268–278, Mar. 1973.
[10] M. Wang, S. Wang, J. Li, L. Zhang, Y. Wang, S. Ma and S. Kwong, "Low Complexity Trellis-Coded Quantization in Versatile Video Coding," in IEEE Transactions on Image Processing, vol. 30, pp. 2378-2393, 2021, doi: 10.1109/TIP.2021.3051460.