使用TensorFlow創建能夠圖像重建的自編碼器模型

2021-01-11 deephub

想像你正在解決一個拼圖遊戲。你已經完成了大部分。假設您需要在一幅幾乎完成的圖片中間修復一塊。你需要從盒子裡選擇一塊,它既適合空間,又能完成整個畫面。

我相信你很快就能做到。但是你的大腦是怎麼做到的呢?

首先,它會分析空槽周圍的圖片(在這裡你需要固定拼圖的一塊)。如果圖片中有一棵樹,你會尋找綠色的部分(這是顯而易見的!)所以,簡而言之,我們的大腦能夠通過知道圖像周圍的環境來預測圖像(它將適合放入槽中)。

在本教程中,我們的模型將執行類似的任務。它將學習圖像的上下文,然後利用學習到的上下文預測圖像的一部分(缺失的部分)。

在這篇文章之前,我們先看一下代碼實現

我建議您在另一個選項卡中打開這個筆記本(TF實現),這樣您就可以直觀地了解發生了什麼。

colab/drive/1zFe9TmMCK2ldUOsVXenvpbNY2FLrLh5k#scrollTo=UXjElGKzyiey&forceEdit=true&sandboxMode=true

問題

我們希望我們的模型能預測圖像的一部分。給定一個有部份缺失圖像(只有0的圖像陣列的一部分),我們的模型將預測原始圖像是完整的。

因此,我們的模型將利用它在訓練中學習到的上下文重建圖像中缺失的部分。

數據

我們將為任務選擇一個域。我們選擇了一些山地圖像,它們是Puneet Bansal在Kaggle上的 Intel Image Classification數據集的一部分。

為什麼只有山脈的圖像?

在這裡,我們選擇屬於某個特定域的圖像。如果我們選擇的數據集中有更廣泛圖像,我們的模型將不能很好地執行。因此,我們將其限制在一個域內。

使用wget下載我在GitHub上託管的數據

!wget github/shubham0204/Dataset_Archives/blob/master/mountain_images.zip?raw=true -O images.zip !unzip images.zip

為了生成訓練數據,我們將遍歷數據集中的每個圖像,並對其執行以下任務,

首先,我們將使用PIL.Image.open()讀取圖像文件。使用np.asarray()將這個圖像對象轉換為一個NumPy數組。

確定窗口大小。這是正方形的邊長這是從原始圖像中得到的。

在[ 0 , image_dim — window_size ]範圍內生成2個隨機數。image_dim是我們的方形輸入圖像的大小。

這兩個數字(稱為px和py)是從原始圖像剪裁的位置。選擇圖像數組的一部分,並將其替換為零數組。

代碼如下

x = [] y = [] input_size = ( 228 , 228 , 3 ) # Take out a square region of side 50 px. window_size = 50 # Store the original images as target images. for name in os.listdir( 'mountain_images/' ): image = Image.open( 'mountain_images/{}'.format( name ) ).resize( input_size[0:2] ) image = np.asarray( image ).astype( np.uint8 ) y.append( image ) for name in os.listdir( 'mountain_images/' ): image = Image.open( 'mountain_images/{}'.format( name ) ).resize( input_size[0:2] ) image = np.asarray( image ).astype( np.uint8 ) # Generate random X and Y coordinates within the image bounds. px , py = random.randint( 0 , input_size[0] - window_size ) , random.randint( 0 , input_size[0] - window_size ) # Take that part of the image and replace it with a zero array. This makes the "missing" part of the image. image[ px : px + window_size , py : py + window_size , 0:3 ] = np.zeros( ( window_size , window_size , 3 ) ) # Append it to an array x.append( image ) # Normalize the images x = np.array( x ) / 255 y = np.array( y ) / 255 # Train test split x_train, x_test, y_train, y_test = train_test_split( x , y , test_size=0.2 )

自動編碼器模型與跳連接

我們添加跳轉連接到我們的自動編碼器模型。這些跳過連接提供了更好的上採樣。通過使用最大池層,許多空間信息會在編碼過程中丟失。為了從它的潛在表示(由編碼器產生)重建圖像,我們添加了跳過連接,它將信息從編碼器帶到解碼器。

