學習筆記之——基於深度學習的圖像超分辨率重建

       最近開展圖像超分辨率( Image Super Resolution)方面的研究,做了一些列的調研,並結合本人的理解總結成本博文~(本博文僅用於本人的學習筆記,不做商業用途)

本博文涉及的paper已經打包,供各位看客下載哈~https://download.csdn.net/download/gwplovekimi/10728916

 

目錄

超分辨率(Super Resolution,SR)

傳統的圖像超分辨率重建技術簡介

基於插值的圖像超分

基於重建的圖像超分辨率

基於學習的圖像超分辨率

基於深度學習的圖像超分辨率重建技術

兩種常用的評價超分的指標——PSNR和SSIM

SRCNN(Super-Resolution Convolutional Neural Network)

FSRCNN(Fast Super-Resolution Convolutional Neural Networks)

ESPCN(Efficient Sub-Pixel Convolutional Neural Network)

VESPCN(Video Efficient Sub-Pixel Convolutional Neural Network)

VDSR(VeryDeep Convolutional Networks)

DRCN(Deeply-Recursive Convolutional Network)

RED(very deep Residual Encoder-Decoder Networks)

DRRN(Deep Recursive Residual Network)

LapSRN(Laplacian PyramidSuper-Resolution Network)

SRDenseNet

SRGAN(SRResNet,super-resolution generative adversarial network)

EDSR(enhanced deep super-resolution network)

參考材料


 

超分辨率(Super Resolution,SR)

超分辨率是計算機視覺的一個經典應用。SR是指通過軟件或硬件的方法,從觀測到的低分辨率圖像重建出相應的高分辨率圖像(說白了就是提高分辨率),在監控設備、衛星圖像遙感、數字高清、顯微成像、視頻編碼通信、視頻復原和醫學影像等領域都有重要的應用價值。

超分分爲以下兩種:

  • Image SR。只參考當前低分辨率圖像,不依賴其他相關圖像的超分辨率技術,稱之爲單幅圖像的超分辨率(single image super resolution,SISR)。
  • Video SR。參考多幅圖像或多個視頻幀的超分辨率技術,稱之爲多幀視頻/多圖的超分辨率(multi-frame super resolution)。對於video SR,其核心思想就是用時間帶寬換取空間分辨率。簡單來講,就是在無法得到一張超高分辨率的圖像時,可以多取相鄰幾幀,然後將這一系列低分辨率的圖像組成一張高分辨的圖像。

一般來講Video SR相比於Image SR具有更多的可參考信息,並具有更好的高分辨率視頻圖像的重建質量,但是其更高的計算複雜度也限制了其應用。本博文主要介紹SISR。SISR是一個逆問題,對於一個低分辨率圖像,可能存在許多不同的高分辨率圖像與之對應,因此通常在求解高分辨率圖像時會加一個先驗信息進行規範化約束。在傳統的方法中,這個先驗信息可以通過若干成對出現的低-高分辨率圖像的實例中學到。而基於深度學習的SR通過神經網絡直接學習分辨率圖像到高分辨率圖像的端到端的映射函數。

 

傳統的圖像超分辨率重建技術簡介

基於插值的圖像超分

      通過某個點周圍若干個已知點的值,以及周圍點和此點的位置關係,根據一定的公式,算出此點的值,就是插值法。對於如何把原圖像的點擺放在新圖中並確定具體座標;未知的點計算時,需要周圍多少個點參與,公式如何,如何計算,不同的方案選擇,就是不同的插值算法。圖像處理中,常用的插值算法有:最鄰近元法,雙線性內插法,三次內插法等等。

例如:現有一張分辨率爲3 x 2的圖片,原圖每個像素點的亮度值是:

我們要把它變成分辨率爲6 x 4的圖片,把這6個已經知道的點,放在他們大概應該在新圖的位置:

那麼我們已經知道6 x 4新圖中6個已知的點(綠色),下面只需要求剩餘18個點(藍色)的值即可。通過某個點周圍若干個已知點的值,以及周圍點和此點的位置關係,根據一定的公式,算出此點的值,就是插值法。如何把原圖像的點擺放在新圖中(確定具體座標);未知的點計算時,需要周圍多少個點參與,公式如何。不同的方案選擇,就是不同的插值算法。圖像處理中,常用的插值算法有:最鄰近元法,雙線性內插法,三次內插法等等。但是實際上,通過這些插值算法,提升的圖像細節有限,所以使用較少。通常,通過多幅圖像之間的插值算法來重建是一個手段。另外,在視頻超分辨重建中,通過在兩個相鄰幀間插值添加新幀的手段,可以提升視頻幀率,減少畫面頓挫感。

基於重建的圖像超分辨率

基於重建的方法通常都是基於多幀圖像的,需要結合先驗知識。有如下方法:

  • 凸集投影法(POCS)

  • 貝葉斯分析方法

  • 迭代反投影法(IBP)

  • 最大後驗概率方法

  • 正規化法

  • 混合方法

基於學習的圖像超分辨率

機器學習領域(非深度學習鄰域)的圖像超分方法如下:

  • Example-based方法

  • 鄰域嵌入方法

  • 支持向量迴歸方法

  • 虛幻臉

  • 稀疏表示法

 

基於深度學習的圖像超分辨率重建技術

基於深度學習的圖像超分辨率重建的研究流程如下:

1,首先找到一組原始圖像Image1;

2,然後將這組圖片降低分辨率爲一組圖像Image2;

3,通過各種神經網絡結構,將Image2超分辨率重建爲Image3(Image3和Image1分辨率一樣)

