How to use BD-Rate to evaluate codecs

BD-BR计算和注意事项

在视频压缩领域,常常需要比较不同算法或者不同编码器的优劣,而评价一个编码器很重要的一个指标是压缩率。计算压缩率需要比较质量和码率,相同画质下码率越低,压缩率越高;或者相同码率下,质量越高,压缩率也越高。

在实际比较的时候,因为很多的编码算法会同时影响质量和码率,导致码率或者质量无法卡齐,不好直接对比压缩率。在这种情况下就需要BD-Rate这个工具。

BD-BR全称是Bjontegaard delta bitrate (BD-BR) ,与2001年提出来的。它可以定量比较不同编码器的压缩性能,这些年一直被广泛用于编码器的评测;它主要是通过计算两条RD曲线上之间的差距来度量不同编码器的优劣,具体可以参见下图:

Figure1
Figure1

R-D曲线的X轴是码率,Y轴是客观指标。计算的时候可以计算R-D曲线针对X轴的积分(BD-PSNR),也可以计算R-D曲线对于Y轴的积分(BD-Rate);BD-PSNR可以认为是delta psnr,因此正值代表了画质提升;BD-Rate可以认为是delta rate,因此负值代表了码率节省。这里重点说明下BD-Rate.

计算方式

假如要评测两个编码器A和B的压缩率,衡量质量的标准使用PSNR;在计算BD-Rate之前,需要先使用4个或更多个码率点来进行编码,例如2Mbps, 2.5Mbps, 3Mbps和4Mbps,编码完成后统计对应4个码率点的码率和质量(PSNR);

  1. 对码率先做对数变换,这个主要是为了防止不同质量等级下码率差异太大,导致高码率对整个的计算影响太大;

\[ r = log_{10}R \]

  1. 使用interpolation函数拟合出两条Rate-Distortion曲线,X轴是Rate,Y轴是PSNR; 例如\(r = a + b * D + c * D^2 + d*D^3\)
  2. 计算两条曲线对于Y轴积分的差,积分的时候只对Distortion有重叠的区域做积分;因此需要先计算出\(D_{high}\)\(D_{low}\)
  3. 对Distortion部分做normalize,也就是除以\(D_{high} - D_{low}\)
  4. 最后再通过幂函数恢复到原来的域

最后的整个公式就是

\[ \Delta R =10^{\frac{1}{D_{high} - D_{low}} \int_{D_{low}}^{D_{high}} (r_b - r_a)dD} \]

以下是Netflix开源的bdrate计算脚本: https://github.com/Netflix/vmaf/tree/master/python/vmaf/tools

注意事项

虽然BD-Rate对应着码率节省,但实际计算的时候BD-Rate并不等于码率节省的比例。

另外BD-Rate有单调性的假设,也就是质量会随着码率升高而升高。

一般来说,0.5db提升等同于-10%的BD-Rate;