1. 程式人生 > >總結深度學習端到端超解析度方法

總結深度學習端到端超解析度方法

第一部分

超解析度技術(Super-Resolution, SR)是指從觀測到的低解析度影象重建出相應的高解析度影象,在監控裝置、衛星影象和醫學影像等領域都有重要的應用價值。

本文針對端到端的基於深度學習的單張影象超解析度方法(Single Image Super-Resolution, SISR),總結一下從SRCNN到EDSR的發展歷程。(排列順序大致按論文中給出的4倍上取樣結果的峰值信噪比(Peak Signal to Noise Ratio, PSNR)從低到高排列)

1. SRCNN

SRCNN是深度學習用在超解析度重建上的開山之作。SRCNN的網路結構非常簡單,僅僅用了三個卷積層,網路結構如下圖所示。

SRCNN首先使用雙三次(bicubic)插值將低解析度影象放大成目標尺寸,接著通過三層卷積網路擬合非線性對映,最後輸出高解析度影象結果。本文中,作者將三層卷積的結構解釋成三個步驟:影象塊的提取和特徵表示,特徵非線性對映和最終的重建。

三個卷積層使用的卷積核的大小分為為9x9,,1x1和5x5,前兩個的輸出特徵個數分別為64和32。用Timofte資料集(包含91幅影象)和ImageNet大資料集進行訓練。使用均方誤差(Mean Squared Error, MSE)作為損失函式,有利於獲得較高的PSNR。

2. FSRCNN

FSRCNN與SRCNN都是香港中文大學Dong Chao, Xiaoou Tang等人的工作。FSRCNN是對之前SRCNN的改進,主要在三個方面:一是在最後使用了一個反捲積層放大尺寸,因此可以直接將原始的低解析度影象輸入到網路中,而不是像之前SRCNN那樣需要先通過bicubic方法放大尺寸。二是改變特徵維數,使用更小的卷積核和使用更多的對映層。三是可以共享其中的對映層,如果需要訓練不同上取樣倍率的模型,只需要fine-tuning最後的反捲積層。

由於FSRCNN不需要在網路外部進行放大圖片尺寸的操作,同時通過新增收縮層和擴張層,將一個大層用一些小層來代替,因此FSRCNN與SRCNN相比有較大的速度提升。FSRCNN在訓練時也可以只fine-tuning最後的反捲積層,因此訓練速度也更快。FSRCNN與SCRNN的結構對比如下圖所示。

FSRCNN可以分為五個部分。特徵提取:SRCNN中針對的是插值後的低解析度影象,選取的核大小為9×9,這裡直接是對原始的低解析度影象進行操作,因此可以選小一點,設定為5×5。收縮:通過應用1×1的卷積核進行降維,減少網路的引數,降低計算複雜度。非線性對映:感受野大,能夠表現的更好。SRCNN中,採用的是5×5的卷積核,但是5×5的卷積核計算量會比較大。用兩個串聯的3×3的卷積核可以替代一個5×5的卷積核,同時兩個串聯的小卷積核需要的引數3×3×2=18比一個大卷積核5×5=25的引數要小。FSRCNN網路中通過m個核大小為3×3的卷積層進行串聯。擴張:作者發現低維度的特徵帶來的重建效果不是太好,因此應用1×1的卷積核進行擴維,相當於收縮的逆過程。反捲積層:可以堪稱是卷積層的逆操作,如果步長為n,那麼尺寸放大n倍,實現了上取樣的操作。

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

3. ESPCN

作者在本文中介紹到,像SRCNN那樣的方法,由於需要將低解析度影象通過上取樣插值得到與高解析度影象相同大小的尺寸,再輸入到網路中,這意味著要在較高的解析度上進行卷積操作,從而增加了計算複雜度。本文提出了一種直接在低解析度影象尺寸上提取特徵,計算得到高解析度影象的高效方法。ESPCN網路結構如下圖所示。

ESPCN的核心概念是亞畫素卷積層(sub-pixel convolutional layer)。網路的輸入是原始低解析度影象,通過三個卷積層以後,得到通道數為 r^{2} 的與輸入影象大小一樣的特徵影象。再將特徵影象每個畫素的 r^{2} 個通道重新排列成一個 \[r \times r\] 的區域,對應高解析度影象中一個 \[r \times r\] 大小的子塊,從而大小為 \[H \times W \times {r^2}\] 的特徵影象被重新排列成 \[rH \times rW \times 1\] 的高解析度影象。我理解的亞畫素卷積層包含兩個過程,一個普通的卷積層和後面的排列畫素的步驟。就是說,最後一層卷積層輸出的特徵個數需要設定成固定值,即放大倍數r的平方,這樣總的畫素個數就與要得到的高解析度影象一致,將畫素進行重新排列就能得到高解析度圖。

