深度學習在超分辨率重建上的應用SRCNN,FSRCNN,VDSR,DRCN,SRGAN

超分辨率技術(Super-Resolution)是指從觀測到的低分辨率圖像重建出相應的高分辨率圖像, 目前應用較多的應用場景是圖像及視頻分辨率提高,比如可以提高以往影視作品或圖像的分辨率,提高視覺感官效果;或是解決視頻經有損壓縮後導致視頻效果退化問題。

SR可分爲兩類:從多張低分辨率圖像重建出高分辨率圖像和從單張低分辨率圖像重建出高分辨率圖像。

查看論文大部分都是基於單一插值下采樣獲得的低分辨率圖像,這樣的研究思路有很大的弊端:

(1)插值方式對超分辨率結果有很大影響,訓練集和測試集下采樣方式不同結果相差較大;

(2)單一插值下采樣不符合退化模型,應該同時考慮模糊核和噪聲,或是其他有實際應用背景的退化模型。

個人以爲多張低分辨率圖像在實際應用中更適合,可以爲生成圖像提供更多的信息,但是在其中涉及的圖像配準和圖像融合影響圖像超分結果。

這裏主要介紹幾種單張監督式超分辨率重建的方法,具體是需要成對的低分辨率圖像和高分辨率圖像作爲訓練集,低分辨率圖像作爲網絡結構的輸入,高分辨率圖像作爲低分辨率的標籤,即超分辨率重建網絡輸出,網絡結構學習得到低分辨率與高分辨率之間的映射關係。

常用的評價指標是PSNR(Peak Signal-to-Noise Ratio)和SSIM(Structure Similarity Index),這兩個值越高代表重建結果的像素值和金標準越接近。

具體方法包括SRCNN,DRCN,SRGAN。

目錄

1. SRCNN

2. FSRCNN

3. ESPCN

4. VDSR

5. DRCN

6. RED

7. DRRN

8. LapSRN

9. SRDenseNet

10. SRGAN(SRResNet)

 


1. SRCNN

(Learning a Deep Convolutional Network for Image Super-Resolution, ECCV2014)

SRCNN是深度學習用在超分辨率重建上的最早方法。SRCNN的網絡結構簡單,僅包含三層卷積(9x9,1x1,5x5),論文中分別解釋爲特徵提取(輸出64維),特徵表示(輸出32維)和重建過程(輸出3維),結構如下圖所示,首先使用雙三次(bicubic)插值將低分辨率圖像放大成目標的高分辨率圖像大小,再用三層卷積特徵提取、映射、重建得到高分辨率圖像。

損失函數使用均方誤差(Mean Squared Error, MSE),有利於獲得較高的PSNR。

下圖表明,在不同的放大倍數下,SRCNN都取得比傳統方法好的效果

code: http://mmlab.ie.cuhk.edu.hk/projects/SRCNN.html

 

2. FSRCNN

(Accelerating the Super-Resolution Convolutional Neural Network, ECCV2016)

FSRCNN與SRCNN都是香港中文大學Dong Chao, Xiaoou Tang等人的工作。Fast Super-Resolution Convolutional Neural Networks (FSRCNN),顧名思義 FSRCNN是對之前SRCNN在速度性能上的提升,主要在三個方面改進:

一是在最後使用反捲積層放大尺寸,這樣可以直接將原始的低分辨率圖像輸入到網絡中,而不是像之前SRCNN那樣需要先通過bicubic方法放大尺寸,減少卷積的計算量;

二是改變特徵維數,使用更小的卷積核和使用更多的映射層,類似AlexNet到VGG的提升,具體網絡結構參數可以參考原論文,主要是3*3卷積和1*1卷積降維的應用;

三是可以共享其中的映射層,如果需要訓練不同上採樣倍率的模型,只需要fine-tuning最後的反捲積層。

FSRCNN與SRCNN具體對比結構如下:

FSRCNN中激活函數採用PReLU,損失函數仍然是均方誤差。對CNN來說,Set91並不足夠去訓練大的網絡結構,FSRCNN提出general-100 + Set91進行充當訓練集。並且進行數據增強,1)縮小尺寸爲原來的0.9, 0.8, 0.7和0.6。2)旋轉 90°,180°和270°,因此獲得了數據量的提升。

code: http://mmlab.ie.cuhk.edu.hk/projects/FSRCNN.html

 

3. ESPCN

(Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network, CVPR2016)

看論文題目得知ESPCN追求的是實時性,與FSRCNN相同不需要對圖像先插值後超分重建,避免因預先上採樣帶來的大量卷積計算,ESPCN網絡結構如下圖所示。

ESPCN

ESPCN的核心概念是亞像素卷積層(sub-pixel convolutional layer)。網絡的輸入是原始低分辨率圖像,通過三個卷積層以後,得到的特徵爲r^2WH ,其中WH與輸入圖像大小相同,再將特徵圖像每個像素的 r^2個通道重新排列成一個 r*r 的區域,即將r^2WH特徵經過重排得到rW*rH的輸出,實現了圖像r倍上採樣。

 

