万老师《H.265/HEVC》第十一章:率失真优化

做了一阵子率失真优化才发觉自己理解太不到位了,特此系统读书学习一波。

有损压缩算法,性能由编码输出的比特率失真共同决定。
编码的目的:就是在保证一定视频质量的条件下尽量减少编码比特率,或在一定编码比特率限制条件下尽量地减小编码失真。
编码器工作:根据以上率失真准则找到最佳编码参数。

1 理论部分

信息论中率失真概念:在允许一定程度失真的条件下,能够把信源信息压缩到什么程度,即最少需要多少比特数才能描述信源。由此得到率失真函数:R(D) = min I(X, Y),它给出了限定失真条件下信息压缩允许的下界。但其在视频编码中难以应用,因为各种概率和条件概率未知,只能作为理论值。

视频编码中的率失真曲线:为了研究视频码率与视频质量的平衡。由于系统性,不能达到理论上的R(D)值,只能由不同的编码参数(如QP和选择的模式)得到有限的(R, D)可操作点,形成凸包络。
在这里插入图片描述
视频编码中的率失真优化(RDO):遍历所有的参数候选模式对视频进行编码,满足码率限制的失真最小的一组参数集作为最优的视频编码参数。每一层级都找出,最终使整体系统性能最优。(这里假设了无相关性的独立优化,如相关性较强则共同优化)

拉格朗日因子法min {D + λR}。λ的确定方法和QP有较固定的函数关系。速率控制根据分配的码率预测CU的QP,然后利用QP与λ之间的映射关系确定出合适的λ。目前,近年来提出了根据限定码率直接计算λ的方法得以应用。λ的几何意义即斜率。(缺点:只能取到斜率一致的凸包络上的点,如更优的B点无法取到)。
在这里插入图片描述

2 实现方案

总体而言,编码残差和头信息分别使用以下两式,(i,j)为像素位置:
在这里插入图片描述
在这里插入图片描述
GOP级:在目标比特数下获得最优重建视频质量。GOP间无相关性,GOP内的帧有相关性。由于帧间预测,图像的失真D,不但与其编码比特数R相关,也与已编码的重构图像质量相关,所以这几帧需要共同优化。

Slice级:相对很独立,可独立优化,但实际上帧内预测,运动搜索、环路滤波都可能用到相邻slice,至今还没考虑。

CTU级:主要管划分,在总比特数R受限的情况下,选择一个CU 划分模式 使得一个CTU的总失真D最小。按顺序对CTU进行四叉树递归分割,当前CU编码参数的优化过程不考虑对后续CU率失真性能的影响。

CU级:在总比特数R受限的情况下,适当的选择一个PU模式和TU模式,使得一个CU的总失真D最小。按顺序确定所有PU的编码参数,当前PU编码参数的优化过程不考虑对后续PU率失真性能,并只对最优的PU模式尝试不同的TU模式。

PU级:分为帧内预测和帧间预测。帧内预测就是从35种帧内预测模式中选择出一种最优的预测模式;帧间预测模式需要结合Merge、AMVP等技术,为每个PU选择运动矢量、参考图像、预测权值等编码参数。这里D一般为SATD,R是头信息比特数。

亮度λ如下式
在这里插入图片描述
Wk为加权因子,与图像在GOP中的位置有关;a为参考帧因子,若不是参考帧则为1,若为参考帧则略小于1。(λ小,则斜率小,带来的影响是用稍多的码率,造成更小的失真,为了让其他帧参考更准确)。

色度λ如下式:与亮度λ和偏移的QP相关。
在这里插入图片描述

3 具体操作

这里介绍的是速率控制后有了QP之后的优化方案。具体参数包括CU划分模式、CU的PU模式和TU模式、PU的预测参数等。(得到的最优的PU模式包含了最优的TU模式)

快速算法
1、当前CU最优模式为skip,则不再划分,进行下一个CU的遍历;
2、如果CU未划分且当前为帧间模式且MVD为0,则直接遍历该CU四叉树划分之后的;
3、如果CU为帧间模式且变换系数都为0,则不再划分,进行下一个CU的遍历;
4、AMP??

步骤
在这里插入图片描述

for( partitionIdx : 所有cu划分方式 )
{
    
    
	for( puIdx : partitionIdx划分cu后的所有pu模式 )
	{
    
    
		//帧间部分
		构建MVP列表
		构建merge列表
		for( mergeIdx : 所有5个merge候选)
		{
    
    
			找到率失真代价最小mergeIdx 
		}
		for( mvpIdx : 所有2个MVP列表)
		{
    
    
			以mvpIdx为起点,整像素搜索运动矢量,最优MVP为fullMvp
			以fullMvp为起点,分像素搜索运动矢量,从周围8个点找到最优MVP为halfMvp
			以halfMvp为起点,1/4像素搜索运动矢量,找到最优MVP为bestMvp
		}
		
		//帧内部分:
		构建MPM列表
		for( IntraModeIdx : 所有35种帧内色度模式)
		{
    
    
			IntraModeIdx粗选出几种
			MPM列表模式加入
			找到亮度率失真代价最小IntraModeIdx
		}
		for( IntraModeIdx : 所有5种帧内色度模式)
		{
    
    
			找到亮度率失真代价最小IntraModeIdx
		}
	}
}
	

猜你喜欢

转载自blog.csdn.net/weixin_42979679/article/details/104534543
今日推荐