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并不一致。
猜测
一开始我以为是编码器cbr的部分变量没初始化(因为过去出现过这个问题),也就是出来的同样的视频,采用同样的编码器cbr和接口配置,出来的码率就不一致。后来一看,这次出来的bdrate差异特别小,而原始编码器和对比编码器的出来的码率和psnr也是一致的。奇了怪了,那根据理论来说,psnr-bdrate只和四个因素有关啊(参考编码器码率,参考编码器psnr。测试编码器码率,测试编码器psnr),这四个都两两对应相同,怎么不是0呢???
原因
经过仔细排查,主要问题出在 np.polyval这个函数上。
临时有事,留个坑,下班后来填