訓練時,可以將輸入的訓練數據標籤,預處理成重新排列操作前的格式,比如將21×21的單通道圖,預處理成9個通道,7×7的圖,這樣在訓練時,就不需要做重新排列的操作。另外,ESPCN激活函數採用tanh替代了ReLU。損失函數爲均方誤差。

亞像素卷積已經包含在深度學習框架中,可以根據需要直接調用,也可以自己手動實現即通道間像素的重新組合。

github(tensorflow): https://github.com/drakelevy/ESPCN-TensorFlow

github(pytorch): https://github.com/leftthomas/ESPCN

github(caffe): https://github.com/wangxuewen99/Super-Resolution/tree/master/ESPCN

在此以後的SISR方法大部分憑藉越來越優秀的網絡結構不斷加深加寬網絡結構,構建極深網絡結構以獲得低分辨率圖像和高分辨率圖像之間的非線性映射關係,損失函數大部分依然採用MSE損失,上採樣方式採用反捲積方式或是亞像素卷積方式,爲了減少計算量均不再預先上採樣處理。

 

4. VDSR

(Accurate Image Super-Resolution Using Very Deep Convolutional Networks, CVPR2016)

該方法參考了ResNet的殘差思想,並不是殘差網絡結構,具體是利用殘差思想計算上採樣後的低分辨率圖像與高分辨率圖像之間的差異。因爲輸入的低分辨率圖像和輸出的高分辨率圖像在很大程度上是相似的,即低分辨率圖像攜帶的低頻信息與高分辨率圖像的低頻信息相近,訓練時帶上這部分會多花費大量的時間,且會造成低頻信息丟失,因此只需要學習高分辨率圖像和低分辨率圖像之間的高頻部分殘差即可。

殘差網絡結構的思想特別適合用來解決超分辨率問題,之後大部分深度學習方法均採用該思想。VDSR是最直接明顯的學習殘差的結構,其網絡結構如下圖所示。

VDSR

具體流程是:

(1)插值上採樣得到ILR;

(2)學習輸出高分辨率圖像與插值後圖像之間的殘差:卷積神經網絡特徵映射(20層3*3卷積),增加網絡結構深度,來增加感受野;

(3)將插值上採樣圖像與學習得到的殘差相加,得到高分辨率圖像。

VDSR的貢獻:

(1)最大的貢獻就是引入了殘差思想,論文中解釋是建立二者差異較小之間的映射,學習殘差收斂速度更快;

(2)加深了網絡結構,增加感受野;

(3)網絡結構中採用自適應梯度裁剪方式,加快收斂;

(4)訓練集中包含不同倍數上採樣,實現不同倍數上採樣。

code: https://cv.snu.ac.kr/research/VDSR/

github(caffe): https://github.com/huangzehao/caffe-vdsr

github(tensorflow): https://github.com/Jongchan/tensorflow-vdsr

github(pytorch): https://github.com/twtygqyy/pytorch-vdsr

 

5. DRCN

(Deeply-Recursive Convolutional Network for Image Super-Resolution, CVPR2016)

DRCN與上面的VDSR都是來自首爾國立大學計算機視覺實驗室的工作,兩篇論文都發表在CVPR2016上,兩種方法的結果非常接近。DRCN第一次將之前已有的遞歸神經網絡(Recursive Neural Network)結構應用在超分辨率處理中,個人理解該方法主要利用了遞歸思想的參數共享,而不是遞歸思想的序列之間的相關性。

由於遞歸網絡難以收斂,對每次遞歸結果監督,並利用跳轉鏈接實現殘差學習,其中的殘差學習實爲ResNet中的skip-connection,與VDSR中的殘差思想略有不同。

DRCN網絡結構如下圖所示。

 

DRCN輸入的是插值後的圖像,分爲三個模塊:

第一個是Embedding network,相當於特徵提取;

第二個是Inference network, 相當於特徵的非線性映射,在此對特徵提取得到的多通道特徵實現RNN,數據多次循環通過該層網絡,等同於下圖中的多個卷積層串聯,且多個卷積層參數相同;

第三個是Reconstruction network,即從特徵圖像恢復最後的重建結果。

DRCN

從上圖可以直觀看出,每個Inference network中每次遞歸結果輸到重建網絡,並分別重建得到重建結果Output1-OutputD,將重建結果以可學習的權重得到輸出。

 損失函數:L1損失+L2損失

 

其中α表示伴隨目標對中間輸出的重要性,β表示權重衰減係數。α越高,訓練過程穩定,早期迭代容易收斂。隨着訓練的進行,α減小,提高最終輸出的性能。

即L1損失容易收斂,L2損失最終效果好,針對在超分辨率復原中的L1損失L2損失的選擇,總結早期論文大部分使用L2損失,後期有些方法使用L1損失,指出L1損失容易收斂,這個具體什麼原因沒有深究,有了解的還請指教!!

code: https://cv.snu.ac.kr/research/DRCN/

github(tensorflow): https://github.com/jiny2001/deeply-recursive-cnn-tf

6. RED

(Image Restoration Using Convolutional Auto-encoders with Symmetric Skip Connections, NIPS2016)

這是一種由Encoder-Decoder結構組成的網絡結構,類似於U-Net以及圖像修補中的Context-Encoder,網絡結構類似,均是先下采樣後上採樣。

