本文源自RTC 開發者社群,作者吳曉然,聲網高階視訊工程師,專注於視訊編解碼及相關技術研究,個人技術興趣包括多媒體架構、深度學習。
在 AlphaGo 對弈李世石、柯潔之後,更多行業開始嘗試通過機器學習優化現有技術方案。其實對於實時音視訊來講,對機器學習的研究已有多年,我們曾分享過的實時影象識別只是其中一種應用。我們還可以利用深度學習來做超解析度。我們這次就分享一下用於超解析度的深度學習基本框架,以及衍生出的各種網路模型,其中有些網路在滿足實時性方面也有不錯的表現。
機器學習與深度學習
對於接觸機器學習與深度學習較少的開發者,可能會搞不清兩者的差別,甚至認為機器學習就是深度學習。其實,我們用一張圖可以簡單區分這個概念。
上世紀50年代,就有人工智慧的概念,後來也有一些較基礎的應用,比如國際象棋。但到了70年代,由於硬體效能的制約,以及訓練資料集的匱乏,使得人工智慧經歷了一段低谷。人工智慧包括了很多,比如機器學習、排程演算法、專家系統等。到了80年代才開始出現更多機器學習的應用,比如利用演算法來分析資料,並進行判斷或預測。機器學習包括了邏輯樹、神經網路等。而深度學習,則是機器學習中的一種方法,源於神經網路。
超解析度是什麼?
超解析度是基於人類視覺系統提出的概念。1981年諾貝爾醫學獎獲獎者David Hubel、Torsten Wiesel,發現人類視覺系統的資訊處理方式是分層級的。第一層是原始的資料輸入。當人看到一個人臉影象時,首先會先識別出其中的點、線等邊緣。然後進入第二層,會識別出影象中一些基本的組成元素,比如眼睛、耳朵、鼻子。最後,會生成一個物件模型,也就是一張張完整的臉。
而我們在深度學習中的卷積神經網路(如下圖為例),就是模仿了人類視覺系統的處理過程。正因此,計算機視覺是深度學習最佳的應用領域之一。超分辨就是計算機視覺中的一個經典應用。
超解析度是通過軟體或硬體方法,提高影象解析度的一種方法。它的核心思想,就是用時間頻寬換取空間解析度。簡單來講,就是在我無法得到一張超高解析度的影象時,我可以多拍幾張影象,然後將這一系列低解析度的影象組成一張高分辨的影象。這個過程叫超解析度重建。
為什麼超解析度可以通過多拍幾張影象,就能提高圖片解析度呢?
這牽涉到抖動。我們經常說的拍照防抖動,其實防的是較明顯的抖動,但微小的抖動始終存在。在拍攝同一場景的每張影象之間,都有細微差別,這些微小的抖動其實都包含了這個場景的額外資訊,如果將他們合併,就會得到一張更為清晰的影象。
有人可能會問,我們手機都能前後置兩千萬,為什麼需要超解析度技術呢?這種技術應用場景是不是不多?
其實不是。瞭解攝影的人都知道。在相同的感光元器件上,拍攝的影象解析度越高,在感光元器件上,單個畫素佔的面積越小,那會導致通光率越低,當你的畫素密度到達一定程度後,會帶來大量噪聲,直接影響影象質量。超解析度就可以解決這種問題。超解析度有很多應用,比如:
數字高清,通過這種方法來提高解析度
顯微成像:合成一系列顯微鏡下的低解析度影象來得到高解析度影象
衛星影象:用於遙感衛星成像,提升影象精度
視訊復原:可以通過該技術復原視訊,例如老電影
但是,有很多情況下,我們只有一張影象,無法拍攝多張,那麼如何做超解析度呢?這就需要用到機器學習了。比較典型的例子,就是在2017年Google 提出的一項“黑科技”。他們可以通過機器學習來消除視訊影象中的馬賽克。當然,這項黑科技也有一定限制,以下圖為例,它訓練的神經網路是針對人臉影象的,那麼如果你給的馬賽克影象不是人臉,就無法還原。
超解析度神經網路原理
超解析度神經網路(Super-Resolution CNN,SRCNN)是深度學習應用在超解析度領域的首個模型。原理比較簡單。它有三層神經網路,包括:
特徵提取:低解析度影象經過二項式差值得到模糊影象,從中提取影象特徵,Channel 為3,卷積核大小為
f1*f1
,卷積核個數為 n1;非線性對映:將低解析度圖片特徵對映到高解析度,卷積核大小
1*1
;
影象重構:恢復細節,得到清晰的高解析度影象,卷積核為
f3*f3
;
引數調節是神經網路中比較玄的部分,也是最為人詬病的部分。很多人認為引數調節很像老中醫看病,通常缺少理論依據。在這裡列出了幾個在 n1 取不同值的時候,所用的訓練時間和峰值訊雜比(PSNR,用於判斷圖片質量的引數,越高越好)。
在訓練中,使用均方誤差(Mean Squared Error, MSE)作為損失函式,有利於獲得較高的PSNR。
訓練結果如何呢?在下表中,列出了幾個傳統方法與 SRCNN 方法的結果對比。最左一列是圖片集,右側分別列出了每個方法的所用訓練時間和圖片峰值訊雜比。可以看出,儘管有些圖片,傳統方法得出的結果更優於深度學習,但是總體來講,深度學習稍勝一籌,甚至所需時間更短。
有人說一圖勝千言。那麼實際圖片效果如何呢?我們可以看下面兩組圖片。每組第一張是小解析度的原圖,後面通過不同的方法來實現高解析度的大圖。相比傳統方法,SRCNN 的圖片邊緣更加清晰,細節恢復的更好一些。以上就是最初的超解析度的深度學習模型。
9個超解析度神經網路模型
SRCNN 是第一個超解析度的神經網路模型。在 SRCNN 這個模型出現後,更多應用於超解析度的神經網路模型。我們以下分享幾個:
FSRCNN
相對 SRCNN,這個方法不需要對原始圖片使用二項式差值,可以直接對小解析度影象進行處理。在提取特徵值之後,縮小圖片,然後經過 mapping、expending、反摺積層,然後得到高解析度圖片。它好處是,縮小圖片可以降低訓練的時間。同時,如果你需要得到不同解析度的圖片,單獨訓練反摺積層即可,更省時。
ESPCN
這個模型是基於小圖進行訓練。最後提取了 r² 個 Channel。比如說,我想將圖片擴大到原圖的3倍,那麼 r 就是縮放因子 3,Channel 為9。通過將一個畫素擴充為一個3x3的矩陣,模擬為一個畫素的矩陣,來達到超解析度的效果。
對實時視訊進行超解析度處理的實驗結果也非常理想。對 1080 HD 格式的視訊進行3倍放大,SRCNN 每幀需要0.435s,而 ESPCN 則只需0.038s。
VDSR
這是2016年獲獎的一個模型。我們做視訊編解碼的都知道,影象之間是存在殘差的。它認為原始的低解析度圖片與高解析度圖片之間,低頻分量幾乎一樣,缺失的是高頻分量,即圖片細節。那麼訓練的時候,只需要針對高頻分量進行訓練就行了。
所以它的輸入分為兩部分,一是將整張原圖作為一個輸入,另一部分則是對殘差進行訓練然後得到一個輸入,將兩者加起來就得到一張高解析度影象。這樣就大大加快了訓練速度,收斂效果也更好。
DRCN
它還是分為三層。但是在非線性對映這一層,它使用了一個遞迴網路,也就是說,資料迴圈多次地通過該層。將這個迴圈展開的話,等效於使用同一組引數的多個串聯的卷積層。
RED
每一個卷積層都對應一個非卷積層。簡單來講,可以理解為是將一張圖片進行了編碼,然後緊接著進行解碼。它的優勢在於解決了梯度消失的問題,而且能恢復出更乾淨的圖片。它和 VDSR 有相似的思路。中間卷積層與反摺積層的訓練是針對原始圖片與目標圖片的殘差。最後原圖會與訓練輸出結果相加,得到高解析度的圖片。
DRRN
在這個模型裡你可以看到DRCN、VDSR的影子。它採用了更深的網路結構來提升效能。其中有很多個圖片增強層。可以理解為,一張模糊的圖片,經過多個增強層,一級級變得更加清晰,最終得出高清圖片。大家可以在名為tyshiwo的 Github 上找到原始碼。
LapSRN
LapSRN 的特別之處在於引入了一個分級的網路。每一級都只對原圖放大兩倍,然後加上殘差獲得一個結果。如果對圖片放大8倍的話,這樣處理的效能會更高。同時,在每一級處理時,都可以得到一個輸出結果。
SRDenseNet
它引入了一個 Desent Block 的結構。上一層網路訓練出的特徵值會傳遞到下一層網路,所有特徵串聯起來。這樣做的好處是減輕梯度消失問題、減少引數數量。而且,後面的層可以複用之前訓練得出的特徵值,不需要重複訓練。
SRGAN
它可以利用感知損失(perceptual loss)和對抗損失(adversarial loss)來提升恢復出的圖片的。
在這個模型中有兩個網路,一個是生成網路,另一個是判別網路,前者會生成高解析度圖片,後者則會判斷這張圖是否是原圖,如果結果為“否”,那麼前者會再次進行訓練、生成,直到可以騙過判別網路。
以上這些神經網路模型都可以應用於視訊處理中,但實際應用還需要考慮很多因素,比如系統平臺、硬體配置、效能優化。其實,除了超解析度,機器學習與實時音視訊有很多可結合的應用場景,比如音視訊體驗優化、鑑黃、QoE 改進等。我們將在今年9月的 RTC 2018 實時網際網路大會上,將邀請來自 Google、美圖、搜狗等公司技術專家分享更多實踐經驗與乾貨。