HEVC/H.265面试问题准备(PART 5. 率失真优化+速率控制)

近期因为要准备暑期实习以及后期的秋招环节,再一次温习了《新一代高效视频编码H.265/HEVC原理、标准与实现》经典书籍,现在记录下有关阅读心得以及可能面试的问题(所有的答案都是我自己思考的或者网络/书上摘抄的,因为本人水平有限,如果有错误或者需要补充可以私聊我)。

第十一章. 率失真优化

1. 率失真优化的作用

  • 视频压缩要在编码比特率和失真二者之间进行平衡,来保证在一定视频质量的条件下尽可能减少编码比特率或者在一定编码比特率下尽量减小失真。
  • 利用率失真优化,可以选择到合适或者最优的编码工具/模式/参数,以实现最优的编码性能。比如,对于P帧的一个CU,可以选择intra / inter / ibc mode其中一种,而intermode之中,又可以选择非常多备选的MV。总之,通过率失真优化可以选择最优的编码参数。

2. 常见的客观视频失真测度
平方误差和SSD、均方误差MSE、绝对误差和SAD、峰值信噪比PSNR。

指标1
指标2

3. 简单理解拉格朗日率失真优化
将约束性问题通过引入拉格朗日因子λ转变为非约束性问题,从而方便计算最优解。
在视频编解码中,需要平衡失真(distortion)和码率(rate),对应的约束性问题就是下式:
RDO
即在给定的限定码率Rc下,寻求最优的B(目标函数,此处指编码参数/方法/工具),使得失真最小。引入拉格朗日因子λ后,转为非约束性问题,变为下式:
RDO
至于拉格朗日因子λ的取值,一般根据经验或者在可选范围内遍历选择。视频编码中,λ和QP有固定的函数关系。Rate control时,可以根据以下顺序选择参数 Rc ===> QP ===> λ 或者直接Rc ===> λ。所以,约束性问题最后可以变为:
RDO
4. HEVC中的率失真优化方法
① GOP层
考虑:当前图像的失真D与当前图像的编码比特数R有关,还和前面已编码参考帧的图像质量(失真)有关。实验表明,当前图像失真和参考图像的失真有线性关系。
② Slice层
除了环路滤波可能跨slice,其他预测、熵编码等环节slice之间是相互独立的。因为Slice中包含整数个CTU,但是CTU之间互相相关(Intra、Inter等),目前不怎么考虑该部分。
③ CTU层
CTU划分为CU的组合选择:对每一种CU划分模式,对每个CU编码,选择最优的划分模式。
④ CU层

  • CU划分为不同PU,PU选择不同的划分模式。
  • CU划分为不同TU。(此处为了降低复杂度,只对最优PU尝试补充TU)。
    ⑤ PU层
    选择最优预测模式Intra / Inter / IBC … 和预测参数 (IPM / MVP / MV / BV …)。

5. HM中的率失真优化快速模式判决策略

  • Intra prediction时,有RMD环节。先用Hadamard变换代替DCT/DST对残差进行变换,计算SATD值。D(mode)就是SATD值,R(mode)是编码IPM的编码比特数,根据D+λR选择若干个模式作为粗选。遍历这几个粗选以及附近相邻的模式,计算D(此处是复杂的编码失真)+λR选择最优模式。
  • Inter prediction时,需要选择参考帧、mvp、mv等参数。使用Merge模式时,D(mode)使用SATD值进行计算。

第十二章. 速率控制

1. 速率控制的核心和主要步骤
核心是建立编码速率和量化参数的关系模型,根据目标码率确定视频编码参数中的量化参数。
主要步骤主要有 比特分配 和 量化参数确定。
① 比特分配
就是根据时域、空域的相关性(视频内容、缓冲区状态、信道带宽),给每个编码单元(可以是GOP、frame、slice、CTU、CU级别)分配最优比特数。该步骤关键是考虑各编码单元之间率失真性能的相关性,实现最优比特分配。
② 量化参数确定
就是根据分配比特数比特数,依据其与量化参数的关系模型,为该编码单元确定量化参数。
Rate control

2. 速率控制设置缓冲区的优缺点

  • 优点:
    ① 速率控制算法并不能完美保证实际码率和目标码率完全一致,在编码器和传输信道中间建立一个缓冲区,可以一定程度上平滑二者的差别。
    ② 引入缓冲区可以容忍一定的速率波动,以避免编码速率与信道速率随时保持一致引起的视频质量波动。
    buffer
  • 缺点:
    ① 消耗存储空间。
    ② 引入时延。
    缓冲区越大,适应信道速率的能力越强,但是消耗的存储空间也越大,而且导致解码时延增大。缓冲区大小需要由允许的最大时延以及运营成本决定。对于有限的缓冲区,RC时需要避免缓冲区溢出。

3. 含有缓冲区的速率控制算法(流体流量模型)
简单总结,就是此时刻的充盈度是 在上一时刻的充盈度的基础上,加上流进来的bits(实际编码速率,由编码器输入),减去流出去的bits(由缓冲区输出到信道)。
此外,设置一条警戒线(阈值线TH)。超过TH,说明实际编码速率偏高,保持下去会有溢出的危险,所以需要降低实际编码速率。如果低于TH,说明实际编码速率偏低,可以适当提高来提高视频质量。
在这里插入图片描述
在这里插入图片描述
3. HEVC速率控制(JCTVC-K0103)
具体分为
① 比特分配
GOP级目标比特分配 ===> 图像级目标比特分配 ===>CTU级目标比特分配

  • GOP级目标比特分配
    1
    在这里插入图片描述
    很明显,这就是上面所说的流体流量控制模型。u/Fr是每帧编码的目标bits数目。u/Fr * Nvc就是准备流出的bits(由缓冲区输出到信道),Rvc就是流进来的bits(实际编码速率,由编码器输入)。二者的差值作为调整实际编码速率的反馈值。SW可以控制调整的精度,越小调整越快,但是容易导致GOP之间比特波动较大。

  • 图像级目标比特分配
    一个GOP中为每幅图像分配对应的比特数。该比特数主要由两部分决定——当前GOP总目标比特数,GOP剩余编码比特数,二者分别对应下面公式前后两部分。
    在这里插入图片描述
    其中,第一部分与每幅图像的分配权重Wf有关,体现不同图像在GOP中的重要性,可以查表得到。
    在这里插入图片描述
    第二部分与每幅图像的分配权重Wf有关之外,还与已编码比特数RGc有关。
    在这里插入图片描述

  • CTU级目标比特分配
    根据当前图像的总目标比特数为每个CTU确定目标比特数。
    在这里插入图片描述

② 量化参数确定
先根据编码单元的目标比特数得到λ,再由λ和QP的关系确定每个编码单元的QP值。
图像级量化参数确定 ===>CTU级量化参数确定

  • 图像级量化参数确定
    使用双曲函数。得到λ如下
    在这里插入图片描述
    在这里插入图片描述
    QP如下
    在这里插入图片描述
    在这里插入图片描述
  • CTU级量化参数确定
    与图像级量化参数确定相似,也是先根据编码单元的目标比特数得到λ,再由λ和QP的关系确定每个编码单元的QP值。不断更新相关参数即可。
原创文章 17 获赞 4 访问量 3963

猜你喜欢

转载自blog.csdn.net/weixin_37524256/article/details/105510706