揭祕 VMAF 視頻質量評測標準

作者:楊洋,阿里雲技術專家,從事直播相關媒體處理引擎開發

背景

圖像質量的衡量是個老問題,對此人們提出過很多簡單可行的解決方案。例如均方誤差(Mean-squared-error,MSE)、峯值信噪比(Peak-signal-to-noise-ratio,PSNR)以及結構相似性指數(Structural Similarity Index,SSIM),這些指標最初都是被用於衡量圖像質量的,隨後被擴展到視頻領域。
這些指標通常會用在循環用在編碼內部,可用於對編碼決策進行優化並估算最終編碼後視頻的質量。但是由於這些算法衡量標準單一,缺乏對畫面前後序列的總體評估,導致計算的結果很多情況下與主觀感受並不相符。

視頻質量

阿里雲視頻雲每天都會生產、處理大量來自不同應用場景、不同編碼類型的視頻數據。除了採用窄帶高清等技術以外,我們還會藉助 VMAF 標準對處理後的視頻做質量評估,形成 媒體生產-->畫質評估-->編碼優化-->產品迭代 的技術閉環。基於這套反饋機制,對不同的場景做針對性優化,達到畫質最優、成本最低的效果。

VMAF 介紹

面對不同特徵的源內容、失真類型,以及扭曲程度,每個基本指標都各有優劣,缺少一個通用的、能反應主觀意識的畫質評估手段。VMAF (Video Multimethod Assessment Fusion) 由 Netflix 開發並開源,利用大量的主觀數據作爲訓練集,通過機器學習的手段將不同評估維度的算法進行“融合”,得到一個能準確反映主觀意志的畫質評價標準。
VMAF 主要包括3種指標:visual quality fidelity(VIF)、detail loss measure(DLM)、temporal information(TI)。其中 VIF 和 DLM 是空間域的也即一幀畫面之內的特徵,TI 是時間域的也即多幀畫面之間相關性的特徵。這些特性之間融合計算總分的過程使用了訓練好的 SVM 來預測。
工作流程如圖:
file


VMAF 模型分析

VMAF 默認提供了 vmaf_float_v0.6.1.pkl 模型,可以分爲 HDTV、Phone、4K 超分辨率三種使用模式,滿足不同播放場景下的畫質評測需求。

1.HDTV 模式

HDTV 是針對客廳電視的場景設計的,參照 SMPTE EG-18-1994 標準,所有訓練集的主觀數據 (EMOS) 是遵循這種方式收集的:將視頻 scale 成 1080p,並以三倍於屏幕高度 (3H) 的觀看距離或 60 像素/度的角度分辨率進行顯示。
可以說,VMAF 模型試圖捕捉的是 3H 外顯示的 1080p 視頻的感知質量。這是默認 VMAF 模型的隱含假設。因此,我們在對除 1080p 以外的其他分辨率進行 VMAF 計算時,需要將視頻先 scale 成1080p,才能保證結果的準確性。

file

試想一下,如果將一個 480p 的視頻用 HDTV 模式來做評測,會發生什麼情況呢?這就好像 480p 視頻是從 1080p 視頻中剪切出來的一樣。如果 480p 視頻的高度爲 H ',則 H = 1080 / 480 * H ',其中 H 爲所顯示的 1080p 視頻的高度。因此,VMAF 建模的是 3H = 6.75H ' 的觀看距離。
換句話說,如果你計算 480p 分辨率的視頻對的 VMAF,你將預測觀看距離是其高度的 6.75 倍時的感知質量。在此觀看距離會隱藏大量主觀畫質的感知細節,從而讓 VMAF 分數可能偏高。

2.Phone 模式

默認的 vmaf_float_v0.6.1.pkl 模型也提供了移動設備場景的畫質評估功能,可以通過參數 “--phone-model” 開啓。在此模式下,每個受試者在他/她感到舒適的距離觀看視頻。
在訓練過的模型中,分數在 0 - 100 之間,與主觀投票量表呈線性關係,粗略的 “bad” 映射爲20分,“excellent” 映射爲 100 分。
橫向對比可以發現,如果將一部 540p 的視頻分別放在標準電視、手機設備、4K 設備顯示,在手機設備上的 VMAF 質量會比其他兩者更快的逼近 100 分的臨界值。

