機器學習在視頻編解碼中的探索

在 RTC 2018 實時互聯網大會上,Visionular Inc 聯合創始人兼首席科學家 Zoe Liu 進行了主題演講,與大家一起分享了一場視頻編解碼的前沿探索。

1

Why Video Codec Matters

大家都知道,從技術複雜度來講,視頻的編碼和解碼並不對稱,編碼器要比解碼器複雜很多。那麼,機器學習對編碼可以做哪些優化呢?

大家目前討論的比較多的是3個編碼標準:一個是 MPEG 組織的,一個是從 VP9 到 AV1 的開源、免除版權稅的,另外一個是我們自己在國內研發的從 AVS 到 AVS2、AVS3 系列。

編碼的標準日新月異,一直在向前發展。而大家都會問,爲什麼視頻編碼那麼重要?

以 JPEG 爲例,它是一個圖像標準,經歷了幾十年的發展。那麼爲什麼幾十年來 JPEG 沒有被打敗,反而被廣爲應用呢?很大程度上受益於它的廣泛的商業用途和易實現性。接下來,我希望通過下圖,和大家解釋爲什麼視頻編解碼這麼重要。

2013 年時,爲了取代 H.264 編碼器,谷歌推出了 VP9。海外用戶看 YouTube,一般是兩類手機,Android 上看到的是 VP9 的碼流。由於 Apple 不支持 VP9 硬件解碼,因此 iPhone 用戶看到的是 H.264 碼流。

谷歌曾做過一個統計,對比了世界範圍內(不包含中國), VP9 和 H.264 的播放時長。從上圖中我們可以看到,在印度、非洲等網絡帶寬不佳的市場,由於 VP9 的應用,大大優化了用戶體驗,首屏時間大幅縮短,並且卡頓大幅減少。

與此同時,採用新一代 codec 的應用,帶來了用戶體驗的提升和新業務推進的可能性,這正印證了 Video codec 的重要性。

在編碼器中,不論是 HEVC 或 AV1,都有 partition 的概念。熟悉編碼的朋友都知道,HEVC 和 AV1 中都有一個四叉樹的 partition。

比如,它的 superblock 在 AV1 中的大小是 128*128,它可以繼續向下做四叉樹的劃分,每個 128*128 的圖像塊可以分成 4 個 64*64,每個 64*64 又可以分成 4 個 32*32。以此類推,例如在 AV1 中可以分解到最小爲 4*4 的圖像塊。

對於圖像宏塊而言,要做出一個 partition 的 map。統計表明,Video encoder 端 partition RDO 評估的計算會佔到編碼器複雜度的 80% 以上。

那麼此時如何利用機器學習來嘗試做優化呢?

如上圖所示,第一行四張圖是幀內壓縮,第二行四張圖是幀間壓縮的實例。它展示了對於不同的圖像塊需要有不同的 partition。

原因就在於,每個圖像塊內容不同。對於幀內壓縮,細節、紋理越多的地方,分塊就越細緻。對於幀間壓縮,主要是對殘差分塊,主要是要看幀間的預測是如何進行的。從這個角度來講,分塊本身是由內容和預測模式決定的。

那麼,對任一圖像塊,我們可以在內容上提取一定的 feature。大家都知道,當 QP 取值比較大時,即失真度比較高時,整塊的內容就趨於平滑,那就會選擇比較大一些的分塊。QP 比較小時,會選擇比較細緻的分塊。從這些方面可以看出,從塊的角度,在 partition 的情況下,可以從內容、編碼模式中提取相應的 feature,通過離線訓練可以從機器學習中獲得決策結果。

上圖中這篇論文是北航的徐邁老師與他的學生們所做的一項工作。他們基於神經網(這裏主要用卷積神經網)做出的對 partition 的基本分類。

在真正做 partition 時,一般的做法是分級進行的,比如塊的大小是 64*64,此時需決策是否要往下走,做 4 個 32*32,到 32 再往下做決策是否繼續劃分,即決策是一層一層向下推進的。

