获取分辨率函数是什么_深度学习应用“Zero Shot”超分辨率重构图像
超分辨率(SR)是一種提高圖像分辨率的技術。
這些方法是從低分辨率(LR)圖像中獲得高分辨率(HR)輸出。執行單圖像超分辨率(SISR)的目的是在增加圖像尺寸的同時使其質量下降的最小。應用范圍很廣,如醫學成像,壓縮,農業分析,自動駕駛到衛星圖像、偵察等等。
超分辨率領域正在經歷一段復興時期。卷積神經網絡和生成性對抗網絡等深度學習模型的最新進展引發了各種新方法,并為基于特征工程的經典方法無法解決的問題帶來了最新的研究成果。
在本文中,我們將討論該領域的主要方法,并將深入探討一種名為Zero Shot Super Resolution的特殊方法。
圖1. ZSSR VS EDSR性能比較
目前,在深度學習領域SR主要有兩種方法。
第一種方法:使用各種卷積神經網絡,最好使用跳過連接(深度神經網絡),并嘗試將L1或L2損失最小化,從低分辨率對重建高分辨率圖像。
第二種方法:生成性對抗神經網絡,也稱為GAN。
可以訓練GAN架構以生成類似于特定數據集的分布。GAN擁有兩個主要部分:生成器和判別器。
生成器學習如何從隨機噪聲中創建數據集分布,判別器學習如何區分數據集中的實際樣本與從生成器合成創建的樣本。通過以對抗性方式將它們一起訓練,每個部分都經過迭代改進,最終的結果是得到一個強大的樣本生成器和一個用于真實與合成樣本的強大的判別器。
例如:通過向GAN提供MNIST數據集,其生成器學習如何創建手寫數字,并且其判別器學習如何區分真實和合成數字。
圖2.手寫數字(MNIST)的GAN示意圖
我們采用這種架構并將GAN/對抗性損失降至最低。
SR的GAN模型的生成器部分通常使用L2損失(也稱為MSE或均方誤差)或更現代的感知損失,即均方誤差(MSE),但是其來自于預先在Imagenet上訓練的更深層的模型(通常是VGG-16或VGG-19)作為重構損失。預訓練模型的輸出為我們提供了高質量的特征,而無需任何耗時的特征工程。我們比較了網絡輸出的特征圖和HR圖像。
所有這些都歸結為這樣一個事實,即大多數超分辨率系統的核心都有L1或L2指標。這是有道理的,因為圖像重建的標準指標是PSNR(峰值信噪比)具有內置的MSE(L2損失):
PSNR = 10 * log10((data_range ** 2)/ mse),在sci-kit圖像中所定義。
Data_range是數據類型中的像素范圍。通常為255或1。
MSE的值越低意味著誤差越小,從MSE和PSNR之間的反比關系可以看出,MSE的值越小,PSNR值越大。從邏輯上講,PSNR值越高越好,因為它意味著信噪比更高。
圖3.創建高分辨率圖像
限制
在Technion研究員Yochai Blau 最近的一篇論文中,經研究證據被證實表明這兩種方法都受到內在權衡特性的約束。它的效果是顯而易見的,因為現有的許多SR方法難以同時提高噪聲(失真)和感知(質量)指標的性能。簡單來說,超分辨率圖像出現得越真實,它所具有的人造噪聲或偽影越多,并且超分辨率圖像中的失真和噪聲越少,圖像看起來就越模糊。
圖4.失真和感知權衡
目前的超分辨率(SR)方法的問題在于它們中的大多數都受到監督。這意味著通過對成對數據集的優化來學習算法參數。通過將低分辨率圖像重建為其高分辨率圖像時的損失函數最小化。
雖然已經有人進行了一些嘗試來生成具有本質上不同分辨率特征的數碼相機拍攝的數據集,但大多數數據集是通過使用插值方法(通常是雙三次)對圖像進行下采樣而生成的。這可能是非常有效且經濟的,但這也意味著大多數數據集不包括室外LR圖像。這具有非常深刻的含義,綜合創建的數據集并不代表真正的偽影和常見的低級圖像現象。這導致SR模型無法學習如何對抗源于光學或數字問題的缺陷,而主要是通過綜合創建低分辨率(LR)圖像而生成的偽影。最麻煩的是模型可能只學會逆轉下采樣機制本身。
要學習圖像的超分辨率,首先要使用GAN學習如何進行圖像退化來試圖解決這種成對數據創建的錯誤方法。
圖5.低質量圖像放大
Zero Shot Super-Resolution(Zssr)
在Weizmann研究所的Assaf Shocher撰寫的論文中,我們發現了一種新穎,簡單而優雅的方法來實現單圖像超分辨率。他們使用小型(~100K可訓練參數)全卷積神經網絡(FCN ),而不是在大型數據集上訓練大型網絡(EDSR ~43M參數),并對目標數據本身及其許多擴展進行訓練。以生成最終更高分辨率輸出。它們通過先創建原始圖像的縮小副本,并對其進行裁剪、翻轉和旋轉,從而動態生成數據增強,并生成LR-HR對。然后,他們模擬一個特定的預定義的超分辨率比例,通過先向下采樣,然后向上采樣,將增強效果模糊到原來的大小(等于其父級HR的大小)。導致模糊和非模糊的一對增強,兩者都從原始圖像按相同的隨機因素縮小比例,子級LR模糊的方式模擬預先確定的比例。
圖6是我們的ZSSR版本。子級LR圖像經過FCNN并最終添加到其未更改的副本(輸出= LR + FCN(LR))。然后我們計算關于父級HR輸出的L1損失:
然后將這些對輸入到FCN網絡進行訓練,目的是將LR圖像重建的L1損失降到最小,使其與HR匹配。使用具有ReLU激活函數,深度為8層和64個濾波器的神經網絡的簡單架構(對于所有層,只有最后一個是線性的)。設置從輸入到輸出的skip connection,因此我們只需要學習從模糊LR到HR源的殘差圖像。
圖6. ZSSR算法的圖示。
原始圖像I被許多不同的比例因子下采樣。每一個縮小的副本都是通過先縮小再放大來模糊的。通過比較網絡輸出的f(LR)和匹配的HR,我們可以訓練出一個LR-HR對。
最后,我們在原始圖像上進行測試(model.predict)以生成超分辨率輸出。
存在真實高質量圖像的情況下,可以使用PSNR和SSIM指標將其與網絡輸出進行比較。
關于這種架構的事實是,我們在沒有驗證集的情況下進行訓練,并且只在原始樣本上進行測試。雖然一開始這可能有點違反直覺,但它符合我們的目標,并明顯減少了運行時間。
神經網絡學習重新縮放(或映射)函數:
關于全卷積神經網絡(FCN)的另一個重要事實是我們可以使用不同的輸入大小。因此,每組樣本具有不同的大小。通過仔細選擇正確地超參數:內核大小為3 * 3,步幅為1和填充'same',我們得到了與輸入大小完全相同的輸出大小,使我們能夠計算它們的相對誤差。我們只通過改變雙三次插值來改進這個體系結構,調整大小的因素本身就是一個預定義的參數。
對這種架構的科學解釋是在圖像中存在重復的內部特征。在Weizmann研究所的同一組研究中顯示,尺寸為5 * 5和7 * 7的小圖像塊在不同的位置(在一張圖像中)重復它們的原始大小和跨尺度。在同一組的另一項工作中研究顯示,單個圖像與大圖像數據集相比具有較低的內部熵。這與內部圖像塊和自相似性原則是一致的。針對所討論的特定圖像的神經網絡進行訓練,然后在其上進行測試。
圖7. CSI 提高SOTA。
盡管神經網絡接受域小,但神經網絡能夠捕獲圖像中對象的非局部遞歸。這源于特定圖像的訓練過程。通過使學習獨立于圖像大小來進一步加速學習。這是通過合并裁剪機制實現的。只從每個圖像對中獲取固定大小的裁剪,不過這個超參數會對運行時間和性能產生很大影響。
特定于圖像的神經網絡可能聽起來是一個笨拙的解決方案,但現實是,盡管監督SISR方法可以得到令人印象深刻的結果,它們的性能在現實生活中的低質量圖像上大大減少。學習如何對抗真實的噪聲和人為干預需要創建一個非常深的神經網絡,每個神經網絡都經過訓練并專門針對特定的問題進行處理,并且針對該特定任務需要數天甚至數周的處理。
Zero Shot Super resolution確實優于大型監督SISR模型,在具有噪聲,壓縮、偽影等影響較大的低分辨率圖像。諸如降尺度內核,比例因子附加,噪聲水平及其在訓練增強上的類型等參數可供選擇,從而能夠更好地適應圖像的特征(添加噪聲有助于改善低質量LR圖像的效果)。選擇這些參數需要重新訓練,因此不適合大型架構。
現在,我們看一下代碼,討論它是如何工作的,并強調修改它以供將來實驗的方法。我們將突出強調main.py文件中的特定代碼塊,以更好地解釋底層的內容。我們將深入研究代碼實現并解釋主要函數和評估指標。
導入必要的庫
import argparseimport numpy as npimport cv2import osimport kerasfrom keras.callbacks import LearningRateScheduler, ModelCheckpointfrom keras.models import Modelfrom keras.layers import Conv2D, Inputfrom skimage.measure import compare_ssim as ssimfrom skimage.measure import compare_psnrimport globimport missinglink這里我么還使用了包括NumPy,cv2,Keras和MissingLink , MissingLink.ai SDK,它是深度學習工作流程自動化的平臺,SDK通過消除管理大量實驗,大型數據集,本地和外部機器以及代碼版本控制的痛苦,實現了復雜深度學習模型的快速高效開發。我們將利用它來跟蹤我們實驗的實時值,然后,對于更高級的用戶,我們將深入研究MissingLink的數據管理功能。
主程序編譯
在主程序內部,我們設置了一個參數解析器,用于從CLI配置參數,獲取輸出目錄和目標映像的路徑,然后加載它。我們還將TensorFlow定義為后端,并將圖像維度排序為通道最后。不同的Keras后端庫(TensorFlow,Theano)以相反的方式設置這些,即通道首先分別對應于通道。通過確保設置是這樣的,我們可以避免錯誤來為我們的神經網絡提供錯誤的數據形狀。
# mainif __name__ == '__main__': np.random.seed(0) if keras.backend == 'tensorflow': keras.backend.set_image_dim_ordering('tf') # Provide an alternative to provide MissingLinkAI credential parser = argparse.ArgumentParser() parser.add_argument('--srFactor', type=int) parser.add_argument('--epochs', type=int, default=EPOCHS) #parser.add_argument('--filepath', type=str) parser.add_argument('--subdir', type=str, default='067') parser.add_argument('--filters', type=int, default=FILTERS) parser.add_argument('--activation', default=ACTIVATION) parser.add_argument('--shuffle', default=SHUFFLE) parser.add_argument('--batch', type=int, default=BATCH_SIZE) parser.add_argument('--layers', type=int, default=LAYERS_NUM) parser.add_argument('--sortOrder', default=SORT_ORDER) parser.add_argument('--scalingSteps', type=int, default=NB_SCALING_STEPS) parser.add_argument('--groundTruth', default=GROUND_TRUTH) parser.add_argument('--baseline', default=BASELINE) parser.add_argument('--flip', default=FLIP_FLAG) parser.add_argument('--noiseFlag', default=False) parser.add_argument('--noiseSTD', type = int, default=30) parser.add_argument('--project') # Override credential values if provided as arguments args = parser.parse_args() #file_name = args.filepath or file_name subdir = args.subdir SR_FACTOR = args.srFactor or SR_FACTOR FILTERS = args.filters or FILTERS EPOCHS = args.epochs or EPOCHS ACTIVATION = args.activation or ACTIVATION SHUFFLE = args.shuffle or SHUFFLE BATCH_SIZE = args.batch or BATCH_SIZE LAYERS_NUM = args.layers or LAYERS_NUM SORT_ORDER = args.sortOrder or SORT_ORDER NB_SCALING_STEPS = args.scalingSteps or NB_SCALING_STEPS GROUND_TRUTH = args.groundTruth or GROUND_TRUTH BASELINE = args.baseline or BASELINE FLIP_FLAG = args.flip or FLIP_FLAG NOISE_FLAG = args.noiseFlag or NOISE_FLAG NOISY_PIXELS_STD = args.noiseSTD or NOISY_PIXELS_STD # We're making sure These parameters are equal, in case of an update from the parser. NB_PAIRS = EPOCHS EPOCHS_DROP = np.ceil((NB_STEPS * EPOCHS) / NB_SCALING_STEPS) psnr_score = None ssim_score = None metrics_ratio = None # Path for Data and Output directories on Docker # save to disk if os.environ.get('ML'): output_paths = '/output' else: output_paths = os.path.join(os.getcwd(), 'output') if not os.path.exists(output_paths): os.makedirs(output_paths) print (output_paths) # output_paths = select_first_dir('/output', './output') # if (output_paths == './output'): # mk_dir(dir_name='./output') file_name = select_file(ORIGIN_IMAGE, subdir) print(file_name) # Load image from data volumes image = load_img(file_name) cv2.imwrite(output_paths + '/' + 'image.png', cv2.cvtColor(image, cv2.COLOR_RGB2BGR), params=[CV_IMWRITE_PNG_COMPRESSION])構建模型
我們使用Keras函數模型API創建模型。這使我們能夠創建比常見的Sequential模型更復雜的架構。
build_model()
build_model() 函數是我們定義和編譯模型的地方。
def build_model(): # model filters = FILTERS # 64 kernel_size = 3 # Highly important to keep image size the same through layer strides = 1 # Highly important to keep image size the same through layer padding = "same" # Highly important to keep image size the same through layer inp = Input(shape=(None, None, NB_CHANNELS)) # seq_model = Sequential() z = (Conv2D( filters=NB_CHANNELS, kernel_size=kernel_size, activation="relu總結
以上是生活随笔為你收集整理的获取分辨率函数是什么_深度学习应用“Zero Shot”超分辨率重构图像的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vb6实现union数据结构_数据结构与
- 下一篇: 微软已暂时停用你的账户_微软小冰公众号因