zoukankan      html  css  js  c++  java
  • BD-RATE计算原理

    引自:https://www.freesion.com/article/6203385847/

    BD-RATE计算原理

    标签: H.26X研究  视频编解码  算法  计算机视觉

    BD-RATE介绍

    BD-rate是评价视频编码算法性能的主要参数之一,表示新算法编码的视频相对于原来的算法在码率和PSNR上的变化情况。
    在视频编码中,码率低表示压缩量大,PSNR值高表示客观质量好。因此,对于一种编码算法,如果压缩视频码率降低、PSNR值提高,那么该算法具有良好的性能。但是通常视频编码算法在提高压缩量的同时会损失压缩质量,即码率减小的同时PSNR值也减小,此时就需要使用BD-rate进行衡量。

    VB程序分析

    本部分首先对程序进行注解,再按模块进行分析。

    Public Function bdrate(rateA As Range, distA As Range, rateB As Range, distB As Range) As Double 
    'rateA是anchor码率,distA是ancher的PSNR,rateB是test码率,distB是test的PSNR
    
        Dim minPSNR As Double
        Dim maxPSNR As Double
        
       '取出积分区间
        minPSNR = WorksheetFunction.Max(WorksheetFunction.Min(distA), WorksheetFunction.Min(distB))   
        maxPSNR = WorksheetFunction.Min(WorksheetFunction.Max(distA), WorksheetFunction.Max(distB))
        
        Dim vA As Double
        Dim vB As Double
        
        '积分。bdrint函数先对码率取了对数,然后进行积分
        vA = bdrint(rateA, distA, minPSNR, maxPSNR)
        vB = bdrint(rateB, distB, minPSNR, maxPSNR)
        
        '计算积分差值,除以积分区间
        Dim avg As Double
        avg = (vB - vA) / (maxPSNR - minPSNR)
        
        '对数反变换。得到被测算法的码率相对于anchor的倍数,减1后得到变化率
        bdrate = WorksheetFunction.Power(10, avg) - 1
    End Function
    Public Function bdrint(rate As Range, dist As Range, low As Double, high As Double) As Double
        Dim log_rate(1 To 4) As Double
        Dim log_dist(1 To 4) As Double
        Dim i As Long
        
        '数据重排。输入数据小qp在前,因此前面数据的码率和PSNR大,重排后小值在前
        For i = 1 To 4
            log_rate(i) = WorksheetFunction.Log(rate(5 - i), 10)  
            log_dist(i) = dist(5 - i)
        Next i
        
        Dim H(1 To 3) As Double
        Dim delta(1 To 3) As Double
        
        For i = 1 To 3
            H(i) = log_dist(i + 1) - log_dist(i)  '差值
            delta(i) = (log_rate(i + 1) - log_rate(i)) / H(i)  '以PSNR为横轴的斜率
        Next i 
        
        'd、c、b为分段多项式系数,本程序采用pchip三次分段插值方法获得拟合曲线
        Dim d(1 To 4) As Double 
        d(1) = pchipend(H(1), H(2), delta(1), delta(2))
        For i = 2 To 3
            d(i) = (3 * H(i - 1) + 3 * H(i)) / ((2 * H(i) + H(i - 1)) / delta(i - 1) + (H(i) + 2 * H(i - 1)) / delta(i))
        Next i
        d(4) = pchipend(H(3), H(2), delta(3), delta(2))
    
        Dim c(1 To 3) As Double
        Dim b(1 To 3) As Double
        For i = 1 To 3
            c(i) = (3 * delta(i) - 2 * d(i) - d(i + 1)) / H(i)
            b(i) = (d(i) - 2 * delta(i) + d(i + 1)) / (H(i) * H(i))
        Next i
        
        '分成3段,s0作为起点,s1作为终点
        Dim s0 As Double
        Dim s1 As Double
        Dim result As Double
        
        result = 0 '积分值
        
        For i = 1 To 3
            s0 = log_dist(i)
            s1 = log_dist(i + 1)
            
            '判断当前分段是否在范围内
            s0 = WorksheetFunction.Max(s0, low)
            s0 = WorksheetFunction.Min(s0, high)
            s1 = WorksheetFunction.Max(s1, low)
            s1 = WorksheetFunction.Min(s1, high)
                    
            '平移区间
            s0 = s0 - log_dist(i)
            s1 = s1 - log_dist(i)
            
            '积分
            ' 插值函数为 rate(i) + s*(d(i) + s*(c(i) + s*(b(i))) 
            ' 即 rate(i) + s*d(i) + s*s*c(i) + s*s*s*b(i)
            ' 则原函数为 s*rate(i) + s*s*d(i)/2 + s*s*s*c(i)/3 + s*s*s*s*b(i)/4
            If (s1 > s0) Then
                result = result + (s1 - s0) * log_rate(i)
                result = result + (s1 * s1 - s0 * s0) * d(i) / 2
                result = result + (s1 * s1 * s1 - s0 * s0 * s0) * c(i) / 3
                result = result + (s1 * s1 * s1 * s1 - s0 * s0 * s0 * s0) * b(i) / 4
            End If
        Next i
        
        bdrint = result
    End Function
    
    Public Function pchipend(h1 As Double, h2 As Double, del1 As Double, del2 As Double) As Double
        Dim d As Double
        
        d = ((2 * h1 + h2) * del1 - h1 * del2) / (h1 + h2)
        If (d * del1 < 0) Then
            d = 0
        ElseIf ((del1 * del2 < 0) And (Abs(d) > Abs(3 * del1))) Then
            d = 3 * del1
        End If
        
        pchipend = d
    End Function

    确定积分区间

    由于输入的四个点不对齐,为了计算积分差,需要取得公共区间。如下图所示:
    在这里插入图片描述
    码率取对数
    文献1介绍了对码率取对数的原因。实际上,当取对数后,码率之间的倍数关系会变成相减,方便计算。此外,类比PSNR的计算过程后,再对数域进行曲线拟合更加合理。
    下图为普通的RD曲线图,纵坐标为PSNR,横坐标为码率Bitrate普通的RD曲线图
    下图为码率取对数的RD曲线图,纵坐标为PSNR,横坐标为10*码率的对数

    在这里插入图片描述
    数据重排
    如下图所示,一般输入数据点基于四个从小到大的QP值,QP值越小,压缩量越小,码率越大,损失越小,即PSNR更高。因此输入的数据点码率与PSNR从大到小,为了方便计算,使用log_dist(i) = dist(5 - i),将数据反排为从小到大。
    在这里插入图片描述
    对数反变换
    通过对数反变换,获得被测算法的平均码率相对于anchor的倍数,当被测算法与ancher相等时,对数反变换为1。减1后,倍数变为相对变化率。由此可以看出,BD-rate实际上表示的是一种平均变化率,所以格式通常是百分比。
    BDBR与BDPSNR
    与BD-rate相似,BDBR与BD-PSNR也是常见的视频算法评价指标。BDBR表示了在同样的客观质量下,两种方法的码率节省情况;BD-PSNR表示了在给定的同等码率下,两种方法的PSNR-Y的差异。与二者不同的是,BD-rate表示的是一种平均值的关系。BDBR与BD-PSNR的介绍见文献2。
    pchip三次分段插值方法
    程序使用分段三次Hermite插值,将原始长序列分割成三段,每段构造一个三次函数,使得分段的衔接处具有二阶导数连续的性质(也就是光滑衔接)。
    多项式形式为:v = y + sd + ssc + sssb
    介绍见文献3、4

    使用方法

    1.建立VB程序
    2.EXCEL中调用,对应输入四组数值
    3.输出值以百分号形式表示,负值代表新算法性能更优,正值表示新算法性能较差。

    参考文献

    (文献1为原作者提案,文献2分析了BDBR与BDPSNR的计算原理,文献3、4介绍了插值原理)
    [1]: https://wenku.baidu.com/view/588c854fde80d4d8d05a4f2c.html
    [2]: https://blog.csdn.net/XX_bai/article/details/89713343?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
    [3]: https://max.book118.com/html/2018/0317/157673431.shtm
    [4]:https://zhuanlan.zhihu.com/p/62860859

     
    版权声明:本文为weixin_42348033原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
    本文链接:https://blog.csdn.net/weixin_42348033/article/details/104892903
  • 相关阅读:
    简单的spring--mvc整合
    spring配置mybatis的sqlsessionfactory
    spring配置hibernate的sessionFactory
    spring关于bean的一些配置说明
    采用多个数据源是Spring的配置
    如何将Win10 的环境变量页面设置用在win7上面?
    了解常用的开源机器学习项目
    PyCharm导入tensorflow包报错的问题
    python 结巴分词(jieba)详解
    pylint
  • 原文地址:https://www.cnblogs.com/lyp1010/p/15266825.html
Copyright © 2011-2022 走看看