視頻質量評測標準——VMAF

阿里雲視頻雲直播轉碼天天都會處理大量的不一樣場景、不一樣編碼格式的直播流。爲了保證高畫質,團隊藉助VMAF標準來對每路轉碼的效果作質量評估,而後進行反饋、調優、迭代。這麼作的緣由在於,像動做片、紀錄片、動畫片、體育賽事這些場景,影響畫質的因素各不相同,基於VMAF的視頻質量反饋機制,能夠在保證畫質的前提下,對不一樣的場景作針對性優化,達到畫質最優、成本最低的效果。本文由阿里雲視頻雲高級開發工程師楊洋撰寫,旨在分享VMAF的核心模塊與技術實踐。python

背景

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

VMAF 介紹

VMAF(Video Multimethod Assessment Fusion)由Netflix開發並開源在Github上,基本想法在於,面對不一樣特徵的源內容、失真類型,以及扭曲程度,每一個基本指標各有優劣。經過使用機器學習算法(SVM)將基本指標「融合」爲一個最終指標,能夠爲每一個基本指標分配必定的權重,這樣最終獲得的指標就能夠保留每一個基本指標的全部優點,藉此可得出更精確的最終分數。Netfix使用主觀實驗中得到的意見分數對這個機器學習模型進行訓練和測試。VMAF主要使用了3種指標:visual quality fidelity(VIF)、detail loss measure(DLM)、temporal information(TI)。其中VIF和DLM是空間域的也即一幀畫面以內的特徵,TI是時間域的也即多幀畫面之間相關性的特徵。這些特性之間融合計算總分的過程使用了訓練好的SVM來預測。工做流程如圖:github

VMAF 核心模塊

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

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

• Asset

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

• Executor

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

• 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。

建立新的數據集

首先,按照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的標準分,分數越高表示主觀感覺越好。

驗證數據集

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

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

訓練新的模型

驗證完數據集沒問題後,即可以基於數據集,訓練一個新的質量評估模型。

./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文件。

交叉驗證

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

自定義特徵和迴歸因子

vmaf具備很好的可擴展性,不只能夠訓練私有的model,也能夠定製化或插入第三方的特徵屬性、SVM迴歸因子。

經過feature_param_file類型文件,支持自定義或插入第三方特徵,須要注意的是全部的新特徵必需要是FeatureExtractor子類。相似的,也能夠經過param_model_file類型文件,自定義或插入一個第三方的迴歸因子。一樣須要注意的是,全部建立的新因子,必須是TrainTestModel子類。

因爲Netflix沒有開放用於訓練的數據集,我的以爲,受制於數據集DMOS準確性、數據集樣本的量級等因素,經過自建數據集訓練出普適的model仍是挺不容易滴~

最後,附上VMAF Github地址:https://github.com/Netflix/vmaf

相關文章
相關標籤/搜索