RED

RED網絡的結構是對稱的,每個卷積層都有對應的反捲積層。卷積層用來獲取圖像的抽象內容,反捲積層用來放大特徵尺寸並且恢復圖像細節。卷積層將輸入圖像尺寸減小後,再通過反捲積層上採樣變大,使得輸入輸出的尺寸一樣。每一組鏡像對應的卷積層和反捲積層有着跳線連接結構,將兩部分具有同樣尺寸的特徵(要輸入卷積層的特徵和對應的反捲積層輸出的特徵)做相加操作(ResNet那樣的操作)後再輸入到下一個反捲積層,操作過程如下圖所示。

這樣的結構能夠讓反向傳播信號能夠直接傳遞到底層,解決了梯度消失問題,同時能將卷積層的細節傳遞給反捲積層,能夠恢復出更乾淨的圖片。可以看到,網絡中有一條線是將輸入的圖像連接到後面與最後的一層反捲積層的輸出相加,也就是VDSR中用到的方式,因此RED中間的卷積層和反捲積層學習的特徵是目標圖像和低質圖像之間的殘差。RED的網絡深度爲30層,損失函數用的均方誤差。

 

7. DRRN

(Image Super-Resolution via Deep Recursive Residual Network, CVPR2017)

DRRN的作者應該是受到了ResNet、VDSR和DRCN的啓發,採用了更深的網絡結構來獲取性能的提升。作者也在文中用圖片示例比較了DRRN與上述三個網絡的區別,比較示例圖如下所示。

DRRN

DRRN中的每個殘差單元都共同擁有一個相同的輸入,即遞歸塊中的第一個卷積層的輸出。每個殘差單元都包含2個卷積層。在一個遞歸塊內,每個殘差單元內對應位置相同的卷積層參數都共享(圖中DRRN的淺綠色塊或淺紅色塊)。作者列出了ResNet、VDSR、DRCN和DRRN四者的主要策略。ResNet是鏈模式的局部殘差學習。VDSR是全局殘差學習。DRCN是全局殘差學習+單權重的遞歸學習+多目標優化。DRRN是多路徑模式的局部殘差學習+全局殘差學習+多權重的遞歸學習。

文章中比較了不同的遞歸塊和殘差單元數量的實驗結果,最終選用的是1個遞歸塊和25個殘差單元,深度爲52層的網絡結構。總之,DRRN就是通過對之前已有的ResNet等結構進行調整,採取更深的網絡結構得到結果的提升。

github(caffe): tyshiwo/DRRN_CVPR17

github(pytorch): https://github.com/jt827859032/DRRN-pytorch

 

8. LapSRN

(Deep Laplacian Pyramid Networks for Fast and Accurate Super-Resolution, CVPR2017)

論文中作者先總結了之前的方法存在有三點問題。一是有的方法在輸入圖像進網絡前,需要使用預先定義好的上採樣操作(例如bicubic)來獲得目標的空間尺寸,這樣的操作增加了額外的計算開銷,同時也會導致可見的重建僞影。而有的方法使用了亞像素卷積層或者反捲積層這樣的操作來替換預先定義好的上採樣操作,這些方法的網絡結構又相對比較簡單,性能較差,並不能學好低分辨率圖像到高分辨率圖像複雜的映射。二是在訓練網絡時使用 l_{2} 型損失函數時,不可避免地會產生模糊的預測,恢復出的高分辨率圖片往往會太過於平滑。三是在重建高分辨率圖像時,如果只用一次上採樣的操作,在獲得大倍數(8倍以上)的上採樣因子時就會比較困難。而且在不同的應用時,需要訓練不同上採樣倍數的模型。針對這三點問題,作者提出了LapSRN,網絡結構如下圖所示。

LapSRN

LapSRN的結構可以看成有多級,每一級完成一次2倍的上採樣操作,要實現8倍的上採樣就需要有三級。在每一級中,先通過一些級聯的卷積層提取特徵,接着通過一個反捲積層將提取出的特徵的尺寸上採樣2倍。反捲積層後連有兩個卷積層,一個卷積層的作用是繼續提取特徵,另外一個卷積層的作用是預測出這一級的殘差。輸入圖像在每一級也經過一個反捲積層使尺寸上採樣2倍,再與對應級的殘差相加,就能重構出這一級的上採樣結果。LapSRN設計損失函數爲:

\[L\left( {\widehat y,y;\theta } \right) = \frac{1}{N}\sum\limits_{i = 1}^N {\sum\limits_{s = 1}^L {\rho \left( {\widehat y_s^{\left( i \right)} - y_s^{\left( i \right)}} \right)} } = \frac{1}{N}\sum\limits_{i = 1}^N {\sum\limits_{s = 1}^L {\rho \left( {\left( {\widehat y_s^{\left( i \right)} - x_s^{\left( i \right)}} \right) - r_s^{\left( i \right)}} \right)} } \]

其中, \[\rho \left( x \right) = \sqrt {{x^2} + {\varepsilon ^2}} \] 叫作Charbonnier懲罰函數( l_{1} 範數的變形), \varepsilon 大小設置爲0.001。x表示低分辨率圖像,y表示高分辨率圖像,r表示殘差,s表示對應的級。N表示訓練時batch size的大小,L表示網絡一共有多少級。通過將高分辨率圖下采樣,在每一級都存在有對應的ground truth進行監督,因此每一級都有一個損失,訓練的時候就是要把每一級的損失的和降低。