這篇論文做了一個初步的嘗試,經過神經網的訓練學習,輸出的是圖像塊最終的完整的劃分結果,將多級的決策結果一次性輸出爲最終的劃分圖。這種方法的優勢在於,能夠最大限度地降低神經網本身帶來的複雜度,一次性導出結果。

另外,它在採用卷積神經網絡決策的過程中,包含了 early termination 的決策。因爲當網路深度和每層節點數增加的情況下,神經網本身也會引入一些新的複雜度。這篇論文的結果是跟 HM 比對的,在 encoder 端的速度大約提升了 50%。

AV1 是開放的標準,是一個開源的 codec。我們和谷歌合作一起貢獻了 libaom 開源代碼。上圖是我們的截屏。由於採用了機器學習的方法,使得 encoder 進一步優化。

從圖中可以看到,這個 CL 中不是深度學習,而是採用了一個非常簡捷的神經網。一般 CL 中的神經網構造是一層到兩層,每一層的節點在 128 個左右。所以這裏並不是深度學習,是採用了一個比較簡捷的網絡結構。

以往在優化編碼器時,常常採用 empirical 的想法,即做 partition 時,從一級、二級到三級,可以提取當前 block 層的方差,也可以將當前的 block 一分爲四,提取每一個 subblock 的方差,對其進行一些分析,然後做出決策,給出 hard-coded 閾值。當塊參數的大小低於某個閾值或高於某個閾值時,繼續往下做 partition。所有這些決策可以用神經網代替,因爲此時可以通過積累大量數據對一個簡單的網絡進行訓練,同時再用這個網絡生成決策,判斷是否需要四叉樹繼續下分。

從上圖可以看出,用一個簡單的神經網就可以把 encoder 速度提升 10 - 20%。所以,我們在採用機器學習的方法時,不一定是深度學習,因爲神經網的概念已經存在很久了,主要是用大數據做訓練,從數據集中設計網絡,對相對複雜的非線性關係建模,從而使得 encoder 的速度以及編碼效率進一步提升。

2

ML to Coding Performance

AV1 是一個實例,它採用了神經網絡、機器學習的概念,使得 encoder 進一步提速。使得用神經網代替經驗決策。

那麼,神經網是不是可以幫助我們對視頻壓縮做壓縮性能提升?下面,我舉三個例子,分享一下我們從哪些方面可以把神經網和深度學習用在編碼性能提升上。

第一個,是從超分的概念來分享。大家都知道,壓縮造成了信息丟失。信息丟失以後我們希望在解碼端或者編碼端的 inloop 過程中,重建丟失的信息。如果我們可以做到,就可以達到編碼性能的進一步提升。因爲壓縮是一體兩制,或在一定碼率下提升畫質,或在一定畫質下節省碼率。如果可以在一定的碼率下重建失去的信息,就可以進一步提升畫質,之後可以進一步節省碼率,通過畫質提升將降碼率後失真圖像的質量還原到原來碼率的畫質水平。

AV1 中採用了更多的工具,從而使其可以比已有編碼標準,比如 HEVC 有進一步的提高。其中一個工具稱作 restoration,裏面提供兩個濾波器,一個是 Wiener filter,一個是 Self-guided projected filters,僅這一個工具的 BDRate 性能提升在 1 - 1.5% 之間。

如上方右圖所示,它是一個 restoration 的描述。那麼它是如何把信息恢復出來的呢?我們可以想象,任何一個像素點是多維空間的一點,那麼一個小時的視頻一定有 n 個圖像幀,每個幀裏有 m 個像素點。如果把每個點都想象成一維的話,任何一個視頻實際上是高維空間中的一點。做這種想象以後,上方圖右側的 Xs 就是原始的視頻,經過壓縮,就得到了高維空間中的另一點,如果這兩點重合,就是 lossless coding 的過程。這兩點在高維空間中距離越遠,失真度就越大。重建的過程就是力圖將壓縮後的X那一點帶回來與原來的點越來越近的過程。