4,通過PSNR等方法比較Image1與Image3,驗證超分辨率重建的效果,根據效果調節神經網絡中的節點模型和參數

5,反覆執行,直到第四步比較的結果滿意

 

兩種常用的評價超分的指標——PSNR和SSIM

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

1、PSNR(Peak Signal to Noise Ratio)峯值信噪比:

MSE表示當前圖像X和參考圖像Y的均方誤差(Mean Square Error),H、W分別爲圖像的高度和寬度

PSNR的單位是db,數值越大表示失真越小。n爲每像素的比特數,一般的灰度圖像取8,即像素灰階數爲256. 

 

SRCNN(Super-Resolution Convolutional Neural Network)

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

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

傳統的SR方法都是學習compact dictionary or manifold space to relate low/high-resolution patches。

SRCNN是深度學習在圖像超分辨率重建上的開山之作,通過採用卷積神經網絡來實現低分辨率到高分辨率圖像之間端到端的映射。網絡的結構如下圖所示:

對於一個低分辨率得圖像,首先採用雙三次插值(bicubic)將低分辨率圖像放大成目標尺寸,接着通過三層卷積網絡擬合非線性映射,最後輸出高分辨率圖像結果。在文種,作者將三層卷積的結構解釋成三個步驟:圖像塊的提取和特徵表示,特徵非線性映射和最終的重建。三個卷積層使用的卷積核的大小分爲爲9x9,,1x1和5x5,前兩個的輸出特徵個數分別爲64和32。用Timofte數據集(包含91幅圖像)和ImageNet大數據集進行訓練。使用均方誤差(Mean Squared Error, MSE)作爲損失函數,有利於獲得較高的PSNR。

SRCNN的流程爲:

step1:圖像塊提取(Patch extraction and representation)。先將低分辨率圖像使用雙三次(實際上,bicubic也是一個卷積的操作,可以通過卷積神經網絡實現)插值放大至目標尺寸(如放大至2倍、3倍、4倍,屬於預處理階段),此時仍然稱放大至目標尺寸後的圖像爲低分辨率圖像(Low-resolution image),即圖中的輸入(input)。從低分辨率輸入圖像中提取圖像塊,組成高維的特徵圖。

其中,W1和B1爲超參。激活函數採樣ReLu

step2:非線性映射(Non-linear mapping)。第一層卷積:卷積核尺寸9×9(ff1),卷積核數目64(n1),輸出64張特徵圖;第二層卷積:卷積核尺寸1×1(ff2),卷積核數目32(n2),輸出32張特徵圖;這個過程實現兩個高維特徵向量的非線性映射;

W2爲n1*1*1*n2。採用了1*1卷積(single convolutional layer,目的應該是壓縮feature map的深度,同時也起到非線性映射的作用)。

step3:重建(Reconstruction)。第三層卷積:卷積核尺寸5×5(ff3),卷積核數目1(n3),輸出1張特徵圖即爲最終重建高分辨率圖像;

模型參數結構如下:

  • 第一層卷積:卷積核尺寸9×9(f1×f1),卷積核數目64(n1),輸出64張特徵圖;
  • 第二層卷積:卷積核尺寸1×1(f2×f2),卷積核數目32(n2),輸出32張特徵圖;
  • 第三層卷積:卷積核尺寸5×5(f3×f3),卷積核數目1(n3),輸出1張特徵圖即爲最終重建高分辨率圖像。

LOSS function(Mean Squared Error (MSE))。估計超參爲重構的結果,爲ground truth。Using MSE as the loss function favors a high PSNR.

下面是SRCNN與傳統算法得結果對比

SRCNN的本質就是用了深度卷積網絡實現了稀疏編碼的方法。只不過稀疏編碼的參數需要人工優化,而且能優化的參數有限。但是SRCNN能根據輸入的訓練集自動優化學習所有參數。因此效果比以前的方法要好。

 

FSRCNN(Fast Super-Resolution Convolutional Neural Networks)

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

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

對於一幅240*240的圖片,要放大三倍,SRCNN的速度爲1.32fps(而實際要求起碼要到24fps)

FSRCNN是對SRCNN的改進(主要起到加速的作用,40times)。改進結果體現在非常快的處理速度上和稍稍提高的輸出質量。其主要貢獻有三點:

  1. 在最後使用了一個反捲積層(deconvolution layer)放大尺寸(並將反捲積層放於最後,可以縮少計算時間),因此可以將原始的低分辨率圖像直接輸出到網絡中,不需要先通過bicubic interpolation方法放大尺寸,直接對低分辨率圖像進行處理(去掉預處理階段,可以大大提升速度);
  2. 非線性映射部分也十分耗費計算時間(通過shrink the network scale來提高實時性)。改變特徵維數,更小的卷積核,更多的映射層;在映射前縮少輸入特徵的維數,然後再擴展;
  3. 可共享其中的卷積層,如需訓練不同上採樣倍率的模型,只需fine-tuning最後的反捲積層。only need to do convolution operations once, and upsample an image to different scales using the corresponding deconvolution layer.

由於FSRCNN不需要在網絡外部進行放大圖像尺寸(小的圖片尺寸可以降低訓練時間),同時用一些小的卷積層來代替SRCNN中的大卷積層,因此速度上FSRCNN有較大的提升。且如果僅僅需要FSRCNN得到不同分辨率的圖片,只需單獨訓練反捲積層即可,更加省時,不需要重新訓練整個網絡。SRCNN與FSRCNN的網絡結構對比如下圖所示:

