1. 程式人生 > 其它 >不用P圖軟體,TensorFlow pix2pix也能幫你打造出六塊腹肌!

不用P圖軟體,TensorFlow pix2pix也能幫你打造出六塊腹肌!

視覺化結果是十分強大的。然而,在健身領域,要想清楚地看到未來的鍛鍊結果往往是很困難的。我們是否可以利用深度學習讓人們更接近他們的個人健康目標,從而幫助他們設想未來的結果?

我們的想法是:採用有條件的生成對抗網路(GANs),虛構出一張一個人在經過健康飲食和鍛鍊的情況下未來的身材變化的圖片。結果如下:

在這篇文章中,我將簡要地介紹一下生成對抗網路。然後,我會提供一些指導,用於訓練一個TensorFlow實現的模型,該模型使用GPU訓練和部署平臺FloydHub。

生成對抗的網路 2014年,Ian Goodfellow和其他一些人在蒙特利爾實驗室首次提出了生成對抗網路(Generative Adversarial Networks),從那時起,他們就受到了很大的關注,因為他們說:

…在過去的10年裡,最有趣的想法是進行機器學習。

生成模型是一種無監督的學習技能,它試圖學習一些資料的分佈(如語料庫中的文字或在一張圖片中物體的畫素大小)。

生成對抗網路包含兩個有相反目標的網路,以某種遊戲的形式在它們之中尋求平衡。“生成器(Generator)”將一些取樣於所謂的“潛在的空間(latent space)”的輸入轉換。“鑑別器(Discriminator)”只是一個分類器,它接收來自生成器和真實物件的輸出,然後接受訓練,以確定它所觀察的輸入是生成的還是真實的。

其基本思想是,當兩個網路的效能都達到最佳時,生成器就會建立在各自的輸出空間內分佈的影象,就像鑑別器的實際輸入一樣。

一些流行的對抗網路架構是:

  • 深度卷積生成對抗網路(Deep Convolutional GANs),用來生成真實的影象。
  • 有條件的生成對抗網路(Conditional GANs),它學習了輸出影象的分佈,給出了對應用程式的成對輸入,例如,影象與影象之間的轉換。
  • 迴圈一致的生成對抗網路(Cycle-Consistent GANs),它可以在不需要成對輸入的情況下學習影象與影象之間的對映。

生成對抗網路的一套全面的資源:https://github.com/nightrome/really-awesome-gan

這裡有一個關於鑑別器的圖表概述:

生成器的圖表概述:

我們的實現

我們選擇用一個有條件的生成對抗網路,學習成人男性在身材轉換之間的對映。然後,我選擇使用FloydHub而不是AWS EC2或谷歌雲來計算和儲存我的網路的調整權重,原因有很多:

  • 只需少數的幾個簡單的shell命令,在無需處理FTP的情況下,裝載資料(mount data)的處理在FloydHub上是非常簡單的。
  • 在無需請求或下載這些日誌的情況下,日誌與floyd-clicommand-line工具或者FloydHub網路儀表盤可以隨時使用,並且操作十分容易。
  • 定價有競爭力。

裝載資料:https://docs.floydhub.com/guides/data/mounting_data/

在FloydHub裡執行著pix2pix的Tensorflow實現,需要對程式碼進行一些細微的調整,我將在這裡詳細說明,希望將來任何嘗試類似專案的人都可以節省一些時間。

一個典型的訓練命令,可以spin up一個FloydHub的雲GPU訓練伺服器,看起來像下面這樣:

floyd run --gpu --data rayheberer/datasets/dreamfit/4:/dreamfit_data 'python pix2pix.py --mode 
train --output_dir /output --max_epochs 200 --input_dir /dreamfit_data --which_direction AtoB
  • –data path:/dir裝載了一個FloydHub資料集,並且使它在/dir上是可用的。
  • 儲存輸出,例如模型檢查點(checkpoint),必須總是被儲存到/output(這是一個重要的細節)。

Christopher Hesse的pix2pix實現是在Tensorflow 1.0.0中進行的,這意味著現在已經有的save_relative_pathsoption對tf.train.saver還沒有實現。

此外,你應該意識到這一點,而不是從單一的.ckptfile中恢復。該模型將許多檔案儲存在訓練期間指定的輸出目錄中,然後在測試或匯出過程中選擇作為檢查點目錄。

為什麼這會成為一個問題? 因為在pix2pix.py中的第625行和725行中,使用tf.train.latest_checkpoint(a.checkpoint)來恢復對saver的引數,這將產生一個在FloydHub上的/output絕對路徑。

因為在接下來在FloudHub工作中,檢查點目錄在後面的工作中不能被裝載到/output中,該目錄將被保留,當試圖恢復模型時,會產生一個錯誤。

解決方法非常簡單。對於一個更復雜的專案,我建議新增一個可以在命令中設定的附加引數,你可以簡單地改變pix2pix.py中的第625行和725行:

例如,如果我要測試或匯出一個名為model-99200的模型,只需將checkpoint = tf.train.latest_checkpoint(a.checkpoint)與checkpoint = r’/model/model-99200’替換,然後確保將資料裝載在FloydHub上。

現在你應該能夠測試訓練過的模型了:

floyd run --gpu --data rayheberer/projects/burda-gan/6/output:/model 'python pix2pix.py --mode 
test --output_dir /output --input_dir test --checkpoint /model'

請注意值傳遞到–data和–checkpoint引數。另一個無需修改程式碼的快速解決方案是在執行推斷之前預先填充輸出目錄,並使用預先訓練過的檢查點。

floyd run --gpu --data rayheberer/projects/burda-gan/6/output:/model 'cp /model/* /output; 
python pix2pix.py --mode test --output_dir /output --input_dir test --checkpoint /model'

結果視覺化 成年男性的身材前後轉換影象的對映有多成功呢? 看下圖:

呵,不完全逼真的效果。但是考慮到我們只有不到150張訓練圖片,這些結果可能並不是那麼糟糕!我使用了兩種標準的資料擴充:隨機剪裁和水平反射。我們也將之前的影象與未反射的之後的影象進行了配對,反之亦然,但是我們沒有時間來測試這一改進的泛化是否僅僅是在反射和非反射影象之中相互配對的。這對於未來的專案來說是很有幫助的。

資料增強顯然改善了我們的結果——下面是一些使用增強資料(下行)訓練的模型,和沒有使用增強資料的模型(上行):

訓練這些模型可能還不夠讓它們完全收斂,但結果卻很吸引人。我認為這些低保真生成的影象是一個像樣的概念驗證,生成對抗網路可以使用更大的資料集來進行商業應用。