LapSRN通過逐步上採樣,一級一級預測殘差的方式,在做高倍上採樣時,也能得到中間低倍上採樣結果的輸出。由於尺寸是逐步放大,不是所有的操作都在大尺寸特徵上進行,因此速度比較快。LapSRN設計了損失函數來訓練網絡,對每一級的結果都進行監督,因此取得了不錯的結果。

github(matconvnet): https://github.com/phoenix104104/LapSRN

github(pytorch): https://github.com/twtygqyy/pytorch-LapSRN

github(tensorflow): https://github.com/zjuela/LapSRN-tensorflow

 

9. SRDenseNet

(Image Super-Resolution Using Dense Skip Connections, ICCV2017)

DenseNet是CVPR2017的best papaer獲獎論文。DenseNet在稠密塊(dense block)中將每一層的特徵都輸入給之後的所有層,使所有層的特徵都串聯(concatenate)起來,而不是像ResNet那樣直接相加。這樣的結構給整個網絡帶來了減輕梯度消失問題、加強特徵傳播、支持特徵複用、減少參數數量的優點。一個稠密塊的結構如下圖所示。

dense block

SRDenseNet將稠密塊結構應用到了超分辨率問題上,取得了不錯的效果。網絡結構如下圖所示。

SRDenseNet

SRDenseNet可以分成四個部分。首先是用一個卷積層學習低層的特徵,接着用多個稠密塊學習高層的特徵,然後通過幾個反捲積層學到上採樣濾波器參數,最後通過一個卷積層生成高分辨率輸出。

文章中針對用於最後重建的輸入內容不同,設計了三種結構並做了比較。一是反捲積層只輸入最頂層稠密塊的輸出。二是添加了一個跳躍連接,將最底層卷積層的輸出特徵和最頂層稠密塊的輸出特徵串聯起來,再輸入反捲積層。三是添加了稠密跳躍連接,就是把稠密塊看成一個整體,第一個卷積層的輸出以及每個稠密塊的輸出,都輸入給在之後的所有稠密塊,像是把在反捲積層之前的整個網絡也設計成像稠密塊那樣的結構。由於這樣做,所有的特徵都串聯起來,這樣直接輸入反捲積層會產生巨大的計算開銷,因此添加了一個核大小爲1×1的卷積層來減小特徵數量,這個卷積層被稱爲瓶頸層。最後的結果是越複雜的越好,3>2>1。文章中分析的是,受益於低層特徵和高層特徵的結合,超分辨率重建的性能得到了提升。像第三種結構把所有深度層的特徵都串聯起來,得到了最佳的結果,說明不同深度層的特徵之間包含的信息是互補的。

 

10. SRGAN(SRResNet)

(Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network, CVPR2017)

在這篇文章中,將生成對抗網絡(Generative Adversarial Network, GAN)用在瞭解決超分辨率問題上。文章提到,訓練網絡時用均方差作爲損失函數,雖然能夠獲得很高的峯值信噪比,但是恢復出來的圖像通常會丟失高頻細節,使人不能有好的視覺感受。SRGAN利用感知損失(perceptual loss)和對抗損失(adversarial loss)來提升恢復出的圖片的真實感。感知損失是利用卷積神經網絡提取出的特徵,通過比較生成圖片經過卷積神經網絡後的特徵和目標圖片經過卷積神經網絡後的特徵的差別,使生成圖片和目標圖片在語義和風格上更相似。一個GAN所要完成的工作,GAN原文舉了個例子:生成網絡(G)是印假鈔的人,判別網絡(D)是檢測假鈔的人。G的工作是讓自己印出來的假鈔儘量能騙過D,D則要儘可能的分辨自己拿到的鈔票是銀行中的真票票還是G印出來的假票票。開始的時候呢,G技術不過關,D能指出這個假鈔哪裏很假。G每次失敗之後都認真總結經驗,努力提升自己,每次都進步。直到最後,D無法判斷鈔票的真假……SRGAN的工作就是: G網通過低分辨率的圖像生成高分辨率圖像,由D網判斷拿到的圖像是由G網生成的,還是數據庫中的原圖像。當G網能成功騙過D網的時候,那我們就可以通過這個GAN完成超分辨率了。

文章中,用均方誤差優化SRResNet(SRGAN的生成網絡部分),能夠得到具有很高的峯值信噪比的結果。在訓練好的VGG模型的高層特徵上計算感知損失來優化SRGAN,並結合SRGAN的判別網絡,能夠得到峯值信噪比雖然不是最高,但是具有逼真視覺效果的結果。SRGAN網絡結構如下圖所示。

在生成網絡部分(SRResNet)部分包含多個殘差塊,每個殘差塊中包含兩個3×3的卷積層,卷積層後接批規範化層(batch normalization, BN)和PReLU作爲激活函數,兩個2×亞像素卷積層(sub-pixel convolution layers)被用來增大特徵尺寸。在判別網絡部分包含8個卷積層,隨着網絡層數加深,特徵個數不斷增加,特徵尺寸不斷減小,選取激活函數爲LeakyReLU,最終通過兩個全連接層和最終的sigmoid激活函數得到預測爲自然圖像的概率。SRGAN的損失函數爲:

其中內容損失可以是基於均方誤差的損失的損失函數:

也可以是基於訓練好的以ReLU爲激活函數的VGG模型的損失函數:

i和j表示VGG19網絡中第i個最大池化層(maxpooling)後的第j個卷積層得到的特徵。對抗損失爲:

文章中的實驗結果表明,用基於均方誤差的損失函數訓練的SRResNet,得到了結果具有很高的峯值信噪比,但是會丟失一些高頻部分細節,圖像比較平滑。而SRGAN得到的結果則有更好的視覺效果。其中,又對內容損失分別設置成基於均方誤差、基於VGG模型低層特徵和基於VGG模型高層特徵三種情況作了比較,在基於均方誤差的時候表現最差,基於VGG模型高層特徵比基於VGG模型低層特徵的內容損失能生成更好的紋理細節。

github(tensorflow): https://github.com/zsdonghao/SRGAN

github(tensorflow): https://github.com/buriburisuri/SRGAN

github(torch): https://github.com/junhocho/SRGAN

github(caffe): https://github.com/ShenghaiRong/caffe_srgan

github(tensorflow): https://github.com/brade31919/SRGAN-tensorflow

github(keras): https://github.com/titu1994/Super-Resolution-using-Generative-Adversarial-Networks

github(pytorch): ai-tor/PyTorch-SRGAN

 

12 EDSR

(Enhanced Deep Residual Networks for Single Image Super-Resolution, CVPRW2017)

EDSR是NTIRE2017超分辨率挑戰賽上獲得冠軍的方案。如論文中所說,EDSR最有意義的模型性能提升是去除掉了SRResNet多餘的模塊,從而可以擴大模型的尺寸來提升結果質量。EDSR的網絡結構如下圖所示。

EDSR

可以看到,EDSR在結構上與SRResNet相比,就是把批規範化處理(batch normalization, BN)操作給去掉了。文章中說,原始的ResNet最一開始是被提出來解決高層的計算機視覺問題,比如分類和檢測,直接把ResNet的結構應用到像超分辨率這樣的低層計算機視覺問題,顯然不是最優的。由於批規範化層消耗了與它前面的卷積層相同大小的內存,在去掉這一步操作後,相同的計算資源下,EDSR就可以堆疊更多的網絡層或者使每層提取更多的特徵,從而得到更好的性能表現。EDSR用L1範數樣式的損失函數來優化網絡模型。在訓練時先訓練低倍數的上採樣模型,接着用訓練低倍數上採樣模型得到的參數來初始化高倍數的上採樣模型,這樣能減少高倍數上採樣模型的訓練時間,同時訓練結果也更好。

這篇文章還提出了一個能同時不同上採樣倍數的網絡結構MDSR,如下圖。

MDSR

MDSR的中間部分還是和EDSR一樣,只是在網絡前面添加了不同的預訓練好的模型來減少不同倍數的輸入圖片的差異。在網絡最後,不同倍數上採樣的結構平行排列來獲得不同倍數的輸出結果。

從文章給出的結果可以看到,EDSR能夠得到很好的結果。增大模型參數數量以後,結果又有了進一步的提升。因此如果能夠解決訓練困難的問題,網絡越深,參數越多,對提升結果確實是有幫助吧。

github(torch): https://github.com/LimBee/NTIRE2017

github(tensorflow): https://github.com/jmiller656/EDSR-Tensorflow

github(pytorch): https://github.com/thstkdgus35/EDSR-PyTorch

 

以下主要內容是ICCV2017、CVPR2018以及ECCV2018三大會議中的一部分有關針對自然圖像(還有不少針對人臉圖像的)的深度學習端到端超分辨率方法的論文。從中大致也能看到兩年來用於超分辨率的卷積神經網絡的發展形勢。

 

13. EnhanceNet

(EnhanceNet: Single Image Super-Resolution Through Automated Texture Synthesis, ICCV2017)

文章中指出,低分辨率圖像和高分辨率圖像是一對多的,不同的高分辨率圖像都能夠得到相同的低分辨率圖像。文章強調了用峯值信噪比(Peak Signal to Noise Ratio, PSNR)來作爲超分辨率方法的評判準則,會使得超分辨率的圖像存在外觀模糊、過於平滑以及不自然等問題。使用均方誤差(mean squared error, MSE)作爲損失函數,得到的結果只是衆多可能結果的平均值。爲了說明這一點,文章還設計了一個簡單的玩具實驗(toy example)。

本文關注的重點也是在MSE損失函數帶來的問題上,因此更多的去介紹損失函數以及比較使用不同的損失函數得到的結果。生成網絡以及判別網絡的結構則用以下兩個表格表示。生成網絡部分採用最近鄰上採樣跟上一個卷積層的結構對圖像的尺寸進行放大。由於在超分辨率的任務中,不需要學習低分辨率圖像的恆等映射。而殘差塊的結構組成了生成網絡的主要部分,因此生成網絡也就是隻將殘差信息添加到低分辨率圖像上。通過運用學習殘差的思想,文章表示可以有助於加快網絡收斂,穩定訓練以及減少顏色偏移。

 

