本文介绍几种快速的码率估计的方法,这些方法减少了码率估计过程中的依赖,而且还能在视频编码质量损失不大的情况下,大大提升硬件的性能。
在介绍码率估计之前,我们有必要了解一下正常熵编码的流程。这里我们以常规编码为例子,因为对于码率估计来说,bypass编码的bit数目其实就是需要进行bypass的语法元素二值化后的数目。首先熵编码包含二值化、上下文建模、区间划分、重归一化、outstanding 位处理以及上下文更新。
首先会有一个初始化的range值,然后对通过上下文建模计算出来的ctx0进行概率估计得到概率0,此时通过概率和Range的长度就可以得到LPS的区间长度,自然MPS的长度也可以获得了,此时再通过二值化得到的bin判断是否为MPS,得到最终区间的更新,此时注意如果range小于256那么就要进行重归一化。此时熵编码就会根据重归一化输出对应的码流,而码流的数目可以用公式3来进行表示。其中A(n)就代表是区间更新后的区间长度。
那么在进行码率估计的时候,是不是一定需要按照上述复杂的流程呢,答案显然是否定的。在HM或者VTM中都用了一个表格来替代真实的熵编码过程,这里以HM的表格给出在ppt中。这个表格输入只与二值化后的bin与state有关。所以HM或者VTM中其实只需要进行二值化、上下文建模以及一个上下文更新的过程,就可以通过查找表来得到最终的码率了。
那么首先我们来介绍第一篇文章,这篇文章提出了一个只需要二值化的码率估计。首先公式6就是之前ppt列出的公式了,其中EMB代表当前的bin是否等于MPS。可以观察公式得出结论,码率只与EMB和pstateidx有关,那么对每个固定的state和bin可以得到表三,然后我们对表三计算MPS对应的码率的期望以及LPS对应的码率期望,就可以得到右边的M和L对应的公式。那么码率就可以用右下角的公式来代替,其中M和L刚才已经解释过了,BINS就代表二值化后bin的总数目,k就代表MPSbins在总的bins中占的比例。下面我们只需要证明k、M、L是在统计下是常数就可以得到最后码率的表达式了。
左图是在不同序列不同QP下针对LPS和MPS情况下对state发生的概率的统计,证明了M、L是常数。右图是在不同序列不同QP下对MPS bins和LPSbins在总的bins的统计,证明k是常数。最终我们得到了右边的只与BINS相关的码率表达式。
文章中又统计了总的BINS与估计码率的关系,得到了C是0.85,最后码率估计的表现在右面两张图中展示,27和28两种方法其实对应的就是HM中的方法,只不过28中的方法是把查找表换成了公式法,本质上仍然需要做二值化、上下文建模及更新。可以看到本方法在平均损失1左右的bdrate得到了几乎50%的时间节省(相对于码率估计过程)。
对于码率估计来说,在硬件设计过程中有两个依赖,导致了码率估计的硬件瓶颈,一个是range更新的依赖,一个是上下文更新的依赖,换句话说:下一个语法元素需要等待当前语法元素的range和上下文更新完成之后才能得到正确的值,对于熵编码来说,这个依赖是始终存在的并且不可消除的。但是对于码率估计我们可以从这两方面进行优化。本文就是在HM方法的基础上,把上下文更新的部分取消掉了,因此这两个依赖全部消除。可以看左上角的图,我们看到对于码率估计来说,他没有进行上下文更新的步骤,并且该文章将此方法命名为CFBAC,也就是固定上下文的熵编码。采用此方法之后,在以0.03dB质量损失的代价的基础上,可以节省88%的门。
此文章采用了拟合的方法,首先此文章所做的RDO过程将量化这个过程去掉了。但是本文此次只分享码率估计的部分。由于省掉了量化,我们必须在变化系数的基础上进行码率估计,首先本文将变换系数的编码分为了三部分。
第一部分是对coeff_abs_level_greater1_flflag/greater2_flflag/level_remaining这三个语法元素进行编码。这三个语法元素是跟系数幅值相关的语法元素,采用了公式2进行拟合,因为对于原来的码率估计来说会有零系数的编码,因此这里设置了公式3的阈值,为的就是模仿量化后整个系数块的情景。
第二部分考虑到cabac的本质:低概率码流多,高概率码流少。我们进行了公式4的拟合,i和j代表了系数对应的坐标,左上角的系数经过变换之后,出现的概率自然是最高的,因此此时码流计算出应该是最少的。
第三部分是对最后非零系数位置的编码,如公式5所示,首先因为只编码一个所以没有累加的操作。其次为什么加1:最后一个系数位置如果是(0,0),那么就是公式结果就是1,如果不加1,公式结果就是0,为了更倾向于选择all_zero所以加了1。
最后我们将残差的码率拟合如左上方公式所示。经过不同的训练结果,最终选定取lastpos的三次方,其他两个均取二次方。对于其他语法元素,亮度的模式,进行拟合,如右图所示。首先对于当前mode在MPM list中,那么这个概率是最大的,因此输出码率1,对于当前mode不在MPM list中时,如果左边和上边的mode均不在MPM list中,这个概率最小,输出码率3,对于其他情况输出码率2。对于色度也是类似。
最后我们给出这篇文章的结果,只看码率估计部分。时间可以得到16.66的节省,BDrate变差了1.54 。虽然在软件上的结果没那么好,但是此方法在硬件实现上,不但没有上述的两种依赖,而且还能大大减少硬件资源占用。
最后一篇文章采用了四个方法,第一个方法是将LUT改成了公式计算,减少了面积,另外修改了这个公式,为了便于硬件的移位。第二个方法是需要计算上下文的值ctx很麻烦 ,所以采用了直接固定的方法(注意vlsi那篇文章概率不会更新)图10和表1展示了本文是怎么样固定上下文索引的。第三个方案是按照每个子块为粒度更细上下文,也就是减轻了上下文的依赖,但是没有消除。第四个方法是简化了cu_skip_flag的上下文建模,因此它不再依赖于周围CUs的信息。
在这四种方法的基础上的码率估计,BDRATE平均变差了2.225, 但是文章中采用的这四种方法,大大减少了码率估计的依赖,提升了码率估计的瓶颈。并且本文对RDO进行了并行的操作,无论是mode还是划分的rdo均采用了并行,最终对于32X32的CTU来说能达到8K@120fps的性能。
关 注 我 们 
实验室网站:http://viplab.fudan.edu.cn/
OpenASIC官方网站:www.openasic.org
知乎专栏:http://zhuanlan.zhihu.com/viplab
微信公众号:OpenASIC
继续阅读
阅读原文