在ESPCN網路中,影象尺寸放大過程的插值函式被隱含地包含在前面的卷積層中,可以自動學習到。由於卷積運算都是在低解析度影象尺寸大小上進行,因此效率會較高。

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

4. VDSR

在介紹VDSR之前,首先想先提一下何愷明在2015年的時候提出的殘差網路ResNet。ResNet的提出,解決了之前網路結構比較深時無法訓練的問題,效能也得到了提升,ResNet也獲得了CVPR2016的best paper。殘差網路結構(residual network)被應用在了大量的工作中。

正如在VDSR論文中作者提到,輸入的低解析度影象和輸出的高解析度影象在很大程度上是相似的,也就是指低解析度影象攜帶的低頻資訊與高解析度影象的低頻資訊相近,訓練時帶上這部分會多花費大量的時間,實際上我們只需要學習高解析度影象和低解析度影象之間的高頻部分殘差即可。殘差網路結構的思想特別適合用來解決超解析度問題,可以說影響了之後的深度學習超解析度方法。VDSR是最直接明顯的學習殘差的結構,其網路結構如下圖所示。

VDSR將插值後得到的變成目標尺寸的低解析度影象作為網路的輸入,再將這個影象與網路學到的殘差相加得到最終的網路的輸出。VDSR主要有4點貢獻。1.加深了網路結構(20層),使得越深的網路層擁有更大的感受野。文章選取3×3的卷積核,深度為D的網路擁有(2D+1)×(2D+1)的感受野。2.採用殘差學習,殘差影象比較稀疏,大部分值都為0或者比較小,因此收斂速度快。VDSR還應用了自適應梯度裁剪(Adjustable Gradient Clipping),將梯度限制在某一範圍,也能夠加快收斂過程。3.VDSR在每次卷積前都對影象進行補0操作,這樣保證了所有的特徵圖和最終的輸出影象在尺寸上都保持一致,解決了影象通過逐步卷積會越來越小的問題。文中說實驗證明補0操作對邊界畫素的預測結果也能夠得到提升。4.VDSR將不同倍數的影象混合在一起訓練,這樣訓練出來的一個模型就可以解決不同倍數的超解析度問題。

5. DRCN

DRCN與上面的VDSR都是來自首爾國立大學計算機視覺實驗室的工作,兩篇論文都發表在CVPR2016上,兩種方法的結果非常接近。DRCN第一次將之前已有的遞迴神經網路(Recursive Neural Network)結構應用在超解析度處理中。同時,利用殘差學習的思想(文中的跳躍連線(Skip-Connection)),加深了網路結構(16個遞迴),增加了網路感受野,提升了效能。DRCN網路結構如下圖所示。

DRCN輸入的是插值後的影象,分為三個模組,第一個是Embedding network,相當於特徵提取,第二個是Inference network, 相當於特徵的非線性對映,第三個是Reconstruction network,即從特徵影象恢復最後的重建結果。其中的Inference network是一個遞迴網路,即資料迴圈地通過該層多次。將這個迴圈進行展開,等效於使用同一組引數的多個串聯的卷積層,如下圖所示。

其中的 H_{1} 到 H_{D} 是D個共享引數的卷積層。將這D個卷積層的每一層的結果都通過相同的Reconstruction Net,在Reconstruction Net中與輸入的影象相加,得到D個輸出重建結果。這些所有的結果在訓練時都同時被監督,即所有的遞迴都被監督,作者稱之為遞迴監督(Recursive-Supervision),避免了梯度消失/爆炸問題。將D個遞迴得到的結果再加權平均:\[\widehat y = \sum\limits_{d = 1}^D {{w_d} \cdot {{\widehat y}_d}} \],得到一個總輸出。每個加權 w_{d} 在訓練的過程中也不斷地更新。最終的目標函式就需要優化每一個遞迴層輸出的誤差和總輸出的誤差:

\[{l_1}\left( \theta \right) = \sum\limits_{d = 1}^D {\sum\limits_{i = 1}^N {\frac{1}{{2DN}}{{\left\| {{y^{\left( i \right)}} - \widehat y_d^{\left( i \right)}} \right\|}^2}} } \]

\[{l_2}\left( \theta \right) = \sum\limits_{i = 1}^N {\frac{1}{{2N}}{{\left\| {{y^{\left( i \right)}} - \sum\limits_{d = 1}^D {{w_d} \cdot \widehat y_d^{\left( i \right)}} } \right\|}^2}} \]

\[L\left( \theta \right) = \alpha {l_1}\left( \theta \right) + \left( {1 - \partial } \right){l_2}\left( \theta \right) + \beta {\left\| \theta \right\|^2}\]

\beta 表示的是權值衰減(weight decay)。 \alpha 的初始值設定得比較高以使得訓練過程穩定,因為訓練開始的階段遞迴更容易收斂。隨著訓練的進行, \alpha 逐漸衰減來提升最終輸出的效能。

