本文源自 RTC 開發者社區,做者吳曉然,聲網高級視頻工程師,專一於視頻編解碼及相關技術研究,我的技術興趣包括多媒體架構、深度學習。
在 AlphaGo 對弈李世石、柯潔以後,更多行業開始嘗試經過機器學習優化現有技術方案。其實對於實時音視頻來說,對機器學習的研究已有多年,咱們曾分享過的實時圖像識別只是其中一種應用。咱們還能夠利用深度學習來作超分辨率。咱們此次就分享一下用於超分辨率的深度學習基本框架,以及衍生出的各類網絡模型,其中有些網絡在知足實時性方面也有不錯的表現。算法
對於接觸機器學習與深度學習較少的開發者,可能會搞不清二者的差異,甚至認爲機器學習就是深度學習。其實,咱們用一張圖能夠簡單區分這個概念。性能優化
上世紀50年代,就有人工智能的概念,後來也有一些較基礎的應用,好比國際象棋。但到了70年代,因爲硬件性能的制約,以及訓練數據集的匱乏,使得人工智能經歷了一段低谷。人工智能包括了不少,好比機器學習、調度算法、專家系統等。到了80年代纔開始出現更多機器學習的應用,好比利用算法來分析數據,並進行判斷或預測。機器學習包括了邏輯樹、神經網絡等。而深度學習,則是機器學習中的一種方法,源於神經網絡。網絡
超分辨率是基於人類視覺系統提出的概念。1981年諾貝爾醫學獎獲獎者David Hubel、Torsten Wiesel,發現人類視覺系統的信息處理方式是分層級的。第一層是原始的數據輸入。當人看到一我的臉圖像時,首先會先識別出其中的點、線等邊緣。而後進入第二層,會識別出圖像中一些基本的組成元素,好比眼睛、耳朵、鼻子。最後,會生成一個對象模型,也就是一張張完整的臉。架構
而咱們在深度學習中的卷積神經網絡(以下圖爲例),就是模仿了人類視覺系統的處理過程。正所以,計算機視覺是深度學習最佳的應用領域之一。超分辨就是計算機視覺中的一個經典應用。app
超分辨率是經過軟件或硬件方法,提升圖像分辨率的一種方法。它的核心思想,就是用時間帶寬換取空間分辨率。簡單來說,就是在我沒法獲得一張超高分辨率的圖像時,我能夠多拍幾張圖像,而後將這一系列低分辨率的圖像組成一張高分辨的圖像。這個過程叫超分辨率重建。框架
爲何超分辨率能夠經過多拍幾張圖像,就能提升圖片分辨率呢?機器學習
這牽涉到抖動。咱們常常說的拍照防抖動,其實防的是較明顯的抖動,但微小的抖動始終存在。在拍攝同一場景的每張圖像之間,都有細微差異,這些微小的抖動其實都包含了這個場景的額外信息,若是將他們合併,就會獲得一張更爲清晰的圖像。函數
有人可能會問,咱們手機都能先後置兩千萬,爲何須要超分辨率技術呢?這種技術應用場景是否是很少?性能
其實不是。瞭解攝影的人都知道。在相同的感光元器件上,拍攝的圖像分辨率越高,在感光元器件上,單個像素佔的面積越小,那會致使通光率越低,當你的像素密度到達必定程度後,會帶來大量噪聲,直接影響圖像質量。超分辨率就能夠解決這種問題。超分辨率有不少應用,好比:學習
數字高清,經過這種方法來提升分辨率
顯微成像:合成一系列顯微鏡下的低分辨率圖像來獲得高分辨率圖像
衛星圖像:用於遙感衛星成像,提高圖像精度
視頻復原:能夠經過該技術復原視頻,例如老電影
可是,有不少狀況下,咱們只有一張圖像,沒法拍攝多張,那麼如何作超分辨率呢?這就須要用到機器學習了。比較典型的例子,就是在2017年Google 提出的一項「黑科技」。他們能夠經過機器學習來消除視頻圖像中的馬賽克。固然,這項黑科技也有必定限制,如下圖爲例,它訓練的神經網絡是針對人臉圖像的,那麼若是你給的馬賽克圖像不是人臉,就沒法還原。
超分辨率神經網絡(Super-Resolution CNN,SRCNN)是深度學習應用在超分辨率領域的首個模型。原理比較簡單。它有三層神經網絡,包括:
特徵提取:低分辨率圖像通過二項式差值獲得模糊圖像,從中提取圖像特徵,Channel 爲3,卷積核大小爲 f1*f1
,卷積核個數爲 n1;
非線性映射:將低分辨率圖片特徵映射到高分辨率,卷積核大小1*1
;
圖像重構:恢復細節,獲得清晰的高分辨率圖像,卷積核爲f3*f3
;
參數調節是神經網絡中比較玄的部分,也是最爲人詬病的部分。不少人認爲參數調節很像老中醫看病,一般缺乏理論依據。在這裏列出了幾個在 n1 取不一樣值的時候,所用的訓練時間和峯值信噪比(PSNR,用於判斷圖片質量的參數,越高越好)。
在訓練中,使用均方偏差(Mean Squared Error, MSE)做爲損失函數,有利於得到較高的PSNR。
訓練結果如何呢?在下表中,列出了幾個傳統方法與 SRCNN 方法的結果對比。最左一列是圖片集,右側分別列出了每一個方法的所用訓練時間和圖片峯值信噪比。能夠看出,儘管有些圖片,傳統方法得出的結果更優於深度學習,可是整體來說,深度學習稍勝一籌,甚至所需時間更短。
有人說一圖勝千言。那麼實際圖片效果如何呢?咱們能夠看下面兩組圖片。每組第一張是小分辨率的原圖,後面經過不一樣的方法來實現高分辨率的大圖。相比傳統方法,SRCNN 的圖片邊緣更加清晰,細節恢復的更好一些。以上就是最初的超分辨率的深度學習模型。
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、美圖、搜狗等公司技術專家分享更多實踐經驗與乾貨。