率失真优化与码率控制
率失真优化
基于率失真优化理论选择最佳的编码参数(如编码模式、预测模式、量化等参数)。
在给定码率\(R_c\)下,
\[min \quad D(B), \quad s.t. \ R(B) < R_c
\]
该约束性问题可以通过引入拉格朗日因子\(\lambda\),转化为非约束性问题:
\[min \quad J = D(B) + \lambda \ R(B)
\]
\(J\) 就是率失真代价 (RD Cost)。
在视频编码中,\(\lambda\) 的取值与量化参数有比较固定的函数关系。
率失真优化问题即为:在所有参数集中,选取使\(J\)最小的参数集。
最优化: https://www.cnblogs.com/xingshansi/p/6628785.html
码率控制
码率(速率)控制属于率失真优化的范畴,主要工作是建立编码码率与量化参数的关系模型,根据目标码率确定量化参数。
\[Q^* = (Q^*,\cdots,Q_N^*) = \underset{(Q,\cdots,Q_N)}{argmin} \sum_{i=1}^N D_i, s.t.\sum_{i=1}^N R_i \leq R_c
\]
率失真优化在编码器中不同层次(CTU级、CU级、PU级、TU级等)的运用
附:CTU可以划分成为CU、CU在预测的时候被划分成为PU、CU在变换量化的时候被划分成为TU
- 在CTU级的应用
在总比特数R受限的情况下选择一个CU(CU从8x8到64x64)的划分模式,使得一个CTU的总失真D最小 - 在CU级的应用
在总比特数R受限的情况下,适当的选择选择PU划分模式和TU(TU从4x4到32x32)划分模式,使得一个CU的总失真D最小 - 在PU级的应用
对于帧内预测,就是从35中帧内模式中选出最优的一种,使得PU的失真D最小;对于帧间预测,选出最优的运动模式(包括运动矢量、参考图像、预测权值等)使得PU的失真D最小 - 在TU级的应用
在最优的PU的模式下,选取最优的TU模式
HM实际的优化方式
- 对于CTU
- 遍历所有的CU划分模式,确定最优的CU划分模式
- 对于确定的CU,遍历所有的PU模式和TU模式的组合,确定最优的PU模式和TU模式
- 对于其中的每一个PU,遍历所有的预测模式,选取最优的预测模式
- 对于变换
采用Hadamard变换代替实际的DCT/SDT变换。 - 其他快速的策略
- 提前终止策略(Early_CU)
如果当前CU的最优编码模式是MODE_SKIP模式,那么终止该CU后续四叉树划分和模式判决 - 早期跳出模式(Early_Skip)
如果CU的PU划分模式是PART_2Nx2N,预测模式是MODE_INTER,运动矢量差MVD是(0,0),且预测残差不包含非零变换系数(就是变换系数全是0),就判定当前模式是最优模式,跳过剩余的模式,直接进行下一步的四叉树分割及子CU模式判决 - 快速CBF策略(CBF_Fast)
如果CU的预测模式是MODE_INTER,其对应的预测残差不包含非零的变换系数,就跳过该CU的其余候选模式,当前模式为最优模式,且直接进行下一步的四叉树分割 - 缩减AMP模式
依据两个参数来判断是否缩减当前AMP模式。具体是利用在进行AMP模式判决当前的最优分割模式,以及父亲节点CU内采用的分割模式和预测模式,来确定候选编码中可使用的AMP模式
- 提前终止策略(Early_CU)
率失真优化过程
根据目标码率,先确定量化参数QP,然后根据QP确定出拉格朗日参数λ!然后根据λ和一组编码参数计算失真
- 分层递归遍历所有的CU划分模式,选取最优的CU划分模式,这个过程称为CU划分模式判别
- 对于其中的每一个CU,遍历所有的PU模式,选取最优的PU模式,并在此基础上选择最优的TU模式
- 对于其中的每一个PU,遍历所有的预测模式,选取最优的预测模式,这个过程称为预测模式判别
- 帧内预测模式
- 遍历所有的预测模式,得到每种模式下的残差信号,再对残差信号进行Hadamard变换计算SATD值
- 利用SATD值计算每种预测模式的率失真代价,选取率失真代价最小的几种模式(与PU大小相关)为预测模式集
- 将已编码相邻块的预测模式补充到预测模式集中
- 遍历模式集合中的所有模式,并对残差信号进行正常编码(熵编码),计算率失真代价
- 选取最优的预测模式作为该PU的最优模式
- 当亮度块的模式确定之后,把该模式以及DC、planar、水平方向模式、垂直方向模式作为色度块的候选模式,选取最优的模式即可
- 帧间预测模式
- HEVC采用了Merge和AMVP技术,更加高效地表示帧间预测参数,但是这两种方式有比较大的区别,因此帧间预测可以分成Merge帧间预测模式和非Merge帧间预测模式(采用AMVP技术),分别选取最优的Merge帧间预测模式和非Merge帧间预测模式,然后从中选取最优的模式
- 对于Merge帧间预测模式,遍历所有的候选模式,计算率失真代价,选择率失真代价最小的模式为最优模式。当采用merge帧间预测模式I按摩,且预测残差信号的编码比特数为零时,只需要编码skip标识和merge索引两个语法元素,此时该模式称为MODE_SKIP模式
- 对于非Merge帧间预测模式(采用AMVP技术)
- 根据AMVP技术确定MVP列表,计算每个MVP的率失真代价,得到最优的MVP
- 以最优MVP为起始点,进行整像素运动预测,得到最优的整像素运动矢量
- 以整像素运动矢量为中心,进行半像素搜索,从周围的8个点确定最优的半像素精度运动矢量
- 以半像素精度矢量为中心,进行1/4像素精度的运动搜索,确定最优的1/4像素精度运动矢量
- PU模式判别
- 计算2Nx2N模式的率失真代价,将其作为最优代价,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至11,并将2Nx2N作为最优的PU模式
- 如果CU的深度已经取得最大值,且inter_4x4_enabled_flag是1,那么执行3,否则执行4
- 计算NxN模式的率失真,更新最优代价和模式,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至11,并将NxN作为最优的PU模式
- 计算Nx2N模式的率失真代价,更新最优代价和模式,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至11,并将Nx2N作为最优的PU模式
- 计算2NxN模式的率失真代价,更新最优代价和模式,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至11,并将2NxN作为最优的PU模式
- 如果TestAMP_Hor为1,当前CU执行水平方向上的AMP模式,否则执行本步骤。计算2NxnU模式的率失真代价,更新最优代价和模式,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至11,并将2NxnU作为最优的PU模式;否则计算2NxnD模式的率失真代价,更新最优的代价和模式,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至11,并将2NnD作为最优的PU模式
- 如果TestAMP_Ver为1,当前CU执行垂直方向上的AMP模式,否则执行本步骤。计算nLx2N模式的率失真代价,更新最优模式和代价,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至11,并将nLx2N作为最优的PU模式;否则计算nRx2N模式的率失真代价,更新最优模式和代价,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至11,并将nRx2N作为最优的PU模式
- 注意上面的都是帧间的模式,现在需要计算帧内2Nx2N模式的率失真代价,更新最优模式和代价
- 如果当前CU深度为最大值,计算帧内NxN模式的率失真代价,更新最优模式和代价
- 如果当前CU大于或等于PCM模式所允许的最小单元,并且代价大于PCM模式,那么更新最优模式和代价
- 结束搜索,得到最优的PU模式。注意对于每一种PU模式,都要夯实不同的TU划分,选取最优的TU模式,因此最优的PU模式包含了最优的TU模式
- CU划分模式判决
- 把CTU作为CU,计算率失真代价(最优PU模式时),此时应包含CU分割标志(split_flag)的编码比特数
- 对CU进行四叉树划分,计算每个子CU的最小率失真代价,并对所有子CU的率失真代价求和,得到该CU的率失真代价
- 为每个子CU作为CU重复2
- 重复3直到编码的最大深度
- 从最大的编码深度,比较4个子CU与CU的率失真代价,一次选出最优的划分方式。
- 对于每个CU,如果其帧间2Nx2N模式为MODE_SKIP,则满足Early_SKIP条件,直接结束该CU的进一步划分
- 帧内预测模式