【python坑点总结】PSNR BD-rate坑点(numpy数组)

PSNR BD-rate坑点(numpy.polyval坑点)

现象

工作中会涉及到编码器对比的bd-psnr计算。
具体bdrate计算原理可以参考:https://blog.csdn.net/cxy19931018/article/details/99719375
而本次使用的代码主要如下:

def BD_RATE(R1, PSNR1, R2, PSNR2, piecewise=False):
    lR1 = np.log(R1)
    lR2 = np.log(R2)

    # integration interval
    min_int = max(min(PSNR1), min(PSNR2))
    max_int = min(max(PSNR1), max(PSNR2))

    # find integral
    if piecewise:
        # See https://chromium.googlesource.com/webm/contributor-guide/+/master/scripts/visual_metrics.py
        lin = np.linspace(min_int, max_int, num=100, retstep=True)
        interval = lin[1]
        samples = lin[0]
        v1 = scipy.interpolate.pchip_interpolate(
            np.sort(PSNR1), lR1[np.argsort(PSNR1)], samples)
        v2 = scipy.interpolate.pchip_interpolate(
            np.sort(PSNR2), lR2[np.argsort(PSNR2)], samples)
        # Calculate the integral using the trapezoid method on the samples.
        int1 = np.trapz(v1, dx=interval)
        int2 = np.trapz(v2, dx=interval)
    else:
        p1 = np.polyfit(PSNR1, lR1, 3)
        p2 = np.polyfit(PSNR2, lR2, 3)

        p_int1 = np.polyint(p1)
        p_int2 = np.polyint(p2)

        int1 = np.polyval(p_int1, max_int) - np.polyval(p_int1, min_int)
        int2 = np.polyval(p_int2, max_int) - np.polyval(p_int2, min_int)

    # find avg diff
    avg_diff = (int2-int1)/(max_int-min_int)
    avg_exp_diff = (np.exp(avg_diff)-1)*100
    return avg_exp_diff

涉及到了numpy数组中的np.polyval数组计算。这里有个大坑,主要是我使用的同样编码器,接口配置也相同,但对于相同的测试序列,结果他出来的bdrate并不一致。
psnr bd-rate差异截图

猜测

一开始我以为是编码器cbr的部分变量没初始化(因为过去出现过这个问题),也就是出来的同样的视频,采用同样的编码器cbr和接口配置,出来的码率就不一致。后来一看,这次出来的bdrate差异特别小,而原始编码器和对比编码器的出来的码率和psnr也是一致的。奇了怪了,那根据理论来说,psnr-bdrate只和四个因素有关啊(参考编码器码率,参考编码器psnr。测试编码器码率,测试编码器psnr),这四个都两两对应相同,怎么不是0呢???

原因

经过仔细排查,主要问题出在 np.polyval这个函数上。
临时有事,留个坑,下班后来填

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值