easyVMAF:在自然环境下运行VMAF
正文字數(shù):3970? 閱讀時長:6分鐘
VMAF是最受歡迎的視頻質(zhì)量評估工具之一,它正在成為視頻行業(yè)的標準參考度量標準。但是,運行VMAF在某些情況下可能會比較棘手,并導(dǎo)致錯誤的結(jié)果。在本文中,客座作者Gabriel Davila Revelo向我們介紹了一個工具(easyVMAF),他開發(fā)的這個工具使得VMAF計算變得更加簡單和直觀。
作者 /?Gabriel Dávila Revelo
原文鏈接 / https://ottverse.com/vmaf-easyvmaf/
VMAF是一個完整的參考指標,用于比較參考(或源)和失真的視頻序列來預(yù)測主觀視頻質(zhì)量。
VMAF的優(yōu)勢在于它試圖模仿觀看者的感知(或人類視覺系統(tǒng)),而不是純粹的客觀指標(例如PSNR或SSIM)。有關(guān)VMAF的詳細說明,請閱讀Netflix官方博客。
在開源社區(qū)的參與下,VMAF上已經(jīng)構(gòu)建了一些第三方工具。因此,可以通過幾個開源軟件包(例如,VMAF python庫,VMAFossexec(C可執(zhí)行文件),VMAF docker映像,libvmaf(C庫)以及通過libvmaf編譯的FFmpeg)來獲得VMAF。
注意:您可以在OTTVerse.com上找到FFmpeg,VMAF的安裝過程以及用法。
盡管可以使用多種工具來計算VMAF,但要遵守VMAF工具所施加的嚴格要求,通常是具有挑戰(zhàn)性的。其中一些要求如下:
參考視頻和失真視頻需要進行幀同步。掃描模式(隔行/逐行)必須匹配;他們必須有相同的持續(xù)時間;它們必須具有相同的幀速率。
參考視頻和失真視頻的分辨率必須匹配,這通常需要強大的上/下縮放程序。
因此,實際上,如果參考視頻和失真視頻不滿足上述要求,則必須對視頻進行規(guī)范化/均衡處理。
在本教程中,我們將使用基于FFmpeg的示例介紹一系列建議,以向您展示如何使用VMAF標準化流。
最后,我們介紹了easyVMAF,這是一個開源工具,可以自動執(zhí)行您的VMAF計算。
在接下來的幾節(jié)中,我們將逐步處理(i)視頻縮放的基礎(chǔ),(ii)幀同步,(iii)最后;我們講談?wù)揺asyVMAF。
為了保持文章的長度合理,我們只展示一些基本的例子。要獲得完整的用例,請訪問:https://github.com/gdavila/easyVMAF
閑話少說,讓我們開始吧!
從縮放視頻的分辨率到右邊的VMAF模型
現(xiàn)如今可用的VMAF實現(xiàn)支持三種模型:HD,4K和Phone。
每種模型均由Netflix的團隊進行了訓(xùn)練,考慮了不同的情況,例如屏幕尺寸大小,分辨率和觀眾與顯示設(shè)備的距離。
因此,VMAF規(guī)范要求視頻分辨率必須與每種模式預(yù)期的視頻分辨率相匹配(請參閱此處的第一個常見問題解答):
HD和Phone型號需要1920x1080視頻作為輸入
4K型號需要3840x2160作為輸入
在FFmpeg尺度濾波器中,利用雙三次插值可以解決源視頻與目標視頻分辨率不匹配的問題。
例如,要使用HD模型(VMAF_v0.6.1.pkl),我們需要通過使用以下FFmpeg命令來縮放失真的視頻(如果不是1920x1080)。
ffmpeg -i <distorted> -i <reference> -lavfi "[0:v]scale=1920:1080:flags=bicubic[distorted];[distorted][1:v]libvmaf=model_path=/usr/local/share/model/VMAF_v0.6.1.pkl" -f null -同樣,要使用4K模型,我們需要將失真的視頻縮放到3840x2160。
ffmpeg -i <distorted> -i <reference> -lavfi "[0:v]scale=3840:2160:flags=bicubic[distorted];[distorted][1:v]libvmaf=model_path=/usr/local/share/model/VMAF_4k_v0.6.1.pkl" -f null -上面的例子考慮到了參考視頻已經(jīng)匹配了VMAF模型所期望的分辨率。
如果不是這樣,你也可以應(yīng)用相同的scalefilter的參考:
ffmpeg -i <distorted> -i <reference> -lavfi "[0:v]scale=3840:2160:flags=bicubic[distorted];[1:v]scale=3840:2160:flags=bicubic[reference];[distorted][reference]libvmaf=model_path=/usr/local/share/model/VMAF_4k_v0.6.1.pkl" -f null -幀同步
VMAF要求參考和失真視頻之間的幀同步,因此必須保證幀速率、掃描模式和視頻持續(xù)時間匹配
下面是實現(xiàn)幀同步的方法。
掃描模式不匹配
傳統(tǒng)上將H.264 / AVC實時信號源設(shè)置為隔行掃描模式,但是一旦它通過OTT轉(zhuǎn)碼器,則輸出通常為逐行模式。因此,如果我們想要計算VMAF,我們首先需要規(guī)范化掃描模式。
鑒于VMAF模型是使用逐行掃描模式訓(xùn)練的,建議始終對隔行掃描輸入進行隔行掃描消除。
掃描模式的規(guī)范化可以由FFmpeg通過使用yadif過濾器完成:
ffmpeg -i <distorted> -i <reference> -lavfi "[1:v]yadif=0:-1:0[ref];[0:v][ref]libvmaf=model_path=/usr/local/share/model/VMAF_v0.6.1.pkl" -f null -上面的命令行假設(shè)參考流是隔行掃描的,因此它通過選項mode:parity:deint = 0:-1:0傳遞給yadif過濾器。這意味著:
0:輸入中每一幀輸出一幀
-1:啟用對字段奇偶校驗的自動檢測
0:對所有幀進行去隔行處理
因此,如果在隔行掃描模式下濾波器輸入的幀率為29.97i,那么yadif濾波器在逐行掃描模式下將輸出29.97p。
這是交錯源最典型的轉(zhuǎn)換方法,但您也可以嘗試其他選項。例如,yadif=1:-1:0將為相同的輸入生成59.94p的輸出。
幀速率不匹配
首先,您需要知道VMAF并不是通過訓(xùn)練來處理幀率轉(zhuǎn)換問題,因此在這里我們將強制輸入以人為地使用VMAF。
因此,應(yīng)謹慎使用scores,而不應(yīng)將其用作完全可靠的數(shù)值。
但是,即使在計算這個有偏分數(shù)的情況下也可能是有用的,因為實際上在ABR階梯上進行幀速率轉(zhuǎn)換是很常見的。
同樣,為了強制進行幀速率轉(zhuǎn)換,我們將使用另一個FFmpeg過濾器:
ffmpeg -i <distorted> -i <reference> -lavfi "[1:v]fps=fps=30[ref];[0:v][ref]libvmaf=model_path=/usr/local/share/model/VMAF_v0.6.1.pkl" -f null -fps過濾器允許您通過添加新幀(通過復(fù)制幀)或丟棄它們來設(shè)置幀速率,直到達到所需的值。
我們寧愿保留未修改的reference,只對失真的視頻應(yīng)用filter。
起始幀不匹配
有時,參考視頻可能會從與失真序列不同的幀開始。
“起始幀”中的這種不匹配將導(dǎo)致兩個序列之間的偏移,并導(dǎo)致錯誤的VMAF scores。
為了正確計算VMAF分數(shù),我們需要同步對齊參考視頻和失真視頻的前幾幀。一種方法是修剪未對齊的視頻序列,直到實現(xiàn)幀同步為止。
我們可以使用FFmpeg的修剪過濾器(filter)對視頻進行修剪,并確保輸出將包含輸入的連續(xù)子集。
但是首先,我們需要確定在參考視頻序列和失真視頻序列中都匹配的幀子集的起點和持續(xù)時間。這里的挑戰(zhàn)是找到我們應(yīng)該傳遞給微調(diào)濾波器的正確起點。
為了解決這個問題,我們提出了一種基于PSNR的方法,該方法迭代計算失真視頻和參考視頻之間的PSNR,直到找到匹配項為止。
詳細信息
1. 首先,我們提取兩個視頻樣本,由失真視頻序列和參考視頻序列的前m幀組成,并計算它們之間的峰值信噪比PSNR。這是第一次迭代的后果。我們建議您僅使用少量幀(即m)以降低計算成本。
2. 在第二次迭代中,我們重新計算了PSNR,但將失真的子樣本向前滑動了1幀,然后再次計算了PSNR。
3. 這個重復(fù)“滑動和計算PSNR”的過程將重復(fù)n次,其中n是SyncWindow中適合的視頻幀數(shù)。SyncWindow是一個持續(xù)時間,我們希望在這個持續(xù)時間內(nèi)找到正確的同步值。
4. 如果幸運的話(如果正確選擇了SyncWindow),我們將在過程結(jié)束時看到最佳PSNR在第i個幀上。這意味著扭曲序列的第i幀與參考的第1幀匹配。
在此過程結(jié)束時,我們有足夠的信息來應(yīng)用修剪濾鏡。
下圖顯示了先前描述的迭代。在每次迭代(i)時,都會在reference_subsample和distorted_subsample_i之間計算PSNR。
實際上,每一次迭代的PSNR計算可以如下進行-
while <distorted_subsample_i.1st_frame> IN <SYNC_WINDOW>: getPSNR(reference_subsample, distorted_subsample_i) <distorted_subsample_i>.next_frame()可以使用FFmpeg實現(xiàn)getPSNR()函數(shù),如下所示。
ffmpeg -i <distorted> -i <reference> \ -lavfi "[0:v]trim=start=<OFFSET>:duration=<M>,setpts=PTS-STARTPTS[distorted_subsample];\ [1:v]trim=start=0:duration=<M,setpts=PTS-STARTPTS[reference_subsample];\ [distorted_subsample][reference_subsample]psnr=stats_file=psnr.log" -f null -where
舉個例子,如果我們?yōu)閒ps = 30的視頻序列選擇<SYNC_WINDOW> value = 0.3秒,我們會得到如下結(jié)果:
iteration offset(s) psnr[dB] 1 0.0 21.098356 2 0.03333333333333333 21.132783 3 0.06666666666666667 21.167991 4 0.1 21.204151 5 0.13333333333333333 21.248292 6 0.16666666666666666 21.29118 *7 0.2 33.675342 8 0.23333333333333334 21.363845 9 0.26666666666666666 21.409776 10 0.3 21.451546根據(jù)這些值,在第7次迭代時得到最佳的PSNR。
因此,畸變序列的第7幀(距其開始0.2秒)與參考序列的第1幀匹配。
有了這些信息,我們就可以通過調(diào)整序列來使用FFmpeg計算VMAF。
ffmpeg -i <distorted> -i <reference> -lavfi "[0:v]trim=start=<OFFSET>,setpts=PTS-STARTPTS[distorted];[distorted][reference]libvmaf=model_path=/usr/local/share/model/VMAF_v0.6.1.pkl" -f null -在實踐中,有時我們還需要將持續(xù)時間參數(shù)傳遞給trim (trim=start=;duration=),以確保畸變序列和參考序列在秒內(nèi)具有相同的長度。
VMAF使用easyVMAF將它們組合在一起
到目前為止,我們使用一些簡單的示例討論了在計算VMAF之前對視頻進行預(yù)處理的過程。
但是,在實踐中,很常見的是,您需要同時應(yīng)用先前描述的所有或大部分歸一化,即,放大,去隔行,更改幀速率(例如,從29.97到30fps)并同步 時間維度中的扭曲和參考幀。
整個過程無需手動執(zhí)行,而是在easyVMAF中自動完成,easyVMAF是一個Python腳本,可以完成VMAF所需的規(guī)范化過程。
easyVMAF使用FFmpeg和FFprobe進行所有必要的視頻編輯和信息收集。它允許我們執(zhí)行去隔行掃描(Deinterlacing),上/下縮放,幀同步,幀速率適配。
下圖顯示了easyVMAF的高級概述。
如果您對easyVMAF感興趣,請訪問GitHub repo,在那里您可以查看Docker圖像或瀏覽源代碼。
請嘗試著在今天的視頻中嘗試一下!
如果您有任何建議,改進,或您想貢獻,請隨時提交PRs。
在結(jié)束本文之前,下面是運行Docker映像的過程以及命令行參數(shù)的說明。謝謝!
docker run --rm gfdavila/easyVMAF -h usage: easyVMAF [-h] -d D -r R [-sw SW] [-ss SS] [-subsample N] [-reverse] [-model MODEL] [-phone] [-verbose] [-output_fmt OUTPUT_FMT] Script to easily compute VMAF using FFmpeg. It allows to deinterlace, scale, and sync Ref and Distorted video samples automatically: Autodeinterlace: If the Reference or Distorted samples are interlaced, deinterlacing is applied Autoscale: Reference and Distorted samples are scaled automatically to 1920x1080 or 3840x2160 depending on the VMAF model to use Autosync: The first frames of the distorted video are used as a reference to do sync lookup with the Reference video. The sync is doing by a frame-by-frame lookup of the best PSNR See [-reverse] for more options for syncing As output, a json file with the VMAF score is created Optional arguments: -h, --help show this help message and exit -sw SW Sync Window: window size in seconds of a subsample of the Reference video. The sync lookup will be done between the first frames of the Distorted input and this Subsample of the Reference. (default=0. No sync). -ss SS Sync Start Time. Time in seconds from the beginning of the Reference video to which the Sync Window will be applied from. (default=0). -subsample N Specifies the subsampling of frames to speed up calculation. (default=1, None). -reverse If enabled, it Changes the default Autosync behaviour: The first frames of the Reference video are used as reference to sync with the Distorted one. (Default = Disable). -model MODEL VMAF Model. Options: HD, HDneg*, 4K. (Default: HD). -phone It enables VMAF phone models (HD only). (Default=disable). -verbose Activate verbose loglevel. (Default: info). -output_fmt OUTPUT_FMT Output VMAF file format. Options: json or xml (Default: json) required arguments: -d D Distorted video -r R Reference video * NOTE: HDneg is a VMAF experimental feature not supported yet by FFmpeg.LiveVideoStackCon 2020 SFO(線上峰會)倒計時?1?天!
LiveVideoStackCon 2020?美國舊金山站
北京時間:2020年12月11日-12月13日
點擊【閱讀原文】訪問直播頁面
總結(jié)
以上是生活随笔為你收集整理的easyVMAF:在自然环境下运行VMAF的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 旧金山站线上峰会24h倒数
- 下一篇: 标准的终极之战