alpha = 0.2 inputs = Input( shape=input_size ) conv1 = Conv2D( 32 , kernel_size=( 3 , 3 ) , strides=1 )( inputs ) relu1 = LeakyReLU( alpha )( conv1 ) conv2 = Conv2D( 32 , kernel_size=( 3 , 3 ) , strides=1 )( relu1 ) relu2 = LeakyReLU( alpha )( conv2 ) maxpool1 = MaxPooling2D()( relu2 ) conv3 = Conv2D( 64 , kernel_size=( 3 , 3 ) , strides=1 )( maxpool1 ) relu3 = LeakyReLU( alpha )( conv3 ) conv4 = Conv2D( 64 , kernel_size=( 3 , 3 ) , strides=1 )( relu3 ) relu4 = LeakyReLU( alpha )( conv4 ) maxpool2 = MaxPooling2D()( relu4 ) conv5 = Conv2D( 128 , kernel_size=( 3 , 3 ) , strides=1 )( maxpool2 ) relu5 = LeakyReLU( alpha )( conv5 ) conv6 = Conv2D( 128 , kernel_size=( 3 , 3 ) , strides=1 )( relu5 ) relu6 = LeakyReLU( alpha )( conv6 ) maxpool3 = MaxPooling2D()( relu6 ) conv7 = Conv2D( 256 , kernel_size=( 1 , 1 ) , strides=1 )( maxpool3 ) relu7 = LeakyReLU( alpha )( conv7 ) conv8 = Conv2D( 256 , kernel_size=( 1 , 1 ) , strides=1 )( relu7 ) relu8 = LeakyReLU( alpha )( conv8 ) upsample1 = UpSampling2D()( relu8 ) concat1 = Concatenate()([ upsample1 , conv6 ]) convtranspose1 = Conv2DTranspose( 128 , kernel_size=( 3 , 3 ) , strides=1)( concat1 ) relu9 = LeakyReLU( alpha )( convtranspose1 ) convtranspose2 = Conv2DTranspose( 128 , kernel_size=( 3 , 3 ) , strides=1 )( relu9 ) relu10 = LeakyReLU( alpha )( convtranspose2 ) upsample2 = UpSampling2D()( relu10 ) concat2 = Concatenate()([ upsample2 , conv4 ]) convtranspose3 = Conv2DTranspose( 64 , kernel_size=( 3 , 3 ) , strides=1)( concat2 ) relu11 = LeakyReLU( alpha )( convtranspose3 ) convtranspose4 = Conv2DTranspose( 64 , kernel_size=( 3 , 3 ) , strides=1 )( relu11 ) relu12 = LeakyReLU( alpha )( convtranspose4 ) upsample3 = UpSampling2D()( relu12 ) concat3 = Concatenate()([ upsample3 , conv2 ]) convtranspose5 = Conv2DTranspose( 32 , kernel_size=( 3 , 3 ) , strides=1)( concat3 ) relu13 = LeakyReLU( alpha )( convtranspose5 ) convtranspose6 = Conv2DTranspose( 3 , kernel_size=( 3 , 3 ) , strides=1 , activation='relu' )( relu13 ) model = tf.keras.models.Model( inputs , convtranspose6 ) model.compile( loss='mse' , optimizer='adam' , metrics=[ 'mse' ] )

最後,訓練我們的自動編碼器模型,

model.fit( x_train , y_train , epochs=150 , batch_size=25 , validation_data=( x_test , y_test ) )

結論

以上結果是在少數測試圖像上得到的。我們觀察到模型幾乎已經學會了如何填充黑盒!但我們仍然可以分辨出盒子在原始圖像中的位置。這樣,我們就可以建立一個模型來預測圖像缺失的部分。

這裡我們只是用了一個簡單的模型來作為樣例,如果我們要推廣到現實生活中,就需要使用更大的數據集和更深的網絡,例如可以使用現有的sota模型,加上imagenet的圖片進行訓練。

作者 Shubham Panchal

deephub 翻譯組

