手把手教你搭建能夠實現 Prisma 風格遷移效果的 iOS 酷炫應用

 2018-07-25 10:55:00.0

本文原標題 Transforming Pictures with Neural Style Transfer in iOS,作者爲 Navdeep Singh。

翻譯 | 廖明月  吳桐  蔡雨萌    整理 |  凡江

隨着 2012 年深度神經網絡在 ImageNetchallenge 比賽上以 AlexNet 模型獲勝,深度神經網絡開創了空前的高潮。AI 工程師已經將深度學習技術應用到越來越多的問題域,包括預訓練的深度美國有線電視新聞網模型。還有什麼比創造藝術更富有創造力呢?

一種已經提出並實施的想法,稱爲「神經風格轉換」,允許你能夠利用預訓練的深度神經網絡模型,並將某一圖像的風格,例如或梵高或莫尼特的任何傑作,遷移到另一個圖像,例如你的個人資料圖片或你最喜歡的小狗的圖片,從而創造了一個混合你的圖片內容和名作風格的圖像。

實際上有一個 iOS 應用程序稱爲 Prisma,它贏得了 2016 年度最佳應用程序,就是這樣,它在短短几秒鐘內,可以將你的圖片轉換成你所選擇的任何風格。

在本文中,您將瞭解如何訓練一個快速的神經風格遷移模型,並在自己的 iOS 上使用,實現 Prisma 可以做到的事情。

快速神經遷移模型的訓練

在這一節中,按照以下步驟學習如何利用 TensorFlow 使用快速神經風格轉移算法來訓練模型:

1. 在你的 Mac 終端或者最好是有着 GPU 驅動的 Ubuntu 上,運行 git clone 命令,複製鏈接 this Github repo,這是約翰遜快速風格遷移的一個很好的 TensorFlow 實現的分支,修改後經過訓練的模型允許在 iOS 或 Android 應用程序中使用。

2. 運行 cd 命令 進入快速風格遷移目錄,然後運行 setup.sh 腳本來下載預訓練的 VGG-19 模型文件以及 MS COCO 訓練數據集。

3. 運行以下命令,使用風格圖像 starry_night.jpg 和內容圖像 WW1.jPG,通過訓練創建檢查點文件:

手把手教你搭建能夠實現 Prisma 風格遷移效果的 iOS 酷炫應用

在圖像目錄中還有一些其他風格的圖像,你可以以此用來創建不同的檢查點文件。這裏使用的 starry_night.jpg 風格圖像是梵高的一幅名畫:

手把手教你搭建能夠實現 Prisma 風格遷移效果的 iOS 酷炫應用

使用梵高的畫作作爲風格圖片

在 NVIDIA GTX 1070 GPU 驅動的 Ubuntu 下整個訓練需要大約五小時,當然在如果在 CPU 上會花更長的時間。

4. 用文本編輯器打開 evaluate.py 文件,並將以下兩行代碼取消批註(第 158 和 159 行):

手把手教你搭建能夠實現 Prisma 風格遷移效果的 iOS 酷炫應用

5. 運行以下命令建立一個新的檢查點,輸入圖像命名爲 img_placeholder,轉移後的圖像命名爲 preds:

手把手教你搭建能夠實現 Prisma 風格遷移效果的 iOS 酷炫應用

6. 運行以下命令創建一個 TensorFlow 圖文件並載入檢查點中的權重參數,這將創建一個約 6.7MB 的大小 .pb 文件:

手把手教你搭建能夠實現 Prisma 風格遷移效果的 iOS 酷炫應用

7. 假設你已擁有一個 /ft.file 目錄,將生成的 st_frozen.pb 文件複製到 /ft.file 目錄下,直接 cd 進入你的 TensorFlow 源代碼根目錄,如 ~/tensorflow-1.4.0,然後運行以下命令創建爲 .pb 文件生成一個量化模型。

手把手教你搭建能夠實現 Prisma 風格遷移效果的 iOS 酷炫應用

這將把固化圖文件的大小從 6.7 MB 縮減到 1.7 MB,它意味着如果你在 App 中爲 50 個不同的風格載入了 50 個模型,增加的大小將會是 85 MB。

以上就是利用一張風格圖像和輸入圖像訓練和量化一個快速神經風格遷移模型的全部步驟。你可以在 test_dir 目錄下檢查步驟三中生成的圖像,看一看風格遷移的效果。如果需要的話,你還可以試着玩一玩含超參數的模型,看一看那些不同的,很可能更好的風格遷移效果。代碼文件提供在 https://github.com/jeffxtang/fast-style-transfer/blob/master/docs.md#style 上。

一個重要提示:當你在你的 iOS 或者 Android app 上使用這些模型之前,需要記錄下輸入圖像的精確寬度和高度值作爲步驟五中 --in-path 的參數,iOS 或 Android 的代碼將會調用圖像的寬度和高度值(你很快就會看到是如何調用的),否則當你在 App 上運行這些模型的時候將會得到 Conv2DCustomBackpropInput: Size of out_backprop doesn't match computed 的錯誤提示。