文章一共使用了四種損失函數。一是MSE作爲baseline。二是感知損失,爲了同時獲得低層和高層的特徵,計算的是輸出圖像和真值圖像輸入到VGG-19中第二個和第五個池化層的特徵之間的MSE。三是紋理匹配損失,由於Gram矩陣可以捕獲風格信息,參考(https://blog.csdn.net/tunhuzhuang1836/article/details/78474129),由VGG中的特徵得到Gram矩陣,同時訓練時候計算的是塊之間的差值,文章指出網絡能夠學習出與高分辨率圖像包含相同局部紋理的輸出圖像。四是對抗損失,也就是加上判別網絡。文章通過四種損失之間的不同組合,最終結果是隻使用MSE的PSNR值最高,而同時使用感知損失、紋理匹配損失和對抗損失三種損失函數得到的結果更加自然真實。

 

14.MemNet

(MemNet: A Persistent Memory Network for Image Restoration, ICCV2017)

這篇文章中,作者說到已有的網絡雖然深度一直在加深,但是都沒有意識到前面層的特徵對於後續層的作用會很小。於是,作者提出了一種由遞歸單元門控單元組成的記憶模塊,由於記憶模塊擁有門控機制,可以將需要的信息保留下來,作者建立了一個很深很深的網絡。網絡結構圖如下。

 

可以看到,網絡由多個記憶模塊通過稠密連接的方式組成。記憶模塊的結構如下所示。

在記憶模塊的遞歸單元中,由多個共享參數的殘差模塊稠密連接組成。經過多個共享參數的殘差模塊,可以遞歸地學習到不同感受野下的特徵。所謂的門控單元其實就是一個1×1的卷積層,減小特徵的通道數,保留需要的信息。

由於網絡中包含多個記憶模塊,作者還提出可以對每個記憶模塊的輸出都計算損失的多監督的訓練方式來提高結果。

github(caffe): https://github.com/tyshiwo/MemNet

github(tensorflow): https://github.com/ly-atdawn/MemNet-Tensorflow

github(pytorch): https://github.com/Vandermode/pytorch-MemNet

 

15. DBPN

(Deep Back-Projection Networks For Super-Resolution, CVPR2018)

這篇文章提出了一種迭代地計算上採樣和下采樣投影誤差的錯誤反饋機制,對重建過程進行引導以得到更好的結果。文章提出的上採樣和下采樣映射單元如下圖所示。

以上採樣單元爲例。先將輸入的低分辨率尺寸映射到高分辨率特徵圖,接着再將這個高分辨率的特徵圖映射回輸入尺寸大小的特徵圖,計算其與輸入特徵圖的殘差,再次將這個殘差映射到高分辨率尺寸,與之前的高分辨率特徵圖相加得到最後的輸出。這一具體過程讓我想到了cycleGAN的思想,即需要同時考慮正向和反向的映射,對生成的高分辨率圖像進行下采樣也應能夠與輸入的低分辨率圖像相近。在以上結構中,通過計算與輸入數據的殘差,實現了錯誤反饋的機制。下采樣單元則是將上採樣單元的放大尺寸和縮小尺寸的順序顛倒一下。

DBPN的網絡結構如上所示。通過採用稠密連接的方式,將多個上採樣單元和下采樣單元堆疊起來,最終通過一個卷積層重建出超分辨率結果。此方法在NTIRE2018比賽中8倍的bicubic上採樣任務上拿到了第一名,PIRM2018比賽中也拿到了Region 2的第一名。

github(caffe): https://github.com/alterzero/DBPN-caffe

github(pytorch): https://github.com/alterzero/DBPN-Pytorch

 

16. IDN

(Fast and Accurate Single Image Super-Resolution via Information Distillation Network, CVPR2018)

這篇文章關注的問題是,大多數方法爲了獲得更好的結果,都趨向於將網絡加深或者擴大,實際的應用性很低。於是文章從特徵圖的通道維度入手,提出了一種叫做信息蒸餾塊的結構。網絡結構如下圖所示,由特徵提取塊,堆疊的信息蒸餾塊和重建塊組成。

每個信息蒸餾塊由增強單元壓縮單元組成。增強單元結構如下。

增強單元中,可以將上面的三個卷積層和下面的三個卷積層分別看成一個模塊。其中上面的模塊輸出局部短路徑信息,下面的模塊輸出局部長路徑信息。每個模塊中,第一個卷積層輸出的通道數比第二個卷積層輸出的通道數大,第三個卷積層輸出的通道數比第一個卷積層輸出的通道數大。上面的模塊輸出的局部短路徑信息在通道維度上被劃分爲兩部分,一部分與輸入數據串聯起來,另外一部分輸入下面的模塊。最後,將輸入的數據,保留的局部短路徑信息以及下面的模塊輸出的局部長路徑信息相加,即得到增強單元的輸出。

增強單元的輸出都會輸入到壓縮單元中。所謂的壓縮單元,就是一個1×1的卷積層,將特徵圖的通道維度進行壓縮,蒸餾掉冗餘的信息。

其實這篇文章方法的網絡結構與VDSR或是LapSRN的網絡結構很相似,都是學習高分辨率圖像和低分辨率圖像之間的殘差,與bicubic上採樣後的低分辨率圖像相加得到輸出。IDN通過壓縮網絡中特徵圖通道維度的方式,在減小網絡參數,提高速度的情況下,還保證了重建的結果。

github(caffe): https://github.com/Zheng222/IDN-Caffe

 

17.RDN

(Residual Dense Network for Image Super-Resolution, CVPR2018)

這篇文章的方法從名字上也能看出來吧。用了dense的方法,堆疊多個殘差稠密塊,提出了一個殘差稠密網絡,充分利用網絡中各個層級的特徵。與ICCV2017的SRDenseNet很像,不過SRDenseNet只有dense連接,本章方法多了1×1卷積後在相加的步驟,所以這個方法叫做residual dense。作者爲在殘差稠密塊中的1×1卷積起名叫局部特徵融合,殘差稠密網絡最後的1×1卷積起名叫全局特徵融合。殘差稠密網絡和殘差稠密塊的結構分別如下所示。

github(torch): https://github.com/yulunzhang/RDN

github(tensorflow): https://github.com/hengchuan/RDN-TensorFlow

 

18.RCAN

(Image Super-Resolution Using Very Deep Residual Channel Attention Networks, ECCV2018)

這篇文章中提到,越來越深的卷積神經網絡是使得超分辨率任務的精度越來越高了,然而之前的網絡中的特徵包含有多餘的低頻信息,但是網絡對於所有信息是同等對待的,從而限制了網絡的表達能力。於是,這篇文章將通道維度的注意力機制引入了超分辨率任務中。網絡結構如下。

網絡結構由特徵提取部分,堆疊的殘差組用於提取深層特徵,放大尺寸模塊和重建部分組成。每個殘差組包含多個殘差通道注意力塊。作者把這種結構起名叫殘差中的殘差,包含有長跳躍連接和短跳躍連接。作者指出,圖像的低頻信息可以通過這多個跳躍連接傳遞到網絡深層,從而讓網絡關注於高頻信息。我認爲其實這本來就是殘差網絡的恆等映射的優點,並且可以讓網絡變得更深的原因吧。殘差通道注意力塊的結構如下圖所示。

殘差通道注意力塊中用一個全局平均池化操作來獲得每個通道的全局空間信息的表達。然後使用sigmoid函數實現門控機制,從而賦予網絡通道注意力機制。

文章給出的視覺結果全是圖像中高頻信息十分豐富的部分,都是很密集的線或者很密集的網格,與其他結果相比確實好很多,說明文章中所說的讓網絡關注於重建圖像的高頻信息部分,確實有很好的效果。

github(pytorch): https://github.com/yulunzhang/RCAN

 

19.MSRN

(Multi-scale Residual Network for Image Super-Resolution, ECCV2018)

這篇文章的出發點也是爲了充分利用低分辨率圖像的特徵,從而提出了一個多尺度殘差塊的結構。所謂的多尺度殘差塊,就是將殘差塊和inception塊進行了結合,使用了不同尺寸的卷積核,從而可以在不同的尺寸上獲取圖像的特徵。文章指出這是第一次在殘差結構上使用多尺度的模式。在多尺度殘差塊中,會對提取的局部多尺度特徵進行融合。多尺度殘差網絡則由多個多尺度殘差塊堆疊而成,在網絡的最後部分,將每一個多尺度殘差塊的輸出結合在一起進行全局特徵融合,從而重建出超分辨率結果。多尺度殘差網絡和多尺度殘差塊的結構示意圖分別如下所示。

 

github(pytorch): https://github.com/MIVRC/MSRN-PyTorch

 

20.CARN

(Fast, Accurate, and Lightweight Super-Resolution with Cascading Residual Network, ECCV2018)

這篇文章的出發點也是爲了減輕網絡的體量,增強實用性。作者採用了一種級聯機制來實現目的,提出了級聯殘差網絡。網絡結構如下。

在級聯殘差網絡中,包含多個級聯塊。級聯塊內部也包含多個跳躍的連接,這樣就使得級聯殘差網絡在局部和全局都可以混合多級的特徵。網絡使用亞像素卷積層進行尺寸的放大。級聯塊的結構如下所示。

爲了提高網絡的效率,作者提出了上圖(b)的殘差-E塊,使用的是與MobileNet類似的方法,不過是使用分組卷積替換深度卷積。上圖(c)則是級聯塊的結構。爲了進一步減少參數,可以像遞歸網絡一樣,對級聯塊的參數進行共享,如上圖中的(d)。

 

22. SFTGAN

(Recovering Realistic Texture in Image Super-resolution by Deep Spatial Feature Transform, CVPR2018)

這篇文章的主要目標是在超分辨率結果中恢復出自然真實的紋理。爲了實現這一目標,文章將語義分割概率圖作爲語義類別先驗條件,即確定圖像中屬於天空、水或者草地等的區域,從而有助於生成更加豐富真實的紋理。作者提出了一種空間特徵調製層,將語義類別先驗結合到網絡中。網絡結構示意圖如下所示。

空間特徵調製層的過程是由先驗條件中得到仿射變換和平移的參數,再對網絡的中間特徵進行仿射變換操作。訓練網絡時使用的感知損失和對抗損失。

github(pytorch/torch): https://github.com/xinntao/SFTGAN

 

23. SRFeat

(SRFeat: Single Image Super-Resolution with Feature Discrimination, ECCV2018)

這篇文章中說到,雖然已有的基於GAN的超分辨率方法能夠被用來生成真實的紋理信息,但是它們都傾向於生成與輸入圖像無關的不太有意義的高頻噪聲。於是,作者增加了一個作用於特徵域的判別網絡,使得生成網絡能夠生成與圖像結構相關的高頻特徵。生成網絡的結構如下。

生成網絡中間部分由多個殘差塊以及遠程跳躍連接組成,這樣的結構可以更有效地傳遞遠程層之間的信息。之後由亞像素卷積層完成尺寸放大的操作。判別網絡結構如下。

訓練網絡時,作者先用均方誤差預訓練生成網絡,然而,此時得到的結果並不能得到視覺上讓人滿意的結果。接下來,再用感知損失兩個對抗損失來訓練網絡。一個對抗損失對應的是圖像判別網絡,也就是和原有方法一樣,對圖像的像素值進行評判。另外一個對抗損失則對應的是特徵判別網絡,是對圖像的特徵圖進行評判,即將感知損失中計算的對象交由判別網路進行判斷。通過添加這個特徵判別網絡,生成網絡被訓練得能夠合成更多有意義的高頻細節。作者提到,他們嘗試了多種特徵判別網絡的結構,但是得到的結果都很接近。

從文章給出的視覺結果來看,添加了特徵判別網絡後,確實能夠生成更加真實豐富的細節。

 

24.ESRGAN

(ESRGAN: Enhanced Super-Resolution Generative Adversarial Networks, ECCV2018 PIRM Workshop)

這一篇文章爲了去除SRGAN的結果中的人工僞影,增強結果的視覺質量,從生成網絡,判別網絡和感知損失三個方面進行了提升。首先,生辰網絡的結構圖下。

圖中橙色表示的基礎塊,可以選擇殘差塊(與SRGAN一樣),稠密塊,或者是本文提出的殘差中的殘差稠密塊。殘差中的殘差稠密塊結構如下。

在EDSR中就指出了去掉BN層能夠給超分辨率任務的結果帶來提升。作者將BN層去掉,同時將原始殘差塊中的殘差映射分支結構改爲稠密連接的結構。一個殘差中的殘差稠密塊中包含多個修改後殘差塊以及一個長跳躍連接的恆等映射,所以叫做殘差中的殘差。作者指出,由於這個結構使得網絡更深並且更復雜,給結果的提升帶來了好處。爲了訓練這麼深的網絡,同時使結果更好,還使用了殘差縮放、更小的初始化等操作。

判別網絡的改進是將原先標準的判別網絡改爲了相對的判別網絡,即原先的判別網絡是判斷輸入圖像是否是真實的,而現在判別網絡是判斷輸入圖像是否比假的圖像更加真實,比較的對象是對一個mini-batch中所有假數據取平均值。使用相對的判別網絡以後,反向傳播給生成網絡的梯度能來自生成數據和真實數據,而不像以前只能來自生成數據,因此生成網絡能夠生成更加銳利的邊緣和更加豐富的紋理細節。

對感知損失的改進是使用的是激活函數之前的數據,而不是使用激活函數輸出的數據。由於激活函數是稀疏的,因此激活函數帶了了非常弱的監督。同時,作者還發現使用激活函數輸出的數據,會帶來重建圖像與GT亮度不一致的問題。在參加PIRM2018比賽中,作者嘗試了不同的感知損失,還專門fine-tuned了VGG網絡用於材料識別任務,因爲這個任務更加註重於紋理而不是物體。

文章中還提到了網絡插值的操作。即先用均方誤差訓練好一個生成網絡,再基於GAN訓練一個生成網絡,將兩個訓練好的網絡中的所有參數賦予權重進行插值,即可得到一個插值的網絡。通過調節權重,即可以平衡模型的視覺質量與逼真度。

此方法在PIRM2018比賽中拿到了Region 3的第一名。

github(pytorch): https://github.com/xinntao/ESRGAN

通過以上24篇有關深度學習超分辨率方法的論文,可以看到通過網絡結構、損失函數以及訓練方式的演變,深度學習超分辨率方法在結果、速度以及應用性上都有了不斷的提高。這裏再放上一篇深度學習超分辨率方法綜述的鏈接(Super-Resolution via Deep Learning)以及github上一個超分辨率方法的總結(https://github.com/YapengTian/Single-Image-Super-Resolution)。

非常感謝許多知乎和博客上的文章,由於比較多,這裏列出參考得比較多的幾個資源:

https://zhuanlan.zhihu.com/p/25532538?utm_source=tuicool&utm_medium=referral

http://blog.csdn.net/u011692048/article/category/7121139

http://blog.csdn.net/wangkun1340378/article/category/7004439

 

 

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