相關焦點

  • TensorFlow 攜手 NVIDIA,使用 TensorRT 優化 TensorFlow Serving...
    >1538687457在此前的博客中,我們演示了如何使用 TensorFlow Serving CPU Docker 圖像來創建模型。在這裡,我們運行 GPU Docker 圖像(點擊查看相關說明),從而藉助 GPU 創建並測試此模型:$ docker pull tensorflow/serving:latest-gpu$ docker run --rm --runtime=nvidia -p 8501:8501 --name tfserving_resnet \
  • TensorFlow極簡教程:創建、保存和恢復機器學習模型
    按照順序閱讀下列腳本:serial.pytensor.pybigdata.pySerial.py這個腳本的目的是說明 TensorFlow 模型的基本要點。這個腳本使你更容易理解模型是如何組合在一起的。我們使用 for 循環來定義數據與線之間的誤差。由於定義誤差的方式為循環,該腳本以序列化(串行)計算的方式運行。
  • 如何在PyTorch和TensorFlow中訓練圖像分類模型
    在本文中,我們將了解如何在PyTorch和TensorFlow中建立基本的圖像分類模型。我們將從PyTorch和TensorFlow的簡要概述開始。然後,我們將使用MNIST手寫數字分類數據集,並在PyTorch和TensorFlow中使用CNN(卷積神經網絡)建立圖像分類模型。這將是你的起點,然後你可以選擇自己喜歡的任何框架,也可以開始構建其他計算機視覺模型。
  • Tensorflow基礎教程15天之創建Tensor
    Tensor是Tensorflow中使用在計算圖中的最基本的數據單位,我們可以聲明Tensor為variable,或者為Tensor提供placeholer。但首先我們必須知道如何創建Tensor。在將Tensor定義為Variable之後,Tensorflow才會將其傳入計算圖。如何操作我們將在這裡介紹創建Tensor的主要方法。
  • 如何利用TensorFlow.js部署簡單的AI版「你畫我猜」圖像識別應用
    本文創建了一個簡單的工具來識別手繪圖像,並且輸出當前圖像的名稱。該應用無需安裝任何額外的插件,可直接在瀏覽器上運行。作者使用谷歌 Colab 來訓練模型,並使用 TensorFlow.js 將它部署到瀏覽器上。
  • 教程 | 如何利用TensorFlow.js部署簡單的AI版「你畫我猜」圖像識別應用
    我在 TensorFlow.js 上創建了一個教程(https://medium.com/tensorflow/a-gentle-introduction-to-tensorflow-js-dba2e5257702)。在繼續下面的工作之前,請務必先閱讀一下這個教程。下圖為該項目的處理流程:
  • TensorFlow官方力推、GitHub爆款項目:用Attention模型自動生成...
    此處,我們使用一個基於Attention的模型。該模型能夠在生成字幕的時候,讓我們查看它在這個過程中所關注的是圖像的哪一部分。如果你運行它,將會下載 MS-COCO數據集,使用Inception V3來預處理和緩存圖像的子集、訓練出編碼-解碼模型,並使用它來在新的圖像上生成字幕。 如果你在Colab上面運行,那麼TensorFlow的版本需要大於等於1.9。
  • 如何使用TensorFlow Hub的ESRGAN模型來在安卓app中生成超分圖片
    儘管可以使用傳統的插值方法(如雙線性插值和雙三次插值)來完成這個任務,但是產生的圖片質量卻經常差強人意。深度學習,尤其是對抗生成網絡 GAN,已經被成功應用在超分任務上,比如 SRGAN 和 ESRGAN 都可以生成比較真實的超分圖片。那麼在本文裡,我們將介紹一下如何使用TensorFlow Hub上的一個預訓練的 ESRGAN 模型來在一個安卓 app 中生成超分圖片。
  • 步履不停:TensorFlow 2.4新功能一覽!
    系統會在參數伺服器上創建變量,然後工作節點會在每個步驟中進行讀取和更新。變量的讀取和更新會在各工作節點上獨立進行,同時無需採取任何同步操作。由於工作節點互不依賴,因此該策略具有工作器容錯的優勢,並會在使用搶佔式伺服器時有所助益。如要開始使用此策略,請查閱參數伺服器訓練教程。
  • TensorFlow極速入門
    最後給出了在 tensorflow 中建立一個機器學習模型步驟,並用一個手寫數字識別的例子進行演示。1、tensorflow是什麼?tensorflow 是 google 開源的機器學習工具,在2015年11月其實現正式開源,開源協議Apache 2.0。
  • 玩轉TensorFlow?你需要知道這30功能
    如果你關心如何使模型保持最新並監控它們,那麼你可以了解一下這個產品、看看它的論文。地址是:tensorflow.org/tfx/?它可以可視化展現模型運行過程中的日誌,而且對於標量、直方圖、分布、圖、圖像、音頻等都有各自的展示面板。網址是:https://t.co/CEVbcJTHLP?
  • 使用卷積神經網絡,構建圖像分類模型檢測肺炎
    開發一種能夠可靠地根據x光圖像對肺炎進行分類的模型,可以減輕需求高的地區醫生的負擔。數據Kermany和他在加州大學聖地牙哥分校的同事們在使用深度學習的胸部x光和光學相干斷層掃描的基礎上,主動識別疾病。我們使用他們研究中提供的胸部x光圖像作為我們的數據集。
  • 在PyTorch中使用深度自編碼器實現圖像重建
    這些模型可以應用於包括圖像重建在內的各種應用。在圖像重建中,他們學習輸入圖像模式的表示,並重建與原始輸入圖像模式匹配的新圖像。圖像重建有許多重要的應用,特別是在醫學領域,需要從現有的不完整或有噪聲的圖像中提取解碼後的無噪聲圖像。在本文中,我們將演示在PyTorch中實現用於重建圖像的深度自編碼器。
  • TensorFlow 2入門指南,初學者必備!
    如果要查看此數據集的詳細信息,可以使用  iris[ ['DESCR']。現在,我們必須導入其他重要的庫,這將有助於我們創建神經網絡。from sklearn.model_selection import train_test_split #to split dataimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport tensorflow as tffrom te
  • 終於來了,TensorFlow 新增官方 Windows 支持
    同時,谷歌也在 TensorFlow 框架中進行過各類研究、開源了其中一些項目,這些研究涉及到自然語言處理、機器翻譯、圖像描述、圖像分類等等。谷歌在開發者博客上寫到:「原生的 Windows 版 TensorFlow 是自開源以來,我們工作的重中之重。
  • TensorFlow 資源大全中文版
    提供了高級別的TensorFlow封裝接口Neural Style – neural style的又一實現AlexNet3D – 用3D卷積層實現AlexNetTensorFlow筆記 – TensorFlow的學習筆記和總結,附帶一些圖片說明NeuralArt – 藝術風格繪畫的神經網絡算法TensorFlow實現DQN玩桌球
  • 關於TensorFlow,你應該了解的9件事
    TensorFlow 下載地址:https://www.tensorflow.org/install/TensorFlow 初始教程:https://www.datacamp.com/community/tutorials/tensorflow-tutorial
  • 使用Python和Keras創建簡單語音識別引擎
    這個過程類似於圖像預處理,如下例所示:多虧尼奎斯特定理(1933年— 弗拉基米爾·科特爾尼科夫(Vladimir Kotelnikov)),我們知道,只要採樣速度至少是我們要記錄的最高頻率的兩倍,我們就可以使用數學方法從間隔採樣中完美重建原始聲波。
  • 程式設計師1小時完成深度學習Resnet,谷歌tensorflow多次圖像大賽冠軍
    編譯環境:Python3.6TensorFlow-gpu 1.5.0Pycharm數 據 集:MNIST一、結構分析關於ResNet的來源我就不進行贅述了,相信讀者都對其或多或少有一定的了解,這個包攬各大圖像識別賽事冠軍的模型究竟有什麼與眾不同?
  • 聯邦學習:Tensorflow中的逐步實現
    導入所需的Python庫讀取和預處理MNIST數據集我正在使用MNIST數據集的jpeg版本。它由42000個數字圖像組成,每個類保存在單獨的文件夾中。我將使用一下Python代碼片段將數據加載到內存中,並保留10%的數據,以便稍後測試經過訓練的全局模型。在第9行,從磁碟讀取每個圖像作為灰度,然後將其flattened。