file

3. 4K 模式

由於 vmaf_float_v0.6.1.pkl 模型的訓練集中包括了 4K 和 1080p 的視頻源,當需要對比 A/B 兩個 4K 視頻哪一個畫質更好時,也能使用此模型。
但是由於默認模型採用的是 1080p + 3H 觀看距離的方式採集的 EMOS 數據,無法算出準確的 4K VMAF 分數。Netflix 後來專門提供了 vmaf_4k_v0.6.1.pkl 用於 4K 的畫質評估。

VMAF 核心模塊

VMAF 基於 SVM 的 nuSvr 算法,在運行的過程中,根據事先訓練好的 model,賦予每種視頻特徵以不同的權重。對每一幀畫面都生成一個評分,最終以均值算法進行歸總(也可以使用其他的歸總算法),算出該視頻的最終評分。其中主要的幾個核心模塊如下:

file

VMAF 分別用 python 和 C++ 實現了兩套接口,同時提供了 C 版本的 lib 庫,最新版本的 ffmpeg 已經將 VMAF 作爲一個filter集成進去。
下面我們分析下各個模塊的作用:

Asset

一個 Asset 單元,包含了一個正在執行的任務信息。比如目標視頻與原始視頻的幀範圍,低分辨率視頻幀上採樣信息等(VMAF 會在特徵提取前通過上採樣的方式保證兩個視頻分辨率相同)。

Executor

Executor 會取走並計算 Asset 鏈表中每一個 Asset 單元,將執行結果返回到一個 Results 鏈表中。Executor 類是 FeatureExtractor 與 QualityRunner 的基類。它提供了一些基函數,包括 Results 的操作函數、FIFO 管道函數、clean 函數等。

Result

Result 是以 key-value 形式,將 Executor 執行的結果存儲起來。key 存儲的是 “FrameNum” 或者質量分數的類型(VMAF_feature_vif_scale0_score 或 VMAF_feature_vif_scale1_score 等),value 存儲的是一系列分值組成的鏈表。
Result 類也提供了一個彙總工具,將每個單元的質量分數彙總成一個值。默認的彙總算法是“均值算法”,但是 Result.set_score_aggregate_method() 方法允許定製其他的算法。

ResultStore

ResultStore 類提供了 Result 數據集的存儲、加載的能力。

FeatureExtractor

FeatureExtractor 是 Extractor 子類,專門用於從 Asset 集合中提取特徵,作爲基本的特徵提取類。任何具體的特徵提取接口,都繼承自 FeatureExtractor,例如 VmafFeatureExtractor/PsnrFeatureExtractor/SsimFeatureExtractor 等。

FeatureAssembler

FeatureAssembler 是一個聚合類,通過在構造函數傳入 feature_dict 參數,指定具體的特徵提取標準,將該標準提取出的特徵結果聚合,輸出到一個 BasicResult 對象中。FeatureAssembler 被 QualityRunner 調用,用來將提取後的特徵數組傳給 TrainTestModel 使用。

TrainTestModel

TrainTestModel 是任何具體的迴歸因子接口的基類,迴歸因子必須提供一個 train() 方法去訓練數據集,predict() 方法去預測數據集,以及 to_file(),frome_file() 方法去保存、加載訓練好的模型。
迴歸方程的超參數必須通過 TrainTestModel 的構造函數傳入。TrainTestModel 類提供了一些基礎方法,例如歸一化、反歸一化、評估預測性能。

CrossValidation

CrossValidation 提供了一組靜態方法來促進 TrainTestModel 訓練結果的驗證。因此,它還提供了搜索 TrainTestModel 最優超參的方法。

QualityRunner

