标签:
HEVC码率控制介绍
R-lamda模型提出到优化已有2年,从近几年的文章来看,大体归为类:一是帧内的码率的码率控制算法,一是模型参数更新,一是考虑感知
第一类:K0103码率控制算法主要是在P/B帧上提出的,I帧没有做,体现在I帧中LCU编码时用的还是帧层的QP,而帧层的QP是由配置文件(即*.cfg中QP: 32 # Quantization parameter(0-51) 这里的32我们可以更改一般设置为22、27、32、37),如果码率控制开启,实际上配置文件中#======== Quantization =============这一栏的QP设置已经没有多大意义,因为码率控制一旦开启,就是预先估计编码单元分配的码率,码率分配好,就可以根据R-lamda模型计算相应的QP,用于编码编码单元(码率控制中的编码单元最小是一个LCU,最大是一个silce,配置文件中可设置)
针对K0103的不足,后续出来几个提案(M0257,M0036),说白了M0036就是考虑了K0103在I帧码率控制的缺陷,编码编码单元时,此时用的QP不在是帧层的QP,每个编码单元的QP很有可能不一样,而K0103中每个编码单元的QP和帧层的QP一致。M0036还做了一个工作,就是方法相应的alpha,beta的取值范围,为什么放大,这个提案给出了具体的说明。
M0257相对M0036改动相对更大一点,怎么说呢,一句话概括,考虑了空域的复杂度,即对原始帧做了一个HAD变换,然后在对HAD变换的值相加,这个提案中说是SATD,SATD即经过哈达曼变换后的绝对误差和,一般是对预测块与原始块的差值(即残差)做哈达曼变换,主要作为ME/Merge模式选择中率失真代价函数中的失真,至于这里为什么对原始帧做HAD变换合理,原因是在编码后才能知道预测块,编码前得不到只能对原始帧做一个咯。
M0257只做了帧内的码率分配模型,这个模型的实现跟提案介绍肯定有非常大的区别。看平台吧,不多说,而且很多具体的参数怎么来的,不得而知,这里我不介绍了,估计做了大量的实验统计。
至于以后提案更新到啥样了,我也没关注了,但是跟踪近几年的文章,应该变化不大
现在讲讲我这两年码率控制的感悟吧,以及比较好做的点,不喜勿喷
1、 率失真优化
2、 比特分配
3、 感知编码
1、率失真优化是相对这三点是相对简单的,为什么呢,下面我说下原因:
首先看这上面的公式,注意下标也要看。率失真优化改的地方有两个,一是改失真,二是改lamda!!,如果做跟视觉感知的失真,同时你认为你改的失真不会影响Lamda的变化,好吧。那你改失真可能有点困难,改的地方实在是太多了,那你就求个导。这两个公式看的懂吧,这个能这个干,前提是K只能信源或视觉特征有关,否则仔细一看漏洞百出,后面就会介绍啥漏洞。
如果是大牛,可能会推出失真变了,lamda绝对会变,这个是绝对正确。为啥后面也会说。
关于率失真还有一种做法,就是直接对lamda做修正,这样的话涉及到一个速降率的问题,是码率将的快,还是质量降的块,这个质量有多种评价方法,看你做的什么,质量可以用PSNR衡量,也可以打分,不知道你们试过没有,不开码率控制用QP=22编码跟用QP=25编码有什么多大的区别,肯定会有人说你这不是说的废话么,肯定会有变化,不好意思我说的是你看编码出来的重建图像,你不去拿放大镜看,你又看的出多大的区别。但是你在看看码率是不是区别很大。这你估计就会懂了,感知可做的就来了。这就不细说了!!!
2、比特分配,为什么说比特分配相对率失真优化难做一点呢,因为比特分配不一定有效果,因为你单从比特分配上来考虑,提升的效果也不会太大多少,因为码率控制的模型最关键的地方在于QP以及模型中的参数更新,你分配的在准,QP计算不准,参数更新不准,编码出来的码率绝对达不到你分配的码率。
3、感知编码这个其实也难度不大
4、 建立码率控制模型,来点难度大的吧。这就弄出来绝对轰动。
首先看这两个公式,这两个公式用在哪里呢?第一个公式用在CU分割那里,第二个公式用在模式选择那里,具体的说第二个公式中的SATD用在变换域,一个用在非变换域。
先来说R-LAMDA模型是怎么出来的吧,第一:失真确定,选择的是SSE度量失真,选这个失真是最合理的,为什么,下面会说。第二个公式中的lamda跟第一个公式中的lamda不一样,第二个lamda是第一个lamda的开方,为什么是开方,是通过实验统计,在一篇rate distortion 的文章,九几年的文章。具体名字我也懒得找了。反正这个统计也是建立在SSE作为失真度量的基础上。
如果建码率控制模型,想用一种失真替换SSE,首先这个工作量绝对会大,假设用SSIM来代替,SSIM最大为1,而编码出的码率最小为多少,可能为0(Merge模式),最大为多少,上万,1在上万面前是不是可以忽略不计,那么问题就来了,编码不就是在码率和失真之间选择一种平衡么。现在哪能平衡,当然做法也很多,有人说,对失真放大,但是放大多少倍是合理的?才能找到这种平衡?
失真替换掉了,这个lamda势必要重新建立,经典的做法,就是不开码率控制,把失真替换掉,固定几个QP,用N个lamda去编码,得出QP-llamda的关系,得出关系之后在slice层改进,这里改进不是用在码率控制,是用在QP确定,相应的lamda就会确定,然后选用低延时或随机访问结构,求出QP-LAMDA的关系,这个关系是用在码率控制模型中,用于根据码率计算相应的QP,为什么选择递延时结果,答案,分级。递延时分3级,每以及的QP增量不一样,利用上一步QP-lamda的关系是不是能得出lamda,然后在通过在LCU编码时多遍历几个QP,选出对应Lmada下的最优QP,是不是会得出一个关系。
说这么多,问题在哪,复杂度,SSE用SSIM替换,是不是SAD/SATD也要用个东西替掉,不替代是不是不合理,替掉的话复杂度是不是又上了?发现越写越写不清了。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/listener51/article/details/46662823