在 iOS 系統上添加和測試神經風格遷移模型

第一件事是手動建立 TensorFlow 庫,如果你此前尚未安裝過這個庫。然後執行以下步驟就可以在你的 iOS App 上獲取 TensorFlow 支持和並添加神經風格遷移模型,並試運行你的 App。

  1. 如果你已經擁有了一個添加了 TensorFlow 手冊庫的 iOS app,可以跳過下面這一步。否則,創建一個新的基於 Objective-C 語言的 iOS app,比如可以命名它爲 NeuralStyleTransfer,或者在已經存在的 app 中,在 PROJECT 下的 Build Settings 配置中創建一個新的自定義設置,名稱是 TENSORFLOW_ROOT,值爲 $HOME/tensorflow-1.4.0,假定上面是你 TensorFlow 1.4.0 的安裝地址。然後在 TARGET 下的 Build Settings 配置中將 Other Linker Flags 設置如下:

手把手教你搭建能夠實現 Prisma 風格遷移效果的 iOS 酷炫應用

然後將 Header Search Paths 設置如下:

手把手教你搭建能夠實現 Prisma 風格遷移效果的 iOS 酷炫應用

2. 將 fst_frozen_quantized.pb 文件和幾個測試所用圖片拖放到你的工程文件夾中,在 https://github.com/PacktPublishing/Intelligent-Mobile-Projects-with-TensorFlow/tree/master/ch4/ios/NeuralStyleTransfer 中的 NeuralStyleTransfer app 文件夾中找到相同的 ios_image_load.mm 和 .h 文件,把它們複製到工程文件夾下。

3. 將 ViewController.m 文件重命名爲 ViewController.mm,把它和原 ViewController.h 文件替換爲從上面的 GitHub 網址鏈接獲取中的 ViewController.h 和 .mm 文件。

4. 在 iOS 模擬器中或者你的 iOS 設備中運行 App,你會看到一個狗圖片:

手把手教你搭建能夠實現 Prisma 風格遷移效果的 iOS 酷炫應用

5. 點擊選擇 Fast Style Transfer 選項,過幾秒鐘,你會看到一個帶有 starry night 風格的新圖片。

手把手教你搭建能夠實現 Prisma 風格遷移效果的 iOS 酷炫應用

你可以很簡單的通過選擇你最喜歡的圖片作爲風格圖片然後跟隨之前的步驟編譯帶有不同風格的其他模型。然後可以按照這段的步驟在你的 IOSapp 中使用模型。這裏有使用 IOS 的詳細代碼。

使用快速神經遷移模型回顧 iOS 代碼

在 ViewController.mm 中包含許多重要的代碼片斷它在輸入圖片的預處理和轉移圖片的後處理中是獨特的。

1. 兩個常量,wanted_width,wanted_height,作爲圖片的高度和寬度定義爲相同的值,這裏的圖片就是步驟 5 中的 dog.jpg:

手把手教你搭建能夠實現 Prisma 風格遷移效果的 iOS 酷炫應用

2. iOS 的 dispatch 隊列是用來在 non-UI 線程加載和運行你的快速神經遷移模型並且在風格遷移後圖片生成了,以下爲將圖片發送到 UI 線程的代碼:

手把手教你搭建能夠實現 Prisma 風格遷移效果的 iOS 酷炫應用

3. 定義浮點型 3 維張量用於轉換輸入圖片:

手把手教你搭建能夠實現 Prisma 風格遷移效果的 iOS 酷炫應用

4. 發送到 tensorflow Sess->Run 方法中的輸入節點名和輸出節點名與訓練模型的時候是相同的 :

手把手教你搭建能夠實現 Prisma 風格遷移效果的 iOS 酷炫應用

5. 當模型運行完成並且返回輸出張量 (包含 0 到 255 的 RGB 值) 時,你需要調用 tensorToUIImage 通用函數把張量數據轉換爲 RGB buffer:

手把手教你搭建能夠實現 Prisma 風格遷移效果的 iOS 酷炫應用

6. 現在,你可以把 buffer 轉化成 UIImage 實例在調整它的大小之前,以下爲代碼:

手把手教你搭建能夠實現 Prisma 風格遷移效果的 iOS 酷炫應用

如果你對這個主題感興趣,你可以使用 Jeff Tange 的書來研究更多的深度學習和強化學習 app。這本書包括超過 10 種 iOS,android 和 raspberry pi app 使用 tensorflow 來運行,使用 scratch 進行編譯,離線運行所有絢麗的 tensorflow 模型:從計算機視覺,語音合成到生成對抗網絡和類似於 Alphazero 的深度強化學習模型。

原文鏈接:https://medium.com/@navdeepsingh_2336/transforming-pictures-with-neural-style-transfer-in-ios-6988b79b34ee


文章來源:雷鋒網