【超分辨率實驗】Matlab-使用深度學習的單圖像超分辨率(Single Image Super-Resolution Using Deep Learning)
此示例演示如何訓練非常深的超分辨率 VDSR神經網絡,并提供預先訓練的VDSR網絡,使用VDSR網絡從單個低分辨率圖像估計高分辨率圖像。原文鏈接: Single Image Super-Resolution Using Deep Learning
1 介紹
超分辨率是使用低分辨率圖像創建高分辨率圖像的過程,本示例考慮單個圖像超高分辨率 (SISR),其目標是從一個低分辨率圖像中恢復一個高分辨率圖像。但是,SISR 是一個不適定問題(ill-posed problem),因為一個低分辨率圖像可以生成幾個可能的高分辨率圖像。
本示例探索 SISR 的一種深度學習算法,稱為Very Deep Super-Resolution (VDSR)。
2 VDSR 網絡
VDSR 是一種用于執行單圖像超分辨率的卷積神經網絡架構,VDSR 網絡可以學習低分辨率和高分辨率圖像之間的映射,之所以有可能進行這種映射,是因為低分辨率和高分辨率圖像具有相似的圖像內容,并且主要在高頻細節上有所不同。
VDSR 采用殘差學習策略,該策略能夠估計殘差圖像。在超分辨率的上下文中,殘差圖像是高分辨率參考圖像與匹配參考圖像大小的低分辨率圖像之間的差別,其中,匹配大小的過程使用雙立方插值的方法進行操作。
VDSR 網絡從彩色圖像的亮度提取殘差圖像,圖像的亮度通道通過紅色、綠色和藍色像素值的線性組合表示每個像素的亮度。相比之下,圖像的兩個色度通道(Cb和Cr)是代表顏色差異信息的紅色、綠色和藍色像素值的不同線性組合。VDSR 僅使用亮度通道進行訓練,因為人類感知對亮度變化比對顏色變化更敏感。
如果Y<高殘差>是高分辨率圖像的亮度,Y<低殘差>是使用雙立方插值升級的低分辨率圖像,然后 VDSR 網絡的輸入為Y<低殘差>和網絡從訓練數據學會預測Y<殘余>?=?Y<高殘差> - Y<低殘差>
在 VDSR 網絡學習估計殘差圖像后,可以通過將估計的殘差圖像添加到上采樣的低分辨率圖像,然后將圖像轉換回 RGB 顏色空間來重建高分辨率圖像。
比例因子將參考圖像的大小與低分辨率圖像的大小關聯。隨著比例因子的增加,SISR 的重建效果變差,因為低分辨率圖像會丟失有關高頻圖像內容的更多信息,VDSR 使用大感受野解決此問題,本示例使用比例擴增訓練具有多個比例因子的 VDSR 網絡,縮放擴充可提高較大比例因子的結果,因為網絡可以從較小的比例因子中利用圖像上下文。
3 實驗準備階段
3.1 下載訓練和測試數據
下載 IAPR TC-12 基準,它包括 20,000 張靜止自然圖像 [2],數據集包括人、動物、城市等的照片,數據文件的大小為 ±1.8 GB。如果不想下載訓練數據集,可以通過在命令行鍵入來加載預先訓練的 VDSR 網絡。然后,直接轉到本示例中的 VDSR 網絡執行單圖像超分辨率部分。 命令行鍵入的語句為:load('trainedVDSR-Epoch-100-ScaleFactors-234.mat')
使用幫助程序函數downloadIAPRTC12Data()下載數據。
imagesDir
= tempdir
;
url
= 'http://www-i6.informatik.rwth-aachen.de/imageclef/resources/iaprtc12.tgz' ;
downloadIAPRTC12Data ( url
, imagesDir
) ;
本示例將使用 IAPR TC-12 基準數據的一小部分來訓練網絡。
trainImagesDir
= fullfile ( imagesDir
, 'iaprtc12' , 'images' , '02' ) ;
exts
= { '.jpg' , '.bmp' , '.png' } ;
pristineImages
= imageDatastore ( trainImagesDir
, 'FileExtensions' , exts
) ;
列出訓練圖像的數量。
numel ( pristineImages
. Files
)
3.2 準備訓練數據
要創建訓練數據集,先要生成由上采樣圖像和相應的剩余圖像組成的圖像對。upsampledDirName表示上采樣的圖像、residualDirName表示網絡響應的計算殘差圖像作為 MAT 文件存儲在磁盤上。
upsampledDirName
= [ trainImagesDir filesep
'upsampledImages' ] ;
residualDirName
= [ trainImagesDir filesep
'residualImages' ] ;
使用幫助器函數createVDSRTrainingSet預處理訓練數據,幫助器函數對中的每個原始圖像執行這些操作:
將圖像轉換為 YCbCr 顏色空間 按不同比例因子縮小亮度 (Y) 通道以創建示例低分辨率圖像,然后使用雙立方插值將圖像調整為原始大小 計算原始圖像和調整大小的圖像之間的差值。 將調整大小和剩余映像保存到磁盤。
scaleFactors
= [ 2 3 4 ] ;
createVDSRTrainingSet ( pristineImages
, scaleFactors
, upsampledDirName
, residualDirName
) ;
3.3 為訓練集定義預處理管道(pipeline)
網絡輸入是使用雙立方插值進行上采樣的低分辨率圖像,所需的網絡響應是殘差圖像。upsampledImages創建從輸入圖像文件集合調用的圖像數據存儲;residualImagesmat創建從計算的剩余圖像文件集合調用的圖像數據存儲。兩個數據存儲都需要一個幫助器函數Read ,才能從圖像文件中讀取圖像數據。
upsampledImages
= imageDatastore ( upsampledDirName
, 'FileExtensions' , '.mat' , 'ReadFcn' , @matRead
) ;
residualImages
= imageDatastore ( residualDirName
, 'FileExtensions' , '.mat' , 'ReadFcn' , @matRead
) ;
創建一個用于指定數據擴充參數的imageDataAugmenter(深度學習工具箱)。在訓練期間使用數據擴充來更改訓練數據,從而有效地增加可用的訓練數據量。在這里,增強器指定隨機旋轉90 度和 x 方向的隨機反射。
augmenter
= imageDataAugmenter ( . . . 'RandRotation' , @
( ) randi ( [ 0 , 1 ] , 1 ) * 90 , . . . 'RandXReflection' , true
) ;
創建一個隨機的PatchExtraction數據存儲,從上采樣和剩余圖像數據存儲中執行隨機補丁提取。修補程序提取是從單個較大圖像中提取大量小圖像修補程序或切片的過程。這種類型的數據增強常用于圖像到圖像回歸問題,其中許多網絡體系結構可以基于非常小的輸入圖像大小進行訓練。這意味著可以從原始訓練集的每個全尺寸映像中提取大量補丁,從而大大增加訓練集的大小。
patchSize
= [ 41 41 ] ;
patchesPerImage
= 64 ;
dsTrain
= randomPatchExtractionDatastore ( upsampledImages
, residualImages
, patchSize
, . . . "DataAugmentation" , augmenter
, "PatchesPerImage" , patchesPerImage
) ;
生成的數據存儲在epoch的每個迭代中向網絡提供小批量數據。disp()預覽從數據存儲的讀取結果。
inputBatch
= preview ( dsTrain
) ;
disp ( inputBatch
)
4 設置網絡訓練數據
4.1 設置 VDSR 圖層
此示例使用深度學習工具箱中的 41 個獨立圖層定義 VDSR 網絡,包括:
圖像輸入層(深度學習工具箱) - 圖像輸入層 卷積 2dLayer (深度學習工具箱) - 卷積神經網絡的二維卷積層 reluLayer(深度學習工具箱) - 已糾正的線性單元 (ReLU) 層 回歸層(深度學習工具箱) - 神經網絡的回歸輸出層
第一層 在圖像補丁上操作。修補程序大小基于網絡接受字段,即影響網絡中最頂層響應的空間圖像區域。理想情況下,網絡接受域與圖像大小相同,以便該字段可以看到圖像中的所有高級要素。在這種情況下,對于具有D卷積層的網絡,imageInputLayer接受域是 (2D+1)
VDSR 有 20 個卷積層,因此接收字段和圖像補丁大小為 41x41。圖像輸入層接受具有一個通道的圖像,因為 VDSR 僅使用亮度通道進行訓練。
networkDepth
= 20 ;
firstLayer
= imageInputLayer ( [ 41 41 1 ] , 'Name' , 'InputLayer' , 'Normalization' , 'none' ) ;
圖像輸入層后跟一個二維卷積層,其中包含 64 個大小為 3 比 3的濾波器。小批處理大小確定篩選器數。padding每個卷積層的輸入,使要素在每次卷積后保持與輸入相同的大小,將權重初始化為隨機值,以便神經元學習中存在不對稱,每個卷積層后跟一個ReLU 層,在網絡中引入非線性。
convLayer
= convolution2dLayer ( 3 , 64 , 'Padding' , 1 , . . . 'WeightsInitializer' , 'he' , 'BiasInitializer' , 'zeros' , 'Name' , 'Conv1' ) ;
指定 ReLU 圖層。
relLayer
= reluLayer ( 'Name' , 'ReLU1' ) ;
中間層包含 18 個交替卷積和整流線性單位層。每個卷積層包含 64 個大小為 3 比 3 到 64 的濾波器,其中濾波器在 64 個通道的 3-3 空間區域上工作,每個卷積層后跟一個ReLU 層。
middleLayers
= [ convLayer relLayer
] ;
for layerNumber
= 2 : networkDepth
- 1 convLayer
= convolution2dLayer ( 3 , 64 , 'Padding' , [ 1 1 ] , . . . 'WeightsInitializer' , 'he' , 'BiasInitializer' , 'zeros' , . . . 'Name' , [ 'Conv' num2str ( layerNumber
) ] ) ; relLayer
= reluLayer ( 'Name' , [ 'ReLU' num2str ( layerNumber
) ] ) ; middleLayers
= [ middleLayers convLayer relLayer
] ;
end
倒數第二層是一個卷積層,其大小為 3 比 3 到 64 的單個濾鏡可重建圖像。
convLayer
= convolution2dLayer ( 3 , 1 , 'Padding' , [ 1 1 ] , . . . 'WeightsInitializer' , 'he' , 'BiasInitializer' , 'zeros' , . . . 'NumChannels' , 64 , 'Name' , [ 'Conv' num2str ( networkDepth
) ] ) ;
最后一層是回歸層而不是 ReLU 圖層。回歸層計算殘差圖像和網絡預測之間的均方誤差。
finalLayers
= [ convLayer
regressionLayer ( 'Name' , 'FinalRegressionLayer' ) ] ;
連接所有圖層以形成 VDSR 網絡。
layers
= [ firstLayer middleLayers finalLayers
] ;
或者,可以使用幫助器函數vdsrLayers創建 VDSR 圖層。
layers
= vdsrLayers
;
4.2 指定訓練選項
使用隨機梯度下降與動量 (SGDM) 優化訓練網絡。使用訓練選項(深度學習工具箱)功能指定SGDM的超參數設置。學習率初值為0.1,每 10 個epoch降低 10 倍,訓練100個epoch。
maxEpochs
= 100 ;
epochIntervals
= 1 ;
initLearningRate
= 0.1 ;
learningRateFactor
= 0.1 ;
l2reg
= 0.0001 ;
miniBatchSize
= 64 ;
培訓深度網絡非常耗時,通過指定高學習率可以加速培訓,但是,這可能會導致網絡梯度爆炸或無法控制地增長,從而阻止網絡成功訓練。若要將漸變保持在有意義的范圍內,指定為啟用漸變剪裁GradientThreshold和GradientThresholdMethod,并指定使用漸變的 L2 規范。
options
= trainingOptions ( 'sgdm' , . . . 'Momentum' , 0.9 , . . . 'InitialLearnRate' , initLearningRate
, . . . 'LearnRateSchedule' , 'piecewise' , . . . 'LearnRateDropPeriod' , 10 , . . . 'LearnRateDropFactor' , learningRateFactor
, . . . 'L2Regularization' , l2reg
, . . . 'MaxEpochs' , maxEpochs
, . . . 'MiniBatchSize' , miniBatchSize
, . . . 'GradientThresholdMethod' , 'l2norm' , . . . 'GradientThreshold' , 0.01 , . . . 'Plots' , 'training-progress' , . . . 'Verbose' , false
) ;
4.3 訓練網絡
配置訓練選項和隨機修補程序提取數據存儲后,使用訓練網絡doTraining功能對 VDSR 網絡進行訓練。 若要訓練網絡,需將以下代碼中的參數設置為true 。如果將參數保留為false,則示例返回經過預先訓練的 VDSR 網絡,該網絡已經過訓練,可對比例因子 2、3 和 4 的超分辨率圖像進行訓練。
doTraining
= false
;
if doTrainingmodelDateTime
= datestr ( now
, 'dd-mmm-yyyy-HH-MM-SS' ) ; net
= trainNetwork ( dsTrain
, layers
, options
) ; save ( [ 'trainedVDSR-' modelDateTime
'-Epoch-' num2str ( maxEpochs
* epochIntervals
) '-ScaleFactors-' num2str ( 234 ) '.mat' ] , 'net' , 'options' ) ;
else load ( 'trainedVDSR-Epoch-100-ScaleFactors-234.mat' ) ;
end
5 使用 VDSR 網絡執行單圖像超分辨率
若要使用 VDSR 網絡執行單個圖像超分辨率 (SISR),按照此示例的其余步驟操作。本示例的其余部分演示如何:
從高分辨率參考圖像創建低分辨率樣本圖像。 使用雙立方插值對低分辨率圖像執行 SISR,這是一種不依賴深度學習的傳統圖像處理解決方案。 使用 VDSR 神經網絡對低分辨率圖像執行 SISR。 使用雙立方插值和 VDSR 直觀地比較重建的高分辨率圖像。 通過量化圖像與高分辨率參考圖像的相似性來評估超解析圖像的質量。
5.1 創建示例低分辨率圖像
創建低分辨率圖像,用于使用深度學習將超分辨率結果與使用雙立方插值等傳統圖像處理技術的結果進行比較。測試數據集包含 21 個未扭曲的圖像,這些圖像在圖像處理工具箱中將圖像加載到testImagesimageDatastore中。
exts
= { '.jpg' , '.png' } ;
fileNames
= { 'sherlock.jpg' , 'car2.jpg' , 'fabric.png' , 'greens.jpg' , 'hands1.jpg' , 'kobi.png' , . . . 'lighthouse.png' , 'micromarket.jpg' , 'office_4.jpg' , 'onion.png' , 'pears.png' , 'yellowlily.jpg' , . . . 'indiancorn.jpg' , 'flamingos.jpg' , 'sevilla.jpg' , 'llama.jpg' , 'parkavenue.jpg' , . . . 'peacock.jpg' , 'car1.jpg' , 'strawberries.jpg' , 'wagon.jpg' } ;
filePath
= [ fullfile ( matlabroot
, 'toolbox' , 'images' , 'imdata' ) filesep
] ;
filePathNames
= strcat ( filePath
, fileNames
) ;
testImages
= imageDatastore ( filePathNames
, 'FileExtensions' , exts
) ;
將測試圖像顯示為蒙太奇(montage)。
montage ( testImages
)
選擇要用作超分辨率參考圖像的圖像之一,您可以選擇使用自己的高分辨率圖像作為參考圖像。
indx
= 1 ; % Index of image to read from the test image datastore
Ireference
= readimage ( testImages
, indx
) ;
Ireference
= im2double ( Ireference
) ;
imshow ( Ireference
)
title ( 'High-Resolution Reference Image' )
使用縮放系數為 0.25 的imresize創建高分辨率參考圖像的低分辨率版本,圖像的高頻分量在向下縮放過程中丟失。
scaleFactor
= 0.25 ;
Ilowres
= imresize ( Ireference
, scaleFactor
, 'bicubic' ) ;
imshow ( Ilowres
)
title ( 'Low-Resolution Image' )
5.2 使用雙立方插值提高圖像分辨率
在沒有深度學習的情況下提高圖像分辨率的標準方法是使用雙立方插值。使用雙立方插值來升級低分辨率圖像,使生成的高分辨率圖像的大小與參考圖像的大小相同。
[ nrows
, ncols
, np
] = size ( Ireference
) ;
Ibicubic
= imresize ( Ilowres
, [ nrows ncols
] , 'bicubic' ) ;
imshow ( Ibicubic
)
title ( 'High-Resolution Image Obtained Using Bicubic Interpolation' )
5.3 使用預訓練的 VDSR 網絡提高圖像分辨率
回想一下,,因為人類感知對亮度變化比對顏色變化更敏感。
VDSR 僅使用圖像的亮度通道進行訓練,實驗中使用rgb2ycbcr函數將低分辨率圖像從 RGB 顏色空間轉換為亮度(Iy)和色度(Icb、Icr)通道。
Iycbcr
= rgb2ycbcr ( Ilowres
) ;
Iy
= Iycbcr ( : , : , 1 ) ;
Icb
= Iycbcr ( : , : , 2 ) ;
Icr
= Iycbcr ( : , : , 3 ) ;
使用雙立方插值提升亮度和兩個色度通道。上采樣的色度通道Icb_bicubic和Icr_bicubic不需要進一步處理。
Iy_bicubic
= imresize ( Iy
, [ nrows ncols
] , 'bicubic' ) ;
Icb_bicubic
= imresize ( Icb
, [ nrows ncols
] , 'bicubic' ) ;
Icr_bicubic
= imresize ( Icr
, [ nrows ncols
] , 'bicubic' ) ;
通過訓練好的 VDSR 網絡傳遞高檔亮度組件Iy_bicubic。觀察最終圖層(回歸層)中的activation,網絡的輸出是所需的殘差圖像。
Iresidual
= activations ( net
, Iy_bicubic
, 41 ) ;
Iresidual
= double ( Iresidual
) ;
imshow ( Iresidual
, [ ] )
title ( 'Residual Image from VDSR' )
將剩余圖像添加到高檔亮度組件,以獲得高分辨率 VDSR 亮度分量。
Isr
= Iy_bicubic
+ Iresidual
;
將高分辨率 VDSR 亮度組件與高檔彩色元件串聯在一起,使用ycbcr2rgb函數將圖像轉換為 RGB 顏色空間。
Ivdsr
= ycbcr2rgb ( cat ( 3 , Isr
, Icb_bicubic
, Icr_bicubic
) ) ;
imshow ( Ivdsr
)
title ( 'High-Resolution Image Obtained Using VDSR' )
5.4 視覺和定量比較
為了更好地了解高分辨率圖像,請檢查每個圖像中的一個小區域。使用格式的矢量(x y寬度高度)指定感興趣區域 (ROI)。這些元素定義左上角的 x 坐標和 y 坐標,以及 ROI 的寬度和高度。
roi
= [ 320 30 480 400 ] ;
將高分辨率圖像裁剪為此 ROI,并顯示結果為蒙太奇。VDSR 圖像比使用雙立方插值創建的高分辨率圖像具有更清晰的細節和更清晰的邊緣。
montage ( { imcrop ( Ibicubic
, roi
) , imcrop ( Ivdsr
, roi
) } )
title ( 'High-Resolution Results Using Bicubic Interpolation (Left) vs. VDSR (Right)' ) ;
使用圖像質量指標使用雙立方插值定量比較高分辨率圖像與 VDSR 圖像。參考圖像是原始高分辨率圖像Ireference。根據參考圖像測量每個圖像的峰值信噪比 (PSNR),較大的 PSNR 值通常表示圖像質量更好。
bicubicPSNR
= psnr ( Ibicubic
, Ireference
)
vdsrPSNR
= psnr ( Ivdsr
, Ireference
)
測量每個圖像的結構相似性指數 (SSIM)。SSIM 評估圖像三個特征的視覺沖擊:亮度、對比度和結構,以及參考圖像。SSIM 值越接近 1,測試圖像與參考圖像的同意性越好。
bicubicSSIM
= ssim ( Ibicubic
, Ireference
)
vdsrSSIM
= ssim ( Ivdsr
, Ireference
)
使用自然性圖像質量評估器 (NIQE) 測量感知圖像質量。較小的 NIQE 分數表示感知質量更好。
bicubicNIQE
= niqe ( Ibicubic
)
vdsrNIQE
= niqe ( Ivdsr
)
計算比例因子 2、3 和 4 的整個測試圖像集的平均 PSNR 和 SSIM。為簡單起見,可以使用幫助器函數superResolutionMetrics計算平均指標。
scaleFactors
= [ 2 3 4 ] ;
superResolutionMetrics ( net
, testImages
, scaleFactors
) ;
Results for Scale factor 2Average PSNR for Bicubic = 31.809683
Average PSNR for VDSR = 31.921784
Average SSIM for Bicubic = 0.938194
Average SSIM for VDSR = 0.949404Results for Scale factor 3Average PSNR for Bicubic = 28.170441
Average PSNR for VDSR = 28.563952
Average SSIM for Bicubic = 0.884381
Average SSIM for VDSR = 0.895830Results for Scale factor 4Average PSNR for Bicubic = 27.010839
Average PSNR for VDSR = 27.837260
Average SSIM for Bicubic = 0.861604
Average SSIM for VDSR = 0.877132
VDSR 在每個比例因子的指標分數比雙立方插值更好。
引用
[1] Kim, J., J. K. Lee, and K. M. Lee. “Accurate Image Super-Resolution Using Very Deep Convolutional Networks.” Proceedings of the IEEE? Conference on Computer Vision and Pattern Recognition.2016, pp. 1646-1654. [2] Grubinger, M., P. Clough, H. Müller, and T. Deselaers. “The IAPR TC-12 Benchmark: A New Evaluation Resource for Visual Information Systems.” Proceedings of the OntoImage 2006 Language Resources For Content-Based Image Retrieval. Genoa, Italy. Vol. 5, May 2006, p. 10. [3] He, K., X. Zhang, S. Ren, and J. Sun. “Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNe Classification.” Proceedings of the IEEE International Conference on Computer Vision, 2015, pp. 1026-1034.
創作挑戰賽 新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔 為你收集整理的【超分辨率实验】Matlab-使用深度学习的单图像超分辨率(Single Image Super-Resolution Using Deep Learning) 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。