天天看點

視訊品質評測标準——VMAF背景VMAF 介紹VMAF 核心子產品自定義VMAF

阿裡雲視訊雲直播轉碼每天都會處理大量的不同場景、不同編碼格式的直播流。為了保證高畫質,團隊借助VMAF标準來對每路轉碼的效果做品質評估,然後進行回報、調優、疊代。這麼做的原因在于,像動作片、紀錄片、卡通片、體育賽事這些場景,影響畫質的因素各不相同,基于VMAF的視訊品質回報機制,可以在保證畫質的前提下,對不同的場景做針對性優化,達到畫質最優、成本最低的效果。本文由阿裡雲視訊雲進階開發工程師楊洋撰寫,旨在分享VMAF的核心子產品與技術實踐。

背景

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

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來預測。工作流程如圖:

視訊品質評測标準——VMAF背景VMAF 介紹VMAF 核心子產品自定義VMAF

VMAF 核心子產品

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

視訊品質評測标準——VMAF背景VMAF 介紹VMAF 核心子產品自定義VMAF

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。

建立新的資料集

首先,按照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

阿裡雲開年Hi購季,視訊直播、視訊點播、CDN全線折扣,錯過這次,再等一年! 點選了解活動詳情

視訊品質評測标準——VMAF背景VMAF 介紹VMAF 核心子產品自定義VMAF
視訊品質評測标準——VMAF背景VMAF 介紹VMAF 核心子產品自定義VMAF

繼續閱讀