AV1 中有一個 guided filter 的概念,通過這個 filter 可以從解壓以後的 X,恢復成 X1、X2 兩點,也就是得到兩個濾波器的結果。做完後發現,這兩點離原來那點還是差得非常遠。那麼 AV1 進一步通過 X1、X2 建立一個平面,把原有的視頻所對應的點,在現在這個平面上做投影。可以看到投影以後所得點就離原點近了很多,這就是一個重建的過程。

最終 AV1 只要求在碼流中傳遞兩個參數 α 和 β,需要高精度傳輸過去,在解碼端用同樣的 restoration 就可以恢復出比較高質量的圖像。從這點可以看出,這一個工具就可以達到 BDRate 的 1% 以上的提升,我們可以用學習的概念得到更好的圖像復原,所以很自然而然就想到超分方法的運用。

現在,超分辨率在機器學習中已經得到廣泛應用。壓縮以後的圖像,通過學習可以重建出一個更高質量的圖像,利用這個圖像可以在我們現有的編碼結構中加以運用,從而達到更好的 coding performance。

這是我們和杭師大的丁丹丹老師合寫的一篇論文,主要探索重建圖像。可以在四方面加以應用:第一,插值濾波;第二,In loop filter;第三,可以通過利用多個參考幀,重現出一個更清晰的參考幀;第四,Out loop post-processing filter。

這些都是從學習的角度,利用已知的參考幀重建出更高清晰更高質量的參考幀。或者是利用插值濾波,因爲插值的獲取也等價於重建出一些原有的信息。從我們訓練集數據中得到的信息,存儲到神經網絡結構以及其相應的參數中,再加上已有的視頻數據得到重建的信息,利用重建信息幫助我們提升編碼的性能。

上圖是進一步的一個例子,包括前向幀和後向幀在時空上進行的聯合重建。

最後重建的結果是一個超分辨率圖像。同樣的碼率,在解碼端可以運用該技術使得視頻質量得到進一步提升。視頻在用多幀分辨率做重建的過程中,由於每幀的視頻中有一個運動矢量的概念,所以這篇論文最主要的貢獻,是在原有方法的基礎上做了一個像素對齊,這是視頻相對於圖像在處理上比較特別的地方。

徐邁老師的另外一個工作,也是利用學習恢復在編碼過程中失去的信息,不過不是提高分辨率,而是提高圖像的質量,去除編碼後圖像的 artifacts。

我們在編碼解碼過程中會發現,每一幀的質量有波動,任何一個圖像幀由於 QP 的不同,每幀質量會不同,有些幀的質量比較好,比如我們通常說的 Key frame,這篇論文中把這樣的幀叫做 PQF。

如果我們可以把 PQF 的幀識別出來,用學習的辦法把質量比較差的幀的質量彌補、提升,這樣不僅可以提高原本質量差的幀的質量,更可以優化序列中各幀的質量到更高的水平。

視頻幀與幀間的質量保持平穩是比較關鍵的。舉一個例子,做鍼灸的時候要扎很多針,如果每一針的力度相差不多,患者會覺得ok。如果突然一針的力度很大,人就會記住那一針的感覺。而人眼觀看視頻也是一樣的。

首先第一個工作就是識別視頻中哪些幀質量比較高,因爲此時解碼端的原視頻是不可得的。這個工作主要利用類似無參考圖像質量評價(no reference image quality assessment)的方法來進行。在沒有原視頻的基礎上,有一項研究是無參考質量評估,這篇論文借鑑於那個領域的工作。

第一步,從每一幀裏提取 36 個 feature,5 個連續幀提取一共 180 個 feature 做訓練。這裏採用的是支持向量機方法作聚類,經過訓練識別幀的質量。

第二步,判斷出比較好的幀以後,利用神經網絡來提升質量差幀的圖像質量。先做運動補償,即:找到質量比較低的幀,及其前後質量比較高的兩幀(PQF),三幀之間做像素級的運動估計的過程。做完運動估計和運動補償之後,再做質量提升。

