本文代碼
?????????本文代碼主體來自CVPR2020論文《Closed-loop matters: Dual regression networks for single image super-resolution》,但原作者并未提供論文亮點(diǎn)--如何使用unpair數(shù)據(jù)進(jìn)行訓(xùn)練的代碼,所以我在其基礎(chǔ)上補(bǔ)齊了該過程的代碼。
? ? ? ? 代碼倉庫:https://github.com/VitaminyW/Super_Solution
? ? ? ? PS:對代碼存在問題可以通過私信或評論區(qū)提問。
一、數(shù)據(jù)預(yù)處理
為了訓(xùn)練模型實(shí)現(xiàn)8倍超分,本工作中使用BICUBIC算法對高清圖像進(jìn)行下采樣8倍,從而獲得作為網(wǎng)絡(luò)輸入的低分辨率圖像。
BICUBIC算法:雙三次插值又稱立方卷積插值。三次卷積插值是一種更加復(fù)雜的插值方式。該算法利用待采樣點(diǎn)周圍16個(gè)點(diǎn)的灰度值作三次插值,不僅考慮到4個(gè)直接相鄰點(diǎn)的灰度影響,而且考慮到各鄰點(diǎn)間灰度值變化率的影響。其權(quán)重函數(shù)如下所示,
?
?????? 其中a=-0.5,x為待插值點(diǎn)與插值點(diǎn)的距離。插值過程可由下式所示,
? ?
?????? 其中代表距離待插值點(diǎn)
的像素值。
圖1. 0200.png下采圖像展示
二、算法原理
????????
圖2.DRN網(wǎng)絡(luò)結(jié)構(gòu)圖
2.1? 算法目標(biāo)
????? 在超分辨率問題中,存在著兩個(gè)問題:
????? a. 從超分辨率圖像到低分辨率圖像存在著非常多種下采樣方式,即真實(shí)世界的低分辨率圖像形成的原因多種多樣。
????? b. 深度學(xué)習(xí)是一種基于數(shù)據(jù)的學(xué)習(xí)方式,若數(shù)據(jù)集的輸入是由某種特定下采方式得到的,則模型可能會學(xué)習(xí)到該特定下采方式的偽逆。
2.2??解決方法以及算法原理
????? a. 正向過程
?????????? 網(wǎng)絡(luò)通過借鑒UNet網(wǎng)絡(luò)的結(jié)構(gòu)方式,通過多級下采樣提取圖像特征,并通過concat方式結(jié)合原有圖像特征與上采特征圖進(jìn)行上采樣,從而產(chǎn)生多個(gè)高分辨率圖像。若網(wǎng)絡(luò)存在3個(gè)層級,則每個(gè)層級分別對應(yīng)1倍、2倍以及4倍分辨率重建網(wǎng)絡(luò)。最后通過MSE或MAE損失函數(shù)可以促使網(wǎng)絡(luò)學(xué)習(xí)如何進(jìn)行正向重建。
????? b. 對偶過程
?????????? 正向過程是求解由低分辨率到高分辨率的解,即該問題解空間較大,所以需要較為復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu)。對偶過程指在學(xué)習(xí)數(shù)據(jù)中由高分辨率到低分辨率的下采過程,該過程解空間較小,可以使用較為簡單的網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行學(xué)習(xí)。
????? c. 半監(jiān)督學(xué)習(xí)
?????????? 由于對偶過程輸入的為網(wǎng)絡(luò)重建出來的高分辨率圖像,其學(xué)習(xí)標(biāo)簽為低分辨率圖像,所以該過程不依賴于是否擁有真實(shí)超分標(biāo)簽,從而網(wǎng)絡(luò)可以進(jìn)行半監(jiān)督學(xué)習(xí)。
????? d. 損失函數(shù)
????????其中表示第i張低分辨率圖像,
表示第
張高分辨率圖像,
代表網(wǎng)絡(luò)重建,
分別代表正向過程和反向過程的評估函數(shù),
代表指示
是否有對應(yīng)的
的函數(shù),若有為1,否則為0. 由
函數(shù),在編程中易得pair數(shù)據(jù)與unpair數(shù)據(jù)分別計(jì)算損失函數(shù)進(jìn)行反向傳播。
三、代碼流程
????????
3.1 詳細(xì)步驟:
3.1.1?構(gòu)建數(shù)據(jù)集,數(shù)據(jù)集結(jié)構(gòu)如下圖所示:
下采樣代碼位于代碼目錄的dataProcessing.ipynb
圖3. 數(shù)據(jù)集結(jié)構(gòu)
3.1.2?設(shè)置option.py文件
????????將--data_dir,--data_train,--data_val參數(shù)修改為對應(yīng)數(shù)據(jù)集路徑與名稱。也可選擇通過命令行輸入。
3.1.3?運(yùn)行訓(xùn)練代碼
????????使用終端打開main.py所在文件目錄,輸入以下指令進(jìn)行訓(xùn)練。
python main.py –batch_size 32 –n_GPUs 4 –save ./experiment/training_result --model DRN-S
3.1.4?由于原文作者未提供使用unpaired數(shù)據(jù)進(jìn)行網(wǎng)絡(luò)fine-tune代碼,本工作根據(jù)論文邏輯,編寫了 main_fine_tune.py代碼,輸入以下指令進(jìn)行訓(xùn)練
python main.py –batch_size 32 –n_GPUs 4 –save ./experiment/fine_tune_result --pre_train {預(yù)訓(xùn)練正向模型的參數(shù)保存地址} --pre_train_dual {預(yù)訓(xùn)練對偶模型的參數(shù)保存地址} --model DRN-S
3.1.5?由于原文作者未提供重建unpaired數(shù)據(jù)的代碼,本工作根據(jù)代碼邏輯編寫了對應(yīng)main_reconstruction.py代碼,輸入指令進(jìn)行預(yù)測。
python main_reconstruction.py --no_augment --model DRN-S --test_only --save ./reconstruction --save_results --batch_size 1 --save ./reconstruction --pre_train {fine-turn后正向模型的參數(shù)保存地址} --pre_train_dual {fine-turn后對偶模型的參數(shù)保存地址}
3.2 過程截圖
a. ./experiment/training_result文件夾下:
圖4.train輸出內(nèi)容展示
b. ./experiment/fine_tune_result
圖5.fine-tune輸出內(nèi)容展示
c. ./reconstruction
圖6.reconstrution輸出內(nèi)容展示
四、部分結(jié)果展示
文章來源:http://www.zghlxwxcb.cn/news/detail-793905.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-793905.html
到了這里,關(guān)于圖像超分辨率重建(pytorch)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!