6. RED

這篇文章提出了由對稱的卷積層-反捲積層構成的網路結構,作為一個編碼-解碼框架,可以學習由低質影象到原始影象端到端的對映。網路結構如下圖所示。

RED網路的結構是對稱的,每個卷積層都有對應的反捲積層。卷積層用來獲取影象的抽象內容,反捲積層用來放大特徵尺寸並且恢復影象細節。卷積層將輸入影象尺寸減小後,再通過反捲積層上取樣變大,使得輸入輸出的尺寸一樣。每一組映象對應的卷積層和反捲積層有著跳線連線結構,將兩部分具有同樣尺寸的特徵(要輸入卷積層的特徵和對應的反捲積層輸出的特徵)做相加操作(ResNet那樣的操作)後再輸入到下一個反捲積層。這樣的結構能夠讓反向傳播訊號能夠直接傳遞到底層,解決了梯度消失問題,同時能將卷積層的細節傳遞給反捲積層,能夠恢復出更乾淨的圖片。可以看到,網路中有一條線是將輸入的影象連線到後面與最後的一層反捲積層的輸出相加,也就是VDSR中用到的方式,因此RED中間的卷積層和反捲積層學習的特徵是目標影象和低質影象之間的殘差。RED的網路深度為30層,損失函式用的均方誤差。

7. DRRN

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

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

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

8. LapSRN

論文中作者先總結了之前的方法存在有三點問題。一是有的方法在輸入影象進網路前,需要使用預先定義好的上取樣操作(例如bicubic)來獲得目標的空間尺寸,這樣的操作增加了額外的計算開銷,同時也會導致可見的重建偽影。而有的方法使用了亞畫素卷積層或者反捲積層這樣的操作來替換預先定義好的上取樣操作,這些方法的網路結構又相對比較簡單,效能較差,並不能學好低解析度影象到高解析度影象複雜的對映。二是在訓練網路時使用 l_{2} 型損失函式時,不可避免地會產生模糊的預測,恢復出的高解析度圖片往往會太過於平滑。三是在重建高解析度影象時,如果只用一次上取樣的操作,在獲得大倍數(8倍以上)的上取樣因子時就會比較困難。而且在不同的應用時,需要訓練不同上取樣倍數的模型。針對這三點問題,作者提出了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設計了損失函式來訓練網路,對每一級的結果都進行監督,因此取得了不錯的結果。

9. SRDenseNet

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

SRDenseNet將稠密塊結構應用到了超解析度問題上,取得了不錯的效果。網路結構如下圖所示。

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

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

10. SRGAN(SRResNet)

在這篇文章中,將生成對抗網路(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模型低層特徵的內容損失能生成更好的紋理細節。

11. EDSR

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

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

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

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

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

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

第二部分

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

1. 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值最高,而同時使用感知損失、紋理匹配損失和對抗損失三種損失函式得到的結果更加自然真實。

2.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

3. 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

4. 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

5.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

6.RCAN

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

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

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

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

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

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

7. MSRN

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

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

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

8. CARN

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

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

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

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

9.ZSSR

(“Zero-Shot” Super-Resolution using Deep Internal Learning, CVPR2018)

這一篇文章叫做“零樣本”超解析度,我個人覺得也算是一個比較另闢蹊徑的想法吧。所謂的“零樣本”超解析度,作者採用的做法是利用影象的內部資訊,用影象本身來訓練網路。由於只有一個例項,因此先對這張影象進行不同倍率的下采樣,得到這張影象本身以及多個不同的下采樣版本,這些圖片就被用來當作訓練網路用的標籤。再將這些圖片進行目標倍率的下采樣,即可得到訓練的輸入資料。對資料集再進行一些旋轉、翻轉等增強操作,然後用增強後的資料集訓練一個相對輕量的卷積神經網路。由於訓練資料都是由影象本身得到的,資料分佈比較集中,因此網路能夠很快得到收斂。再將影象本身輸入到網路中,即可完成對原始影象的上取樣操作。論文中的過程示意圖如下。

作為一個無監督的方法,ZSSR重建的影象的PSNR與一眾用大量資料訓練的監督方法相比還是會低一些,不過作者指出ZSSR更加適應真實場景中的影象超解析度,除了對影象進行超解析度外,還能夠解決感測器噪聲、影象壓縮等問題,這都是隻用bicubic下采樣生成的資料集訓練的方法完成不了的。我認為這篇文章真的是很有意思的一個想法,不過ZSSR應該不太適用於較大倍率的超解析度任務。

github(tensorflow): https://github.com/assafshocher/ZSSR

10. SFTGAN

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

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

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

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

11. SRFeat

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

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

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

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

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

12.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

同時,再補充一點,CVPR2018的《The Perception-Distortion Tradeoff》,提出了超解析度方法的感知指標理論,也在PIRM2018比賽中所使用。