大家都知道,在神經網訓練的過程中我們需要 ground truth,motion vector 很難獲取 ground truth,所以這裏不是要去訓練 motion vector,而是得到的重建幀和原有的幀之間能達到差異最小值,來訓練神經網。這個神經網有兩個部分,MC-subnet 和 quality enhancement subnet,對構成的MSE函數實現最小化,進而用訓練出的神經網去重建質量比較低的圖像幀,最終達到整體視頻質量的一致性。

第三個工作也是用深度學習對視頻編碼效率的提高,它的想法是這樣的,人眼看視頻,會對某些區域比較敏感,對某些區域沒那麼敏感。

譬如我們看足球比賽,會對球的質量比較敏感,對草地的失真不那麼敏感。不同的區域人眼的敏感度不同,那麼那些區域我就可以不做壓縮和傳輸,即在 encoder 端進行分析,識別出這些區域,在 decoder 端再進行合成,編碼、解碼的工作就是分析加合成的過程。

由於其中有內容的分析,而機器學習在這方面有比較大的優勢,所以這個工作就是用學習的辦法把每幀圖像分割成兩個區域,一部分區域是人眼不敏感的,另一部分區域就保留下來,對於那些保留下來的區域可以用傳統的(比如 AV1 的辦法)進行壓縮,對於那些容錯性比較大的區域,可以去合成。

我們的具體工作中,實際上是用 AV1 的 global motion 概念,首先識別這些區域相應的全局運動矢量,最終用參考幀和全局運動矢量重建在編碼端省去的區域,等同於通過 motion warp 的方法來代替、合成某些區域。這個工作的神經網絡主要用於前處理,分割圖像。在編碼的過程中,由於運用了 AV1 裏的 global motion 工具,所以最終這個工作是 AV1 aligned 的編碼過程。

右圖是圖像分割的實驗結果,哪些是 texture 比較複雜的區域,哪些是人眼比較敏感的區域。在這個工作中我們發現,把一幀圖像劃分爲兩個區域- 紋理區和非紋理區,然後對紋理區做 warping 合成,效果相對比較好。

視頻相比圖像,由於引入了 temporal 這個第三維時間軸,如果每一幀做 motion warping,出來後幀與幀間效果不一致,那麼人眼就很容易看到差別,主觀感知效果比較差。

舉個簡單的例子,以前我們在做實時通信(比如 Facetime),在手機上,手機有兩個 CPU 核,自然而然會想到並行。比如 H.264,可以採用編碼器端 slice 並行的概念,每一個圖像幀會分成上面一個 slice 和下面一個 slice。

譬如一幀圖像一共 22 行,你可以對上下 11 行進行單獨編碼。但是在 QP 比較大,碼率比較低的情況下,由於上下兩個 slice 的獨立編碼,失真結果差異比較大,這樣編出來的視頻中間會有一條線被觀測到。如果單獨看每一幀,是看不到那條線的,但是如果播放視頻,那條線就顯現出來了。這就是視頻和圖像不一樣的地方,有一個幀間 consistent 的問題。

我們當時分析,出現中間這條線,主要是兩個 slice 的劃分過於一致,每幀都是上面一半下面一半,過於齊整了。一個處理辦法,是讓上下兩個 slice 的行數近似但又不完全固定,這樣使得每一個 CPU 核的計算量基本等同,達到並行的目的,但同時引入了一個 random variable(隨機變量),讓上下兩個 slice 的行數會稍有不同,而且不同的行數幀與幀之間是隨機變換的,那條線就看不到了。

這個實例是進一步說明,在處理視頻的時候,必須要考慮到視頻播放在時間連續上的感知效果。這是視頻相對圖像在主觀質量評估上,一個比較大的挑戰。因此,我們在用視頻紋理分析與合成提升視頻壓縮性能的方法中,並不是對每一幀都去做 motion warping,而是利用編碼器中所採用的hierarchical結構,只對位於這個結構中最上面一層的圖像幀(或者簡單來講,只針對B幀)採用warping的辦法。這樣所得到的視頻其感知效果相對比較理想。

