使用 FFmpeg 计算 PSNR、VMAF、SSIM

在本文中,让我们学习使用 FFmpeg 计算 VMAF、PSNR 和 SSIM。在处理视频(压缩或后处理)时,除了进行主观视觉质量测试外,还经常计算客观指标。如果您在工作流程中使用 FFmpeg,则计算这些指标非常容易。

什么是 VMAF?

来自 Netflix 的 VMAF 代表 Video Multi-method Assessment Fusion,它是一种将人类视觉建模与机器学习相结合的视频质量指标。它变得非常流行,因为它成功地(不是完全地)自动化了通常需要人类观看和评分视频的主观质量测试。FFmpeg 和 Netflix 的 VMAF 现在是每个视频处理和压缩工程师工具箱的一部分。

如何使用 FFmpeg 计算 VMAF

让我们看看计算 VMAF 的几种方法。

如果您的源视频和目标视频具有相同的尺寸(高度和宽度),那么您可以使用下面的命令行直接计算 VMAF 值。

您需要做的就是将 FFmpeg 指向 VMAF 模型文件的位置,剩下的就交给它了。

ffmpeg.exe -i videoToCompare.mp4 -i originalVideo.mp4 -lavfi libvmaf="model_path=vmaf_v0.6.1.pkl":log_path=vmaf_logfile.txt -f null -

但是,如果源视频和目标视频的分辨率不同,则您必须在计算 VMAF 之前确保目标与源视频的分辨率相同。

这是一个简单的单行代码,它使用filter_complex进行分辨率更改,然后计算 VMAF 值。我已经使用bicubic过滤器进行向上/向下缩放。

bin/ffmpeg -i test_720p30.mp4 -i test_1080p30.mp4 -filter_complex "[0:v]scale=1920x1080:flags=bicubic[main]; [1:v]scale=1920x1080:flags=bicubic,format=pix_fmts=yuv420p,fps=fps=30/1[ref]; \
[main][ref]libvmaf=psnr=true:log_path=vmaflog.json:log_fmt=json" \
-f null -

VMAF 计算生成的日志文件非常全面。它提供了 VMAF 及其组成指标的逐帧分数,以及总分(如果您只需要这些)。

这是 VMAF 文件的示例。

  • vmaf/model模型:根据测试场景的不同选择不同的下载模型,默认为vmaf_v0.6.1.json
  • VMAF 分数。VMAF 分数将使用我们选择的模型为我们提供分数,因此它实际告诉我们的内容会根据模型而有所变化。
    • 对于模型,它在“客厅环境”中预测 1080p 显示器上的视频质量,并假设人的观看距离是屏幕高度的 3 倍(25 厘米显示器/电视高度 = 75 厘米观看距离)
    • 20 分表示非常差,100 分表示非常好(完美无瑕)。我会认为任何高于 80 的东西都非常好,高于 90 则与参考非常接近完美/无法区分。

在这里插入图片描述
在这里插入图片描述

查看EasyVMAF – 一种简化 VMAF 计算的工具。

什么是 PSNR,它是如何计算的?

来自维基百科,

峰值信噪比,通常缩写为 PSNR,是一个工程术语,表示信号的最大可能功率与 影响其表示保真度的 破坏性 噪声功率之间的比率 。

因此,对于视频,您实际上是在尝试计算由于视频压缩过程引入了多少噪声或像素损坏,而视频压缩过程本质上是有损的(主要是由于量化)。

第一步是计算均方误差或 MSE。公式如下所示,其中I和K分别代表原始图像和目标图像,m并且分别n是图像的高度和宽度。

获得 MSE 后,您可以使用下面显示的公式计算 PSNR。

这里, MAX I 是图像的最大可能像素值。当像素使用每个样本 8 位表示时,这是 255。

如何使用 FFmpeg 计算 PSNR?

使用 FFmpeg 时,您不必进行所有这些计算。您只需要使用滤波器模块lavfi并告诉它计算 PSNR。就是这样。

ffmpeg.exe -i videoToCompare.mp4 -i originalVideo.mp4 -lavfi psnr=stats_file=psnr_logfile.txt -f null -

FFmpeg 将在控制台上打印平均 PSNR,而日志文件将包含 MSE 的逐帧列表以及亮度和色度平面(y、u 和 v)的 PSNR。一个例子如下所示 -

n:1 mse_avg:54.96 mse_y:72.51 mse_u:27.98 mse_v:11.74 psnr_avg:30.73 psnr_y:29.53 psnr_u:33.66 psnr_v:37.43 
 n:2 mse_avg:69.70 mse_y:93.80 mse_u:31.01 mse_v:12.02 psnr_avg:29.70 psnr_y:28.41 psnr_u:33.22 psnr_v:37.33 
 n:3 mse_avg:72.74 mse_y:98.37 mse_u:31.02 mse_v:11.96 psnr_avg:29.51 psnr_y:28.20 psnr_u:33.21 psnr_v:37.35 
 n:4 mse_avg:73.11 mse_y:98.94 mse_u:31.14 mse_v:11.76 psnr_avg:29.49 psnr_y:28.18 psnr_u:33.20 psnr_v:37.43

如何使用 FFmpeg 计算 SSIM?

最后,我们来看看使用FFmpeg计算SSIM。再看SSIM定义

结构相似性指数度量(SSIM)是一种用于预测数字电视和电影图片以及其他类型的数字图像和视频的感知质量的方法。SSIM 用于测量两幅图像之间的相似度。SSIM 指数是一个 完整的参考指标;换言之,图像质量的测量或预测 是以初始未压缩或无失真图像为参考的。

使用 FFmpeg 计算 SSIM 与计算 PSNR 非常相似。

ffmpeg.exe -i videoToCompare.mp4 -i originalVideo.mp4 -lavfi ssim=stats_file=ssim_logfile.txt -f null -

此命令的输出将如下所示 -

[Parsed_ssim_0 @ 0000029c82894300] SSIM Y:0.926845 (11.357537) U:0.876798 (9.093807) V:0.860658 (8.559193) All:0.907472 (10.337287)

日志文件将为您提供有关每个平面(Y、U 和 V)的 SSIM 值以及视频每个帧的聚合信息。

n:1 Y:0.930033 U:0.926453 V:0.913508 All:0.926682 (11.347897)
 n:2 Y:0.919140 U:0.915343 V:0.910900 All:0.917134 (10.816226)
 n:3 Y:0.922417 U:0.915795 V:0.910959 All:0.919404 (10.936853)
 n:4 Y:0.920077 U:0.916443 V:0.912994 All:0.918291 (10.877300)
 n:5 Y:0.926438 U:0.927597 V:0.917905 All:0.925209 (11.261518)
 n:6 Y:0.920619 U:0.919988 V:0.918780 All:0.920207 (10.980375)

结论

就是这样,伙计们 - 现在您知道如何计算三个非常重要的视频质量评估客观指标 — PSNR、VMAF 和 SSIM。通过计算所有三个并使用它们进行分析,很难被一个指标可以捕获而另一个指标不能捕获的工件所抛弃。

和往常一样,在完成客观分数后,请花几分钟时间做一些视觉测试(主观)!

 

转载:https://zhuanlan.zhihu.com/p/426862770

转载:https://blog.csdn.net/frankieweeee/article/details/124555524

 

posted @ 2023-01-12 09:42  Oontinue  阅读(2337)  评论(0编辑  收藏  举报