QualityRunner 是 Executor 子類,用來評估 Asset 任務集合的畫質分數。任何用於生成最終質量評分的接口都應該繼承 QualityRunner。例如跑 vmaf 標準的 VmafQualityRunner,跑 psnr 標準的 PsnrQualityRunner 都是 QualityRunner 的子類。

自定義 VMAF

最新版本的 vmaf 提供了 1080p、4k、mobilephone 三種場景下的 model 文件。Netflix 號稱使用了海量的、多分辨率、多碼率視頻素材(高噪聲視頻、CG動漫、電視劇)作爲數據集,得到的這三組 model。在日常使用中,這三組 model 基本滿足需求了。不過,VMAF 提供了 model 訓練工具,可以用於訓練私有 model。

1.創建新的數據集

首先,按照 dataset 格式,定義數據集文件,比如定義一個 example_dataset.py:

dataset_name = 'example_dataset'
yuv_fmt = 'yuv420p'
width = 1920
height = 1080
ref_videos = [
{'content_id': 0,
'content_name': 'BigBuckBunny',
'path': ref_dir + '/BigBuckBunny_25fps.yuv'}
...
]
dis_videos = [{'asset_id': 0,
'content_id': 0,
'dmos': 100.0,
'path': ref_dir + '/BigBuckBunny_25fps.yuv',
}
...
]

ref_video 是比對視頻集,dis_video 是訓練集。每個訓練集樣本視頻都有一個主觀評分 DMOS,進行主觀訓練。SVM 會根據 DMOS 做有監督學習,所以 DMOS 直接關係到訓練後 model 的準確性。

PS: 將所有觀察者針對每個樣本視頻的分數彙總在一起計算出微分平均意見分數 (Differential Mean Opinion Score) 即 DMOS,並換算成 0-100 的標準分,分數越高表示主觀感受越好。

2.驗證數據集

./run_testing quality_type test_dataset_file [--vmaf-model optional_VMAF_model_path] [--cache-result] [--parallelize]

數據集創建後,用現有的 VMAF 或其他指標 (PSNR,SSIM) 驗證數據集是否正確,驗證無誤後才能訓練。

3.訓練新的模型

驗證完數據集沒問題後,便可以基於數據集,訓練一個新的質量評估模型。
./run_vmaf_training train_dataset_filepath feature_param_file model_param_file output_model_file [--cache-result] [--parallelize]

例如,
./run_vmaf_training example_dataset.py resource/feature_param/vmaf_feature_v2.py resource/model_param/libsvmnusvr_v2.py workspace/model/test_model.pkl --cache-result --parallelize

feature_param_file 定義了使用那些 VMAF 特徵屬性。例如:
feature_dict = {'VMAF_feature':'all', } 或 feature_dict = {'VMAF_feature':['vif', 'adm'], }

model_param_file 定義了迴歸量的類型和使用的參數集。當前版本的 VMAF 支持nuSVR 和隨機森林兩種機器算法,默認使用的 nuSVR。
output_model_file 是新生成的 model 文件。

4.交叉驗證

vmaf 提供了 run_vmaf_cross_validation.py 工具用於對新生成的 model 文件做交叉驗證。

5.自定義特徵和迴歸因子

vmaf 具有很好的可擴展性,不僅可以訓練私有的 model,也可以定製化或插入第三方的特徵屬性、SVM 迴歸因子。
通過 feature_param_file 類型文件,支持自定義或插入第三方特徵,需要注意的是所有的新特徵必須要是 FeatureExtractor 子類。類似的,也可以通過 param_model_file 類型文件,自定義或插入一個第三方的迴歸因子。同樣需要注意的是,所有創建的新因子,必須是 TrainTestModel 子類。

總結

一套普適的主觀質量評價標準,不僅要有時域、空域的多維度評價標準,符合主觀意識的融合算法,還要有大量有效的、符合標準規範的 EMOS 數據集。是一個需要長期投入,不斷迭代的優化過程。

「視頻雲技術」你最值得關注的音視頻技術公衆號,每週推送來自阿里雲一線的實踐技術文章,在這裏與音視頻領域一流工程師交流切磋。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章