FSRCNN分爲五個步驟(每個卷積層的激活函數採用PReLU):

step1:特徵的提取(feature extraction)。SRCNN中針對的是插值後的低分辨率圖像,選取的核大小爲9×9。而FSRCNN是直接是對原始的低分辨率圖像進行操作,因此可以選小一點,設置爲5×5。

step2:收縮(shrinking)。在SRCNN中,特徵提取完就進行非線性映射,但當feature map的深度較大時,計算複雜度較高。故此在FSRCNN中,通過應用1×1的卷積核進行降維,減少網絡的參數(降低深度),降低計算複雜度。

step3:非線性映射(mapping,The non-linear mapping step is the most important part that affects the SR performance,主要體現在每一層的濾波器數目,以及層數(也即是深度))。感受野大,能夠表現的更好。在SRCNN中,採用的是5×5的卷積核,但是5×5的卷積覈計算量會比較大。用兩個串聯的3×3的卷積核可以替代一個5×5的卷積核,同時兩個串聯的小卷積核需要的參數3×3×2=18比一個大卷積核5×5=25的參數要小。FSRCNN網絡中通過m個核大小爲3×3的卷積層進行串聯。

step4:擴張(expanding)。作者發現低維度的特徵帶來的重建效果不是太好,因此應用1×1的卷積核進行擴維,相當於收縮的逆過程(用1*1的卷積核進行擴張,增加深度)。

step5:反捲積層(deconvolution,卷積層的逆操作)。如果步長爲n,那麼尺寸放大n倍,實現了上採樣的操作。

For convolution, the filter is convolved with the image with a stride k, and the output is 1=k times of the input. Contrarily, if we exchange the position of the input and output, the output will be k times of the input。如下圖所示

卷積與反捲積的示意:

整個結構爲:

loss function 跟SRCNN一樣

結果對比如下:

 

ESPCN(Efficient Sub-Pixel Convolutional Neural Network)

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

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

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

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

(本文同時實現了video和image的超分)

本文的作者提到:對於類似於SRCNN的方法,由於需要將低分辨率圖像通過上採樣插值得到與高分辨率圖像相同大小的尺寸,再輸入到網絡中,這意味着要在交大的尺寸上進行卷積操作,從而增加了計算複雜度。爲此本文作者提出了一種直接在低分辨率圖像尺寸上提取特徵,計算得到高分辨率圖像的高效方法(efficient sub-pixel convolution layer 來代替插值處理)。ESPCN網絡結構如下圖所示。

ESPCN的核心概念是亞像素卷積層(sub-pixel convolutional layer)。網絡的輸入是原始低分辨率的圖像,經過三個CONV後,得到通道數爲 r^{2} 的與輸入圖像大小一樣的特徵圖像。再將特徵圖像每個像素的 r^{2} 個通道重新排列成一個 \[r \times r\] 的區域,對應高分辨率圖像中一個 \[r \times r\] 大小的子塊,從而大小爲 \[H \times W \times {r^2}\] 的特徵圖像被重新排列成 \[rH \times rW \times 1\] 的高分辨率圖像(理解如下圖所示)。而圖像尺寸放大過程的插值函數被隱含地包含在前面的卷積層中,有神經網絡自己學習到。由於卷積運算都是在低分辨率圖像尺寸大小上進行,因此效率會較高。

其效果如下圖所示:

(對 1080 HD 格式的視頻進行3倍放大,SRCNN 每幀需要0.435s,而 ESPCN 則只需0.038s)

 

VESPCN(Video Efficient Sub-Pixel Convolutional Neural Network)

Real-Time Video Super-Resolution with Spatio-Temporal Networks and Motion Compensation,CVPR2017)

