1.视频质量评价分类
(1).视频质量评价分为主观评价和客观评价
其中通过人眼观察得出的视频质量评价为主观评价,通过算法和视觉模型推算出的视频质量评价为客观评价。因为主观评价需要耗费大量的人力资源和时间成本,在工业领域大规模使用不太现实,因此根据人眼视觉系统特性建立视频质量评价模型,在此基础上由计算机自动完成视频质量评价。
(2).按照对原始视频的依赖程度,视频质量评价方法分为三类:
全参考方法(Full Reference,FR)、部分参考方法(Reduce Reference,RR)和无参考方法(No Reference,NR)。全参考方法需要完整的原始视频,部分参考方法则利用原视频相关的部分信息,而无参考方法只根据待评价视频得出视频质量。目前大部分的视频评价方法都是全参考方法并取得了一定的进展,单是全参考方法依赖没有失真的原始视频,有很大的传输带宽限制,一般都只能运用于视频编码阶段进行编码优化。无参考方法则无需原始视频信息,直接根据待评价视频的信息评价视频质量,具有更好的灵活性和通用性,以及更广泛的应用价值,目前已经是视频质量评价领域的研究热点。
(3).使用哪个
由于无参考方法目前尚处于研究阶段,没有特别好的算法模型和成熟的商用版本,一些研究成果也没法找到相应的源码、lib包,所以我们主要讨论下全参考方法的视频质量评估。
2.全参考视频质量评价
最常用的全参视频质量评价方法有如下几种:
PSNR(峰值信噪比):用得最多,但是其值不能很好地反映人眼主观感受。一般取值范围:20-40.值越大,视频质量越好。
SSIM(结构相似性):计算稍复杂,其值可以较好地反映人眼主观感受。一般取值范围:0-1.值越大,视频质量越好。
MSE(均方误差)
由于这几个算法得出的评价与主观感受有时候相差较大,Netflix发布了自己的质量评价体系VMAF(Visual Multimethod Assessment Fusion),此次介绍的也就是VMAF。
下载地址:
https://github.com/Netflix/vmaf
(1).通行视频质量评价方法的局限:
评价一个编码后的视频流与压缩前的视频流质量对比值,通行的方法是PSNR(峰值信噪比),或者SSIM(结构相似度)。这些是客观评价方法。这些方法评价的结果与主观的感受有时候相差很大,请看下图(来自Netflix 的官网):
图一
上面四幅图,取自4幅静态画面,畸变程度不一样。用PSNR指标来评分,上面两幅图的PSNR值大约为31dB, 下方两个的PSNR值约为34dB,这表明上面两幅图PNSR 值相当,下面两幅图的PSNR值也相当。如果让人眼来主观评价呢,对于左侧上下两幅“人群”图片,很难察觉有何差异,但是右侧两幅“狐狸”视频的差异就很明显了。Netflix综合不同观众的评价,对上下两个“人群”给出的主观分数是82(上方)和96(下方),而两个“狐狸”的分数分别是27(上方)和58(下方)。
上面的示例说明PSNR一类的客观评价与实际的主观感受相差较大。这说明这种方法不足以全面正确的评价视频的质量,为此Netflix 决定寻找新的方法。
3.Neflix对视频源特性的分析:
(1).收集与用例密切相关的数据集:
虽然针对视频质量指标的设计和测试已经有可以公开使用的数据库,但这些数据库的内容缺乏多样性。而多样性正是流媒体服务的最大特点。由于视频质量的评估远不仅仅是压缩失真的评估,所以应该考虑更广范围的画质损失,不仅有压缩导致的损失,还有传输过程中的损失、随机噪声,以及几何变形等情况。
(2).视频源的特性:
作为流媒体公司, Netflix 提供了适合各类人群观看的大量影视内容,例如儿童内容、动漫、动作片、纪录片,视频讲座等. 另外这些内容还包含各种底层源素材特征,例如胶片颗粒、传感器噪声、计算机生成的材质、始终暗淡的场景或非常明亮的色彩等。过去通行的质量指标并没有考虑不同类型的源内容,如动漫或者视频讲座一类,也未考虑胶片颗粒,而在专业娱乐内容中这些都是非常普遍的信号特征。
(3).失真的来源:
一般而言,流播视频是通过TCP传输的,丢包和误码绝对不会导致视觉损失。这就使得编码过程中的两类失真最终影响到观众所感受到的体验质量(QoE):压缩失真以及缩放失真。
为了针对不同的用例构建数据集,Netflix选择了34个源短片作为样本(参考视频),每个短片长度是6秒,主要来自于流行的电视剧和电影。源短片包含具备各种高级特征的内容(动漫、室内/室外、镜头摇移、面部拉近、人物、水面、显著的物体、多个物体)以及各种底层特性(胶片噪声、亮度、对比度、材质、活动、颜色变化、色泽浓郁度、锐度)。将这些源短片编码为H.264/AVC格式的视频流,分辨率介于384x288到1920x1080之间,码率介于375kbps到20,000kbps之间,最终获得了大约300个畸变(Distorted)视频。这些视频涵盖了很大范围的视频码率和分辨率,足以反映实际生活中多种多样的网络环境。
接着,通过主观测试确定非专业观察者对于源短片编码后视频画质损失的评价。参考视频和畸变视频将按顺序显示在家用级别的电视机上。如果畸变视频编码后的分辨率小于参考视频,则会首先放大至源分辨率随后才显示在电视上。将所有观察者针对每个畸变视频的分数汇总在一起计算出微分平均意见分数(Differential Mean Opinion Score)即DMOS,并换算成0-100的标准分,其中100分是指参考视频的分数。
4.评价的结果:
Netflix 推出了二维散点图来说明上面分析的结果,我从中选取四幅有代表性的散点图。
散点图中,横轴对应了观察者给出的DMOS分数,纵轴对应了不同质量指标预测的分数。每一个点代表了一个畸变视频。我们为下列四个指标绘制了散点图:
PSNR亮度分量(Luminancecomponent)
SSIM
Multiscale FastSSIM
PSNR-HVS
图二
注意:相同颜色的点对应了畸变视频和相应参考视频的结果。从图中可以看出,这些指标的分数与观察者给出的DMOS分数并非始终一致。以左上角的PSNR图为例,PSNR值约为35dB,而“人工校正”的DMOS值的范围介于10(存在恼人的画质损失)到100(画质损失几乎不可察觉)之间。
上图中的专有名词:
斯皮尔曼等级相关系数(Spearman’srank correlation coefficient,SRCC)
皮尔森积差相关系数(Pearsonproduct-moment correlation coefficient,PCC)
上面的SRCC, PCC属于概率统计的概念,可以参考相关文档,这两个值越大越好。
为了找到一个有效的评价标准,必须选定一个有效的指标,指标必须呈现与DMOS 有限的单调性。下图中选定了三个典型的参考视频:一个高噪声视频,一个CG动漫,一个电视剧,并用每个视频的不同畸变版本的预测分数与DMOS分数创建散点图。为了获得有效的相对质量分数,我们希望不同视频短片在质量曲线的相同范围内可以实现一致的斜率(Slope)。
PSNR散点图中,在34dB到36dB的范围内,电视剧PSNR数值大约2dB的变化对应的DMOS数值变化约为50(50到100),但CG动漫同样范围内类似的2dB数值变化对应的DMOS数值变化低于20(40到60)。虽然CG动漫和电视剧短片的SSIM和FastSSIM体现出更为一致的斜率但表现依然不够理想。
简单总结来说,传统指标不适合用来评价视频质量。为了解决这一问题,我们使用了一种基于机器学习的模型设计能真实反映人对视频质量感知情况的指标。下文将介绍这一指标。
5. VMAF 方法:
基本想法:
面对不同特征的源内容、失真类型,以及扭曲程度,每个基本指标各有优劣。通过使用机器学习算法(支持向量机(Support Vector Machine,SVM)回归因子)将基本指标“融合”为一个最终指标,可以为每个基本指标分配一定的权重,这样最终得到的指标就可以保留每个基本指标的所有优势,借此可得出更精确的最终分数。我们还使用主观实验中获得的意见分数对这个机器学习模型进行训练和测试。
VMAF可在支持向量机(SVM)回归因子中使用下列基本指标进行融合:
1.视觉信息保真度(Visual Information Fidelity,VIF):
VIF是一种获得广泛使用的图像质量指标,在最初的形式中,VIF分数是通过将四个尺度(Scale)下保真度的丢失情况结合在一起衡量的。在VMAF中我们使用了一种改进版的VIF,将每个尺度下保真度的丢失看作一种基本指标。
2.细节丢失指标(Detail LossMetric,DLM):
LM是一种图像质量指标,其基本原理在于:分别衡量可能影响到内容可见性的细节丢失情况,以及可能分散观众注意力的不必要损失。这个指标最初会将DLM和Additive Impairment Measure(AIM)结合在一起算出最终分数。
3.运动:
这是一种衡量相邻帧之间时域差分的有效措施。计算像素亮度分量的均值反差即可得到该值。
下列散点图对所选参考短片(高噪声视频、CG动漫、电视剧)得出的VMAF指标分数。为了方便对比,我们也附上了上文提到的结果最理想的PSNR-HVS指标散点图。无疑VMAF的效果更好。
6.VMAF在Mac系统下的安装和编译
1.下载homebrew并安装
2.安装python
vmaf的核心库用c编写,而其余的功能性脚本由Python编写,所以需要安装Python(支持Python3以下版本)
brew install gcc freetype pkg-config homebrew/core/hdf5 python@2
接下来安装Python的各种功能包
brew install numpy scipy
pip install matplotlib notebook pandas sympy nose scikit-learn scikit-image h5py sureal
安装完成后在终端中输入如下指令,用来检测各种pkg包是否安装成功
python -c 'import numpy as pkg; print(pkg.__version__); print(pkg.__file__)'
python -c 'import scipy as pkg; print(pkg.__version__); print(pkg.__file__)'
python -c 'import matplotlib as pkg; print(pkg.__version__); print(pkg.__file__)'
python -c 'import pandas as pkg; print(pkg.__version__); print(pkg.__file__)'
python -c 'import sklearn as pkg; print(pkg.__version__); print(pkg.__file__)'
python -c 'import skimage as pkg; print(pkg.__version__); print(pkg.__file__)'
python -c 'import h5py as pkg; print(pkg.__version__); print(pkg.__file__)'
python -c 'import sureal as pkg; print(pkg.__version__); print(pkg.__file__)'
3.安装vmaf
Python安装完成后,开始安装vmaf
git clone https://github.com/Netflix/vmaf.git
cd vmaf
make
将python/src子目录添加到PYTHONPATH环境变量中
export PYTHONPATH="$(pwd)/python/src:$PYTHONPATH"
也可以通过写入到文件~/.bash_profile中来永久写入到环境变量中
echo export PYTHONPATH="$(pwd)/python/src:$PYTHONPATH" >> ~/.bash_profile
source ~/.bash_profile
至此vmaf就安装完成,下面开始测试是否安装成功
4.测试
在终端中输入指令:
./unittest
所有测试全部成功完成就说明vmaf安装成功。
vmaf 源码里带了一些用于测试的视频,验证一下评分功能:
./run_vmaf yuv420p 576 324 \
python/test/resource/yuv/src01_hrc00_576x324.yuv \
python/test/resource/yuv/src01_hrc01_576x324.yuv \
--out-fmt json
# 执行成功有以下输出
...
],
"aggregate": {
"VMAF_feature_adm2_score": 0.9345878041226809,
"VMAF_feature_motion2_score": 3.8953518541666665,
"VMAF_feature_vif_scale0_score": 0.36342081156994926,
"VMAF_feature_vif_scale1_score": 0.7666473878461729,
"VMAF_feature_vif_scale2_score": 0.8628533892781629,
"VMAF_feature_vif_scale3_score": 0.9159718691393048,
"VMAF_score": 76.69927060701059,
"method": "mean"
}
}
从输出可以看出对转码前和转码后的两个视频逐帧比较,从 6 个维度评分,最后是总分 VMAF_score 。