3

ML to Perceptual Coding

機器學習還可以用在視覺感知編碼(perceptual coding)。我們做視頻編碼器的都有質量評估標準。質量評估是大概經歷了三代的變遷:

第一代,更多的是採用 PSNR。信號在丟失的過程中,一般評測都是想知道信息到底丟失了多少,所以用 PSNR 來衡量。

第二代,當我們衡量視頻質量時,想到視頻是給人眼看的,人眼不敏感的區域就不需要花很大的力氣,即使失真再大,人眼感知不到即可。所以視頻編碼的評測標準發展爲用那些可以跟人的主觀視覺更加匹配的指標去衡量。

第三代,隨着機器學習或人工智能的發展,很多時候,比如大量的監控視頻不再是給人眼看的,而是爲機器分析所用。

舉個例子,我們的編碼一般來講是一個低通的過程,通常人眼對低頻的信號會更敏感,不管是 JPEG、MPEG 還是 AV1,當我們對塊做碼率分配的時候,之所以做 transform,是希望把 energy 更多的 conpress 到 lowpass 那端,而 highpass 那端很多時候我們會大量的丟棄掉,去掉人眼不敏感的信息。但機器在分析的過程中和人眼的觀測不是完全一致的,比如在監控視頻中,大部分時候視頻都是穩定的,突然有一個人或者一個物體出現時,即高頻的信息出現,這類信息對機器分析更加有用。

由於機器分析的引用,使得 quality matrics 會有不同的評判標準出現。

4

What’s Next

這是今年 CVPR 的一篇 paper,是從其網頁上下載的視頻,原文作 video translation。前面有提到,這是一個 video Analysis + Synthesis 的過程。

可以想像,視頻這麼大的量,從一個簡潔的圖形恢復出一個複雜的高清的視頻內容,這時候你會看到它神奇的變換閾。這實際上是對視頻壓縮提供了新的視角。我們創業之初,投資人也會說,你們現在在做壓縮,而機器學習 AI 發展到一定程度,所有圖像、視頻是否都可以用一個很複雜的深度學習神經網絡來代替,最終就能在 decoder 端通過神經網絡,再加上從碼流中提取出來的信息作爲神經網絡的輸入重建任一視頻呢?

最後學習對我們的壓縮到底產生什麼樣的影響?通常大家都會說“一圖勝千言”,一幀圖像可以表達那麼多的內容,對於一個視頻遠遠不止“千言”,那剛剛關於我提出的問題,是不是能用機器學習代替所有的壓縮標準和以前採用的運動補償+變換閾的傳統做法呢?我今天的回答是否定的。

我們認爲在可預見的未來 5 到 10 年,壓縮還會按照現有的基本的 coding structure 的方向發展,但是每個模塊都有可能被神經網絡或者機器學習代替,但是基本的框架不會改變。

總結下來主要有兩點:一是通過機器學習,視頻的分析、理解和壓縮之間的連接會更加緊密。舉個例子,高速上很多視頻作爲交通監控,採用車牌識別,但對於一個視頻,如果你關注的只有車牌的話,會把很大的高清視頻壓縮成一串數字。那麼不同場景的壓縮,需要對視頻做一些前期的分析。二是通過機器學習,視頻的重建技術會在視頻編碼流程中扮演越來越重要的角色。視頻可以用一些神經網絡的工具,重建出很複雜的信息。特別針對視頻編碼和解碼,一些有助於解碼端重建的信息可以在編碼端生成,因爲編碼端是有源視頻的。這些信息可以放在碼流中傳送到解碼端,進一步輔助解碼端重建出更高質量的視頻。這樣的方法可稱作“編碼器引導下的解碼端重建”,比解碼端的獨立重建技術應該會有更大的潛力。機器學習在其中也會有更大的施展空間。

點擊

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