STN(Spatial Transform Networks, STN

       CNN分類時,通常需要考慮輸入樣本的局部性、平移不變性、縮小不變性,旋轉不變性等,以提高分類的準確度。而實現這些不變性的傳統方法實際上就是對圖像進行空間座標變換,我們所熟悉的一種空間變換就是仿射變換,圖像的仿射變換公式可以表示如下:

式中,表示原圖像像素點,表示仿射變換後的圖像像素點。係數矩陣θ即爲仿射變換系數,可以通過調整係數矩陣θ,實現圖像的放大、縮小、平移、旋轉等。

       而STN網絡提出了一種叫做空間變換網絡的模型,該網絡不需要關鍵點的標定,能夠根據分類或者其它任務自適應地將數據進行空間變換和對齊(包括平移、縮放、旋轉以及其它幾何變換等)。在輸入數據空間差異較大的情況下,這個網絡可以加在現有的卷積網絡中,提高分類的準確性。該空間變換網絡包括三個部分,網絡結構如下圖所示:

Localisation Network——該網絡就是一個簡單的迴歸網絡。將輸入的圖片進行幾個卷積操作,然後全連接回歸出6個角度值(假設是仿射變換),2*3的矩陣。

Grid generator——網格生成器負責將V中的座標位置,通過矩陣運算,計算出目標圖V中的每個位置對應原圖U中的座標位置。即生成T(G)

Sampler——採樣器根據T(G)中的座標信息,在原始圖U中進行採樣,將U中的像素複製到目標圖V中。

簡而言之,STN網絡首先通過一個簡單的迴歸網絡生成6個θ,用以進行原圖的仿射變換。然後依據θ矩陣,將目標圖上每個點與原圖進行對應。最後使用採樣器,將原圖上的像素值採樣到目標圖中。流程如下圖:

但是,在VESPCN中,並不按照這個變換順序。作者使用一個近10層的卷積網絡,計算整一張輸入圖片的光流。即直接實現了STN網絡中的第二部分,然後再利用二次插值進行採樣操作。作者同樣將這個操作稱爲Spatial Transform。

好,介紹完STN後,正式介紹VESPCN。

在視頻圖像的SR問題中,相鄰幾幀間具有很強的關聯性。VESPCN(屬於video超分)提出使用視頻中的時間序列圖像進行高分辨率重建(可以達到實時性處理)。算法主要包括以下三個方面:

step 1:糾正相鄰幀的位移偏差,先通過Motion estimation(動作補償,可採用光流法)估計出位移,然後利用位移參數對相鄰幀進行空間變換,將二者對齊;

step 2:把對齊後的相鄰若干幀疊放在一起,當作一個三維數據;在低分辨率的三維數據上使用三維卷積,得到的結果大小爲\[H \times W \times {r^2}\]

step 3:採用ESPCN,將特徵圖像被重新排列成\[rH \times rW \times 1\]的高分辨率圖像;

VESPCN的網絡結構如下圖所示

VESPCN主要分爲兩塊:相鄰幀之間的位移估計和SR重建,兩者都通過神經網絡來實現(Spatio-temporal networks & Subpixel convolution SR)。SR重建採用的就是上面介紹的ESPCN。下面介紹一下動作補償

Motion estimation這個過程可以通過傳統的光流算法來計算,VESPCN使用了STN網絡進行動作補償(其框架如下圖所示)。Spatial Transformer Networks, 通過CNN來估計空間變換參數。首先通過初始的兩幀(低的分辨率上)估計粗糙的光流,並生成粗糙的目標幀,這兩個再與原始的兩個幀插值(高的分辨率)輸入網絡,得到精細的光流。精細的光流和粗糙光流一起得到最後的幀。輸出使用tanh激活層。

具體來說,在VESPCN中,是利用video前後兩幀圖像的信息來進行高分辨率的重建,然而在視頻序列中,前後兩幀中的場景與物體會發生(微小)的位移,因此在SR前,要先對兩幀圖像進行“對齊”。“對齊”的過程可以看作是對圖像做仿射變換的過程,圖片並不是只通過平移就可以“對齊”,還要進行旋轉、縮放等操作。因此作者借鑑了STN網絡和光流的思想,使用動作補償網絡來實現兩幀圖片的對齊功能。具體步驟如下:

  • 代表前後兩幀圖片,首先將它們進行堆疊(即在第三維上拼接),後通過一個6層的卷積網絡(如下圖)得到長寬與原圖相同,通道數爲2的一張feature map,即圖中的∆c(代表其x方向分量),稱爲粗糙光流。

  • Warp是STN網絡的步驟,即利用得到的光流圖對進行仿射變換(對齊)得到。這樣做得到的動作補償仍然達不到理想要求。因此還要計算精細光流。
  • 將原圖的前後兩幀()、粗糙光流、經過首次warp之後得到的圖片(即),三張圖進行堆疊,使用一個6層的卷積網絡(上圖)計算得到一張通道數爲2的精細光流。
  • 將粗糙光流圖與精細光流圖相加,得到聯合光流圖(圖中)。再利用聯合光流圖對進行仿射變換,即使用STN。得到最終的經過動作補償後的

loss function

損失函數由三個部分組成:

1. 高分辨率輸出圖MSE損失 (ESPCN網絡的損失函數)

2. [前一幀+當前]動作補償圖MSE損失 + Huber 損失 (光流與STN)

3. [後一幀+當前]動作補償圖MSE損失 + Huber 損失 (光流與STN)

圖像融合

Spatio-temporal networks可以處理輸入爲許多幀的情況,對於前中後三幀(多個幀)融合的方法有early fusion,slow fusion,3D convolution三種。其中3D convolution是slow fusion的權重共享的形式。如下圖所示

在VESPCN中使用的是early fusion方法,即在三張圖片輸入網絡之前就進行堆疊。但是論文作者認爲slow fusion在網絡變深時效果纔好於early fusion。

結果展示:

 

VDSR(VeryDeep Convolutional Networks)

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

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

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

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

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

VDSR是從SRCNN的基礎上改進的網絡。正如它的名字Very Deep Super-Resolution,其最大的結果特點就是層數很多。它的最終效果準確率非常地高,並且還比SRCNN快。作者認爲SRCNN有三個缺點:

1、學習的信息有限。

SR是一個逆問題,解決SR問題是藉助大量的學習信息得到結果。直觀地認爲,如果學習的數據越多,學習的上限越大,那麼得到的準確性越高。在深度學習中,就是感受野越大,理論上得到的準確性越高。而SRCNN只有三層,得到感受野只有13*13,結果受限於那13*13個像素。

2、收斂太慢。

雖然SRCNN相比於當時其他的SR算法已經算快了,但在還是無法滿足實際需求,SRCNN訓練一個網絡花了一星期之久,而SR的應用領域之非常多,要實現實際的應用,對算法收斂速度的提升是很有必要的。

3、無法實現統一模型的多尺度方法。

雖然放大倍數是在訓練前認爲設計的,但在生活中人們放大一張圖可以是任意倍數的(包括小數)。SRCNN一個網絡只能訓練一個放大倍數,倘若對每一個倍數都訓練一個SRCNN,那是不現實的。所以我們期望一種新的網絡能實現不同倍數的超分辨。

這三個缺點,也是作者針對SRCNN的改進方向,最終創造一種多層網絡能優化以上缺點,命名爲VDSR。

對於超分的問題,實際上,輸入的低分辨率圖像與輸出的高分辨率圖像在很大程度上是相似的。也就是,低分辨率圖像的低頻信息與高分辨率圖像的低頻信息相近。那麼實際上,低分辨率圖片與高分辨率圖片只是缺乏高頻部分的殘差,若訓練的時候,僅僅訓練高分辨率和低分辨率之間的高頻殘差部分,那麼就不需要在低頻部分花太多的時間。爲此,作者引入了ResNet的思想(參見博文:學習筆記之——基於深度學習的分類網絡(未完待續))輸出的結果=低分辨率輸入(經過插值變成目標尺寸的低分辨率圖像)+網絡學習到的殘差。殘差網絡結構的思想特別適合用來解決超分辨率問題,可以說影響了之後的深度學習超分辨率方法。VDSR是最直接明顯的學習殘差的結構,其網絡結構如下圖所示

VDSR的改進:

1.加深了網絡結構(20層),使得越深的網絡層擁有更大的感受野。文章選取3×3的卷積核,深度爲D的網絡擁有(2D+1)×(2D+1)的感受野。

本文的作者認爲多層網絡對提高SR的準確性非常有幫助,原因有兩個:(i)多層網絡能獲得非常大的感受野理論上,感受野越大,學習的信息越多,準確率越大。對於一個m層全卷積網絡,如果每層的過濾器大小(假設長和寬相等)是fi,那麼用數學歸納法最終得到的感受野爲當m=20,fi=3。得到的感受野爲(20*3+1-20)* (20*3+1-20),即爲41*41。(ii)多層網絡能現實複雜的非線性映射,如下圖所示,爲層數對VDSR的效果影響,可以看出層數越多,效果越好

但太多層網絡也有不好的地方。首先是多層網絡的收斂問題,SRCNN層提出4層的網絡,但訓練了一星期得出的結果不好。作者認爲這是由於4層SRCNN的收斂速度低和收斂穩定不好而導致的。爲了解決收斂問題,作者採用了殘差學習和自適應梯度剪切的方法。

2.採用殘差學習,殘差圖像比較稀疏,大部分值都爲0或者比較小,因此收斂速度快。VDSR還應用了自適應梯度裁剪(Adjustable Gradient Clipping),將梯度限制在某一範圍,也能夠加快收斂過程。與此同時再採用高學習率。

殘差學習

由於輸入圖像和輸出圖像有着高度的相似性(高分率圖像可以看出是低分辨率圖像+高分率圖像的信息)。所以我們可以改用學習輸出與輸入的殘差(即高分辨率的特徵)取代直接學習全部(高分辨率的特徵+低分辨率的特徵)。輸入圖像是x,f(x)是經過學習得到的殘差,r=y-x是實際的殘差。那麼損失函數爲,當損失函數夠小時,f(x)+x就能逼近y了。殘差學習能提高收斂速度,因爲只需學習高分辨率的特徵。從上面網絡結構圖中的特徵圖上可以看到,很多是空的,殘差學習只學習了高分辨率的特徵。下圖爲用殘差學習和不用殘差學習的算法比較。可以看到殘差學習(藍色的線)的學習速度非常的快(Epochs很小的時候就收斂了)

上圖中爲VDSR的論文原圖,作者用VDSR(使用殘差學習)和另外一個不用殘差學習的網絡比較。但這可能並非嚴格的控制變量法,論文的描述爲“Performance curve for residual and non-residual networks.”VDSR除了使用殘差學習,還用了多層網絡、自適應梯度剪切、高學習率等技巧。如果拿VDSR和SRCNN比較,並不能說明殘差學習的優越。

自適應梯度剪切

由於鏈式法則的計算,當網絡的層數非常多時,經常出現梯度消失或者梯度爆炸的現象。體現在圖像,就是損失函數有一個懸崖式的變化。如果設置的學習率太大,那麼可能出現修改過度,甚至丟失已經優化好的數據。而自適應梯度剪切就是根據你的學習率,調整梯度的角度,確保收斂的穩定性。

高學習率

提高收斂速度的最直接方式就是增大學習率,但單純的增大高學習率會產生收斂問題(收斂不穩定),雖然作者已經用了自適應梯度剪切的方法來增大收斂穩定性。但作者在設置學習率時,也能使用一下技巧來增強收斂穩定性。具體的做法是,一開始設置一個很大的學習率(CDSR簡單地令每層的學習率相同),每過20個epochs,將學習率縮小十倍。這麼做的原理也很直觀,一開始訓練時網絡損失函數還較大,能夠大膽地用高學習率來縮短收斂時間,隨着訓練次數得增多,模型趨向收斂,如果繼續用高學習率,就會破壞收斂穩定性,所以改用小學習率,確保網絡收斂。這麼多次縮小學習率,進一步縮小了收斂時間。

3.對於採用非常深的網絡來預測輸出,會導致每一次進行卷積運算,feature map的大小都會減少,這樣甚至會造成高清新圖像的尺寸會比低分辨圖像的尺寸小。這與其他超分辨率方法是一致的,因爲許多方法需要周圍的像素來正確地推斷中心像素。這個中心環繞關係是有用的,因爲周圍區域爲這個超分辨率這個病態問題提供了更多的約束。對於圖像邊界附近的像素影響最大,因爲邊界像素與周邊像素的關係最強,隨着尺度變小,周邊像素的影響力減小,對邊界像素的學習不是好事。許多SR方法對結果圖像進行裁剪。然而,如果所需的環繞區域非常大,這種方法就無效了。裁剪後,最終的圖像太小,無法達到視覺效果。爲了解決這個問題,VDSR在每次卷積前都對圖像進行補0操作,這樣保證了所有的特徵圖和最終的輸出圖像在尺寸上都保持一致,解決了圖像通過逐步卷積會越來越小的問題,又突出了邊界像素的特徵。文中說實驗證明補0操作對邊界像素的預測結果也能夠得到提升。

4.多尺度學習。VDSR將不同尺度的圖像混合在一起訓練,這樣訓練出來的一個模型就可以解決不同倍數的超分辨率問題(同一個模型學習多個尺度的放大)。那麼就不存在SRCNN中網絡只適用於單一規模的問題了。

可以根據實驗結果得出幾點結論。

  1. 對於低倍數圖像,用多尺度訓練的網絡幾乎和用單尺度訓練的網絡一樣
  2. 對於高倍數圖像,採用多尺度訓練的效果比採用單尺度訓練的網絡的效果好

原因是高倍數放大和低倍數放大有相似之處,它們間可以互相學習,尤其是高倍數的放大,能從低倍數放大的學習中額外獲得新的信息,從而導致對於高倍數圖像,採用多尺度訓練的網絡比採用單尺度訓練的網絡好。

 

VDSR之後,幾乎所有的網絡都借鑑了其學習殘差的思想,原因在下圖的效果圖裏就可以看出來

結果對比如下圖所示:

DRCN(Deeply-Recursive Convolutional Network)

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

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

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

DRCN與上面的VDSR都是來自首爾國立大學計算機視覺實驗室的工作,兩篇論文都發表在CVPR2016上,兩種方法的結果非常接近。其貢獻主要如下:

1、將RNN(遞歸神經網絡,Recursive Neural Network)的結構應用於SR中。RNN用於非線性映射時,通過RNN,數據循環多次地通過該層,而將這個RNN展開的話,就等效於使用同一組參數的多個串聯的卷積層;

2、利用了ResNet的思想,加入了skip-connection,加深了網絡結構(16個遞歸),增加了網絡感受野,提升了性能。DRCN網絡結構如下圖所示:

DRCN輸入的是插值後的圖像,分爲三個模塊,第一個是Embedding network,相當於特徵提取,第二個是Inference network, 相當於特徵的非線性映射,第三個是Reconstruction network,即從特徵圖像恢復最後的重建結果。其中的Inference network是一個遞歸網絡,即數據循環地通過該層多次。將這個循環進行展開,等效於使用同一組參數的多個串聯的卷積層,如下圖所示。

其中的    是D個共享參數的卷積層。將這D個卷積層的每一層的結果都通過相同的Reconstruction Net,在Reconstruction Net中與輸入的圖像相加,得到D個輸出重建結果。這些所有的結果在訓練時都同時被監督,即所有的遞歸都被監督,作者稱之爲遞歸監督(Recursive-Supervision),避免了梯度消失/爆炸問題。將D個遞歸得到的結果再加權平均:,得到一個總輸出。每個加權在訓練的過程中也不斷地更新。最終的目標函數就需要優化每一個遞歸層輸出的誤差和總輸出的誤差:

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

結果對比如下所示:

RED(very deep Residual Encoder-Decoder Networks)

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

這篇論文提出了一個由對稱的卷積層——反捲積層構成的網絡結構,如下圖所示(可以看作爲ResNet+VDSR):

卷積層——反捲積層結構有點類似與編碼——解碼結構。其網絡結構是對稱的,每個卷積層都對應有反捲積層,卷積層將輸入圖像尺寸減小後,再通過反捲積層上採樣變大,使得輸入輸出的尺寸一樣。卷積層用於提取圖像的特徵,相當於編碼的作用。而反捲積層用於放大特徵的尺寸並恢復圖像細節。而每一組鏡像對應的卷積和反捲積有skip connection將兩部分具有同樣尺寸的特徵(要輸入卷積層的特徵和對應的反捲積層輸出的特徵)做相加操作(ResNet那樣的操作)後再輸入到下一個反捲積層。這樣的結構能夠讓反向傳播信號能夠直接傳遞到底層,解決了梯度消失問題,同時能將卷積層的細節傳遞給反捲積層,能夠恢復出更乾淨的圖片。與此同時,網絡中有一條線是將輸入的圖像連接到後面與最後的一層反捲積層的輸出相加,也就是VDSR中用到的方式,因此RED中間的卷積層和反捲積層學習的特徵是目標圖像和低質圖像之間的殘差。(個人理解如下圖所示)

結果如下圖所示:

DRRN(Deep Recursive Residual Network)

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

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

可以看作:ResNet+VDSR+DRCN

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

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

結果對比如下圖所示:

LapSRN(Laplacian PyramidSuper-Resolution Network)

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

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

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

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

作者總結了之前的基於深度學習的SR方法,主要有以下三個缺點:

1、關於上採樣的問題。

  • 基於預處理的上採樣。使用預先定義好的上採樣操作(如bicubic操作)來獲得目標的空間尺寸,這樣做增加了額外的計算開銷,且會導致重建僞影;
  • 基於亞像素卷積層(ESPCN)或反捲積層(FSRCNN)。這些方法的網絡結構又相對比較簡單,性能較差,並不能學好低分辨率圖像到高分辨率圖像複雜的映射;

2、在訓練網絡時使用 l_{2} 型損失函數時,不可避免地會產生模糊的預測,恢復出的高分辨率圖片往往會太過於平滑;

3、在重建高分辨率圖像時,如果只用一次上採樣的操作,在獲得大倍數(8倍以上)的上採樣因子時就會比較困難。而且在不同的應用時,需要訓練不同上採樣倍數的模型。

因此作者提出了Lap SRN網絡結構,其結構如下圖所示

LapSRN可以看成由多級組成的分級網絡,每一級完成一次2倍的上採樣(若要實現8倍,就要3級)。在每一級中,先通過一些級聯的卷積層提取特徵,接着通過一個反捲積層將提取出的特徵的尺寸上採樣2倍。反捲積層後連有兩個卷積層,一個卷積層的作用是繼續提取特徵,另外一個卷積層的作用是預測出這一級的殘差。輸入圖像在每一級也經過一個反捲積層使尺寸上採樣2倍,再與對應級的殘差相加,就能重構出這一級的上採樣結果。(個人理解的圖示如下)

結果對比如下圖所示:

 

SRDenseNet

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

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

Dense Block是通過將許多個卷積網絡分成3~4個部分,這些部分叫做dense block(有點類似於殘差網絡中的殘差塊)。在每個block中,都執行密集鏈接,block的輸出再通過池化降低特徵圖尺寸。如下圖所示:

SRDenseNet將稠密塊結構應用到了超分辨率問題上(在dense block上再加上skip connection),其結構可以分爲四個部分:

step 1:用一個卷積層學習低層的特徵;

step 2:用多個稠密塊學習高層的特徵;

step 3:通過幾個反捲積層進行上採樣;

step 4:最後再通過一個卷積層生成高分辨率輸出;

網絡結構如下圖所示

結果對比如下圖所示

 

SRGAN(SRResNet,super-resolution generative adversarial network)

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

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

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

github(torch): https://github.com/junhocho/SRGANhttps:/AN

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

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

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

github(pytorch): https://github.com/ai-tor/PyTorch-SRGAN

將生成對抗網絡(Generative Adversarial Network, GAN)用在了超分辨率問題上。其出發點是傳統的方法一般處理的是較小的放大倍數,當圖像的放大倍數在4以上時,很容易使得到的結果顯得過於平滑,而缺少一些細節上的真實感。因此SRGAN使用GAN來生成圖像中的細節。

關於GAN的理解如下圖所示:

傳統的方法使用的代價函數一般是最小均方差(MSE),即:

該代價函數使重建結果有較高的峯值信噪比,但是恢復出來的圖像通常會丟失高頻細節,出現過度平滑的紋理,使人不能有好的視覺感受。SRGAN的理念是:應當使重建的高分辨率圖像與真實的高分辨率圖像無論是低層次的像素值上,還是高層次的抽象特徵上,和整體概念和風格上,都應當接近。MSE和GAN方法的區別如下圖

SRGAN利用感知損失(perceptual loss)和對抗損失(adversarial loss)來提升恢復出的圖片的真實感。感知損失是利用卷積神經網絡提取出的特徵,通過比較生成圖片經過卷積神經網絡後的特徵和目標圖片經過卷積神經網絡後的特徵的差別,使生成圖片和目標圖片在語義和風格上更相似。簡單來說,一個GAN所要完成的工作就是:G網通過低分辨率的圖像生成高分辨率圖像,由D網判斷拿到的圖像是由G網生成的,還是數據庫中的原圖像。當G網能成功騙過D網的時候,那我們就可以通過這個GAN完成超分辨率了。SRGAN網絡結構如下圖(SRGAN還是用SRRESNET來進行超分工作 但增加了一個對抗網絡來判斷生成的圖片是原圖還是超分出來的圖):

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

SRGAN的損失函數爲:

第一部分是基於內容的代價函數(content loss),第二部分是基於對抗學習的代價函數(adversarial loss)。

content loss可以是基於均方誤差的損失的損失函數:

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

i和j表示VGG19網絡中第i個最大池化層(maxpooling)後的第j個卷積層得到的特徵。然後,又對內容損失分別設置成基於均方誤差、基於VGG模型低層特徵和基於VGG模型高層特徵三種情況作了比較,研究表明在基於均方誤差的時候表現最差,基於VGG模型高層特徵比基於VGG模型低層特徵的內容損失能生成更好的紋理細節。

adversarial loss爲:

結果對比如下

 

EDSR(enhanced deep super-resolution network)

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

github(torch): https://github.com/LimBee/NTIRE2017https://2017

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

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

EDSR,單幅圖像超分辨率增強深度殘差網絡。EDSR最有意義的模型性能提升是去除掉了SRResNet的批量標準化(batch normalization, BN)層。由於批量標準化層對特徵進行了規範化,因此通過規範化特徵可以擺脫網絡的範圍可變性,最好將其刪除

,從而可以擴大模型的尺寸來提升結果質量。相當於SRResNet的改進,EDSR與原始 ResNet 和SRResnet的對比圖如下

此外,由於BN層消耗的內存量與前面的卷積層相同,因此去掉BN層後,EDSR的GPU內存使用量也會減少。與SRResNet相比,基準模型沒有批量標準化層,在培訓期間可節省大約40%的內存使用量。因此,可以在有限的計算資源下構建一個比傳統ResNet結構具有更好性能的更大模型。

提高網絡模型性能的最簡單方法是增加參數數量。在卷積神經網絡中,可以通過堆疊多個層或通過增加濾波器的數量來增強模型性能。一般的CNN架構的深度(層數)B和寬度(特徵Channels的數量)F約佔內存與參數。因此,當考慮有限的複合資源時,增加F而不是B可以最大化模型容量。

但是,將特徵圖的數量增加到一定水平以上會使訓練過程在數值上不穩定。這裏通過採用因子0.1的殘差縮放來解決這個問題。在每個殘餘塊中,在最後的卷積層之後放置恆定的縮放層。當使用大量濾波器時,這些模塊極大地穩定了訓練過程。在測試階段,該層可以集成到之前的卷積層中,以提高計算效率。使用上面三種網絡對比圖中提出的殘差塊(即結構類似於SRResNet,但模型在殘差塊之外沒有ReLU激活層)構建單尺度模型。此外,因爲每個卷積層僅使用64個特徵圖,所以單尺度模型沒有殘餘縮放層。在最終單尺度模型EDSR中,通過設置B=32,F=256並使用比例因子0.1來擴展單尺度模型。模型架構如下圖所示:

在訓練上採樣因子×3和×4的模型時,用預訓練的×2網絡初始化模型參數,這種預訓練策略加速了訓練並提高了最終性能,如下圖所示。紅線表示綠線的最佳性能。對於向上擴展×4,如果使用預先訓練的尺度×2模型(藍線),則訓練收斂速度遠遠快於從隨機初始化(綠線)開始的訓練。(啓發:可先用低放大倍數來做預訓練,最終再採用高放大倍數來做最終訓練

從上圖中的觀察,作者得出結論,多尺度的超分辨率是相互關聯的任務。於是通過構建一個多尺度架構來進一步探索這個想法,該架構利用了VDSR的尺度間相關性。將多尺度基線模型設計爲具有B=16個殘差塊的單個主分支,以便大多數參數在不同尺度上共享,簡單來說,MDSR(multiscale architecture SR)的中間部分還是和EDSR一樣,只是在網絡前面添加了不同的預訓練好的模型來減少不同倍數的輸入圖片的差異。在網絡最後,不同倍數上採樣的結構平行排列來獲得不同倍數的輸出結果。如下圖所示

在多尺度架構中,通過引入特定規模的處理模塊來處理多尺度的超分辨率。首先,預處理模塊位於網絡的前面,以減少不同尺度的輸入圖像的差異。每個預處理模塊由兩個具有5×5內核的殘差塊組成。通過採用更大的內核作爲預處理模塊,可以使不同尺度部分保持淺薄,而而較大的感受野被覆蓋在網絡的早期階段。在多尺度基線模型的最後,進行特定尺度的上採樣模塊並行定位,以處理多尺度重建。上採樣模塊的體系結構類似於EDSR中描述的單尺度基線模型的體系結構。

基於這些要素,構建了最終的多尺度模型MDSR,其中B=80和F=64。雖然這裏針對3種不同尺度的單尺度基線模型分開了看各有約150萬個參數,簡單相加總計爲450萬個,但最後的多尺度基線模型只有320萬個參數,然而多尺度基線模型可以表現出與單尺度基線模型相當的性能。此外,多尺度模型在深度方面還具有可擴展性。儘管最終的MDSR的深度大約是多尺度基線模型的5倍,但其實只需要2.5倍的參數,因爲殘餘塊比特定尺度的部件的參數數量更少。MDSR顯示出與比例特定的EDSR相當的性能。

下圖是不同尺度不同模型訓練得到的(PSNR(dB) / SSIM)值對比,紅色代表最佳表現,藍色代表次之(baseline即基線模型):

結果對比如下圖所示:

 

參考材料

https://blog.csdn.net/prinstinadl/article/details/80825638

https://mp.weixin.qq.com/s?__biz=MzU3MDMyNzc1Mg==&mid=2247485054&idx=1&sn=83f2b5589149428d1968631a7f2a3430&chksm=fcf051d9cb87d8cf145c8e6990862726007c02b6b764b959d315d47cbfd3240e980bf5f3dfe8&mpshare=1&scene=24&srcid=1011h21ziMx5baUPsmVBplTC#rd

https://mp.weixin.qq.com/s?__biz=MzI5MDUyMDIxNA==&mid=2247484150&idx=1&sn=b165feed640c9df9f4487eac85ff5a85&chksm=ec1fef0fdb6866197253c1311a048bfe20bc9d57958977eca099c91d6e9d259dcb89ca7de5d6&mpshare=1&scene=1&srcid=1011ahCRVF94OJohJLAAUh4d#rd

https://blog.csdn.net/zjyruobing/article/details/49908979(PSNR和SSIM)

https://mp.weixin.qq.com/s?__biz=MzAwNDI4ODcxNA==&mid=2652249131&idx=3&sn=d44ded4e2b1e080e607daec028506576&chksm=80cc858eb7bb0c984d42612bb476b10e7485c146f7ef0351baf3789dbb7c321080eacaff3cf9&mpshare=1&scene=24&srcid=1011KJe0Nh62sOt3FV84WwCw#rd

https://mp.weixin.qq.com/s?__biz=MzIwMTc4ODE0Mw==&mid=2247491802&idx=1&sn=35fb3c579a05ebb5cffa67dd1e650b15&chksm=96ea3f5aa19db64cb0eb0ec3a4d2045a0c85b11454283066e9d323813988dc59e7692d076e6c&mpshare=1&scene=24&srcid=1011Xt9HxeNm43MrRSQ6aXrT#rd(SRCNN的復現)

https://blog.csdn.net/Autism_/article/details/79401798(SRCNN)

https://blog.csdn.net/Cyiano/article/details/78368263?locationNum=4&fps=1(VESPCN)

https://blog.csdn.net/itleaks/article/details/80336825(反捲積)

 

 

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