深度學習超分辨率重建(一): TensorFlow——SRCNN

轉:https://blog.csdn.net/u010327061/article/details/80046690

1.SRCNN(原理和代碼)

基於TensorFlow的代碼下載:https://github.com/tegg89/SRCNN-Tensorflow

文章鏈接:(Learning a Deep Convolutional Network for Image Super-Resolution, ECCV2014)

環境配置深度學習(一):虛擬機Linux系統搭建CPU TensorFlow

基礎理論學習方便理解:deeplearning.ai 吳恩達網上課程學習(十五)——卷積神經網絡及其TensorFlow代碼實現

 

1.1 配置環境遇到的問題:

在TensorFlow的虛擬環境中安裝,不要加sodu,否則會裝到默認的Python2.7裏

① ModuleNotFoundError: No module named 'h5py':

pip install h5py

tensorboard 1.7.0 has requirement bleach==1.5.0, but you'll have bleach 2.1.3 which is incompatible.
tensorboard 1.7.0 has requirement html5lib==0.9999999, but you'll have html5lib 1.0.1 which is incompatible.

如果使用sudo則不是說在虛擬環境下安裝,以下類似

② ModuleNotFoundError: No module named 'matplotlib'

pip install matplotlib

③ ModuleNotFoundError: No module named 'PIL'

pip install Pillow  

④ No module named 'scipy'

pip install scipy

1.2 代碼解釋:

① tf.app.flags

tf定義了tf.app.flags,用於支持接受命令行傳遞參數,相當於接受argv。

 

[html] view plain copy

    <code class="language-html"><span style="font-family:'FangSong_GB2312';">import tensorflow as tf  
      
    #第一個是參數名稱,第二個參數是默認值,第三個是參數描述  
    tf.app.flags.DEFINE_string('str_name', 'def_v_1',"descrip1")  
    tf.app.flags.DEFINE_integer('int_name', 10,"descript2")  
    tf.app.flags.DEFINE_boolean('bool_name', False, "descript3")  
    #FLAGS是一個對象,保存瞭解析後的命令行參數  
    FLAGS = tf.app.flags.FLAGS  
      
    #必須帶參數,否則:'TypeError: main() takes no arguments (1 given)';   main的參數名隨意定義,無要求  
    def main(_):    
        print(FLAGS.str_name)  
        print(FLAGS.int_name)  
        print(FLAGS.bool_name)  
      
    if __name__ == '__main__':  
        tf.app.run()  #執行main函數</span></code>  

② class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, compact=False) 

pprint模塊提供了一個美觀地打印Python數據結構的方式。如果是要格式化的數據結構裏包含了非基本類型的數據,有可能這種數據類型不會被加載。比如數據類型是文件、網絡socket、類等。本模塊格式化時,儘可能保持一個對象一行表示,並且當超過允許寬度時也會自動換行表示。所有字典數據類型,都會先按鍵來排序,然後再進行格式化輸出。

構造一個打印實例PrettyPrinter。這個構造函數需要好幾個參數來配置打印參數。可以通過參數stream來設置流輸出對象,流輸出對象要實現write()的文件協議。如果沒有指定流輸出對象,默認是輸出到sys.stdout。每行遞歸縮進的寬度是通過indent來設置,默認設置爲1。參數width是表示每行的寬度,如果超過一行的寬度就會換行輸出。參數depth是表示複合對象輸出的層次深度,默認是沒有限制,所有層次的對象都輸出。參數compact是表示換行時下一行是否輸出內容,還是跳過。
https://blog.csdn.net/caimouse/article/details/50704332

③os.makedirs(path, mode=0o777)

os.makedirs() 方法用於遞歸創建目錄。像 mkdir(), 但創建的所有intermediate-level文件夾需要包含子目錄。

http://www.runoob.com/python/os-makedirs.html

④try與except處理異常語句:

https://blog.csdn.net/f156207495/article/details/78387617

 

1.3 原理學習:

1.3.1 鏈接參考:

https://blog.csdn.net/u011630458/article/details/79103923

https://blog.csdn.net/m0_37510087/article/details/79367649

https://blog.csdn.net/Uwr44UOuQcNsUQb60zk2/article/details/78474303

1.3.2 具體過程:

33*33*1&9*9*64---  25*25*64& 1*1*35---25*25*35 & 5*5*1 ---21*21*1

 

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

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

論文說的只訓練YCbCr模式的Y通道,具體流程就是:訓練的時候輸入BRG模式的圖片,再轉化爲YCbCr模式,但是隻將Y通道通過CNN網絡,最後輸出的結果再和另外兩個合成生成心得YCbCr模式圖片,最後再轉回BGR模式,將最終生成的BGR模式圖片與輸入的BRG模式圖片計算MSE loss,進行梯度下降訓練網絡。具體流程如下圖:

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