1. 程式人生 > >學習筆記之——基於深度學習的影象超解析度重構

學習筆記之——基於深度學習的影象超解析度重構

       最近開展影象超解析度( 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個遞迴得到的結果再加權平均:,得到一個總輸出。每個加權在訓練的過程中也不斷地更新。最終的目標函式就需要優化每一個遞迴層輸出的誤差和總輸出的誤差:

相關推薦

學習筆記——基於深度學習影象解析度重構

       最近開展影象超解析度( Image Super Resolution)方面的研究,做了一些列的調研,並結合本人的理解總結成本博文~(本博文僅用於本人的學習筆記,不做商業用途) 本博文涉及的paper已經打包,供各位看客下載哈~h

學習筆記——基於深度學習的分類網路

       之前博文介紹了基於深度學習的常用的檢測網路《學習筆記之——基於深度學習的目標檢測演算法》,本博文為常用的CNN分類卷積網路介紹,本博文的主要內容來自於R&C團隊的成員的調研報告以及本人的理解~如有不當之處,還請各位看客賜教哈~好,下面

學習筆記——基於深度學習的目標檢測演算法

        國慶假期閒來無事~又正好打算入門基於深度學習的視覺檢測領域,就利用這個時間來寫一份學習的博文~本博文主要是本人的學習筆記與調研報告(不涉及商業用途),博文的部分來自我團隊的幾位成員的調研報告(由於隱私關係,不公告他們的名字了哈~),同時結合

學習筆記——基於pytorch的卷積神經網路

本博文為本人的學習筆記。參考材料為《深度學習入門之——PyTorch》 pytorch中文網:https://www.pytorchtutorial.com/  關於反捲積:https://github.com/vdumoulin/conv_arithmetic/blob/ma

Laravel學習筆記基於PHPStorm編輯器的Laravel開發

引言 本文主要講述在PHPStorm編輯器中如何使用PHPStorm的Laravel外掛和Laravel IDE Helper來開發Laravel程式,結合個人積累的一點經驗來說明使用PHPStorm編輯器來開發程式還是很順手的,內容主要基於PHPStorm官方文件Laravel Developm

學習筆記——SRGAN深度調研報告

SRGAN這個網路的最大貢獻就是使用了生成對抗網路(Generative adversarial network)來訓練SRResNet,使其產生的HR影象看起來更加自然,有更好的視覺效果(SRResNet是生成網路,對抗網路是用來區分真實的HR影象和通過SRResNet還原出來的HR影象,SR

學習筆記——基於pytorch的殘差網路(deep residual network)

本博文為本人學習pytorch系列之——residual network。 前面的博文( 學習筆記之——基於深度學習的分類網路)也已經介紹過ResNet了。ResNet是2015年的ImageNet競賽的冠軍,由微軟研究院提出,通過引入residual block能夠成功地訓練高達

學習筆記——基於pytorch的SFTGAN(xintao程式碼學習,及資料處理部分的學習

程式碼的框架仍然是——《https://github.com/xinntao/BasicSR》 給出SFTGAN的論文《Recovering Realistic Texture in Image Super-resolution by Deep Spatial Feature Transfo

Deep Learning回顧基於深度學習的目標檢測

轉自:https://www.52ml.net/20287.html 引言 普通的深度學習監督演算法主要是用來做分類,如圖1(1)所示,分類的目標是要識別出圖中所示是一隻貓。而在ILSVRC(ImageNet Large Scale Visual Recognitio

OpenCV學習筆記針對二值影象的邊緣光滑處理(突出部消除)

處理程式碼分為兩部分,第一部分用於去除邊緣的突出部,第二部分用於邊緣光滑。具體如下所示 1.去除邊緣突出部 //去除二值影象邊緣的突出部 //uthreshold、vthreshold分別表示突出部的寬度閾值和高度閾值 //type代表突出部的顏色,0表示黑色,1代表白色

學習筆記——基於pytorch的FSRCNN

本博文為本人學習基於pytorch的FSRCNN的學習筆記,僅供本人學習記錄用 先採用data_aug.m來增廣資料 再採用generate_train.m將資料生成.h5文件。 至於測試集,此處只採用set5中的五張圖片,所以先不用generate_tes

opencv學習筆記對灰度影象遍歷的三種方法

灰度影象遍歷的三種方法 通過指標訪問 通過迭代器訪問 動態地址計算,通過at()函式實現、實現程式碼: #include<opencv2/opencv.hpp> #include<

Spring原始碼學習筆記基於ClassPathXmlApplicationContext進行bean標籤解析

 bean 標籤在spring的配置檔案中, 是非常重要的一個標籤, 即便現在boot專案比較流行, 但是還是有必要理解bean標籤的解析流程,有助於我們進行  基於註解配置, 也知道各個標籤的作用,以及是怎樣被spring識別的, 以及配置的時候需要注意的點. 傳統的spring專案,s

IP地址和子網劃分學習筆記《知識學習篇:子網劃分詳解》

子網掩碼 IP地址 子網劃分 在學習掌握了前面的IP地址和子網劃分之《進制計數》和IP地址和子網劃分之《IP地址詳解》這兩部分知識後,接下來將學習子網劃分。 一、子網掩碼 要學習子網劃分,首先就要必須知道子網掩碼,只有掌握了子網掩碼這部分內容,才能很好的理解和劃分子網。 1、子網掩碼介紹 子網掩碼

機器學習筆記十——整合學習Bagging

上一節學習了決策樹:https://blog.csdn.net/qq_35946969/article/details/85039097 最後說到提升決策樹的效能,整合就是非常強大的解決方案。 藉助一個圖,直觀的瞭解整合學習:   Bagging   &nbs

學習筆記:《深度學習框架PyTorch入門與實踐》(陳雲)Part1

       學習筆記:《深度學習框架PyTorch入門與實踐》(陳雲)Part1     2017年1月,FAIR團隊在GitHub上開源了PyTorch。     常見的深度學習框架:  

吳恩達機器學習 學習筆記 一 監督學習和無監督學習

一、  1-1 welcome 1-2 什麼是機器學習——Machine Learning 機器學習尚無明確定義,現有的定義有: (1)Field of study that gives computers the ability to learn about being

學習筆記1:深度學習環境搭建win+python+tensorflow1.5+CUDA9.0+cuDNN7.0

        2018年2月13買了一臺Dell Inspiron7577,i7-7700hq、1050Ti顯示卡、win10家庭版。由於課題需要開始學習深度學習,之前在實驗室和自己的筆記本上安裝TensorFlow總是不成功,不然就是僅實現cpu運算。本次安裝主要是按照這

基於字典的影象解析度實現

簡介   這段時間在看基於字典的單幀影象超解析度重建,本篇主要是對這塊做個筆記記錄。 基本原理 預處理 1、準備好用於字典訓練的低解析度影象LR及與之對應的高解析度圖片HR。 2、將低解析度影象雙線性或者三次方插值到高解析度影象相同大小,得到MR

基於SRGAN實現影象解析度重建或復原

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