之前就看到Tensorflow
有手機平臺的API
了,今天終於抽了點時間出來鼓搗一下。
首先是把tensorflow
克隆到本地一份。
git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git
既然是谷歌官方要求的,最好把--recurse-submodules
加上,文檔說可以避免一些數據結構序列化時的編譯問題。
準備編譯
1.安裝bazel
bazel
是谷歌自己的構建工具。tensorflow
只能部分支持cmake
或者gradle
,而bazel
是tensorflow
工程的主要構建工具。
Mac和Linux用戶根據文檔進行安裝。Windows用戶,按照官方建議到下面的鏈接下載demo的二apk文件,目前bazel在windows平臺還處於試驗階段。
bazel
安裝成功與否,用bazel version
檢查版本即可。
2.下載NDK
最好下載r12b
版本的,最新的r13b
可能與bazel
有兼容問題。
下載完成後解壓到自定義目錄,然後在~/.bash_profile
(linux
在~/.bashrc
)下添加環境變量。環境變量的添加過程大家百度一下吧,不是這裏的重點。
3.下載>=23 Android SDK
Tensorflow Android Demo
必須在大於等於23
的API
環境中編譯。可以打開Android Studio
中的SDK Manager
來安裝最新的SDK
。
4. 編輯Tensorflow根目錄下的WORKSPACE文件
回到tensorflow
根目錄,(當前在android
目錄就往上兩級)。打開WORKSPACE
文件。
在文件開頭部分找到
# Uncomment and update the paths in these entries to build the Android demo.
#android_sdk_repository(
# name = "androidsdk",
# api_level = 23,
# # Ensure that you have the build_tools_version below installed in the
# # SDK manager as it updates periodically.
# build_tools_version = "25.0.2",
# # Replace with path to Android SDK on your system
# path = "/path/to/your/sdk",
#)
# Android NDK r12b is recommended (higher may cause issues with Bazel)
#android_ndk_repository(
# name="androidndk",
# path="/path/to/your/ndk",
# # This needs to be 14 or higher to compile TensorFlow.
# # Note that the NDK version is not the API level.
# api_level=14)
這兩部分定義了SDK
和NDK
的路徑,把/path/to/your
的部分改成系統相應的路徑。然後將每一行前的註釋去掉。如下:
# Uncomment and update the paths in these entries to build the Android demo.
android_sdk_repository(
name = "androidsdk",
api_level = 23,
# Ensure that you have the build_tools_version below installed in the
# SDK manager as it updates periodically.
build_tools_version = "25.0.2",
# Replace with path to Android SDK on your system
path = "/Users/XXX/Library/Android/sdk",
)
#
# Android NDK r12b is recommended (higher may cause issues with Bazel)
android_ndk_repository(
name="androidndk",
path="/usr/local/lib/android-ndk-r12b",
# This needs to be 14 or higher to compile TensorFlow.
# Note that the NDK version is not the API level.
api_level=14)
開始編譯
在tansorflow
根目錄執行,
bazel build -c opt //tensorflow/examples/android:tensorflow_demo
進行編譯,變異過程如下:
一切順利的話,編譯成功,如下圖:
安裝APK DEMO
變異成功之後bazel
會在bazel-bin
目錄下面生成apk
文件。用數據線連上手機,執行
adb install -r bazel-bin/tensorflow/examples/android/tensorflow_demo.apk
即可安裝到手機。
DEMO截圖
TF Classify
圖片分類的Demo。可以看到tf識別出了臺式電腦和顯示器。
TF Stylize
這個Demo很好玩,不只是將一張圖片的風格渲染到攝像頭,還能通過調節來綜合兩張圖片的風格。
點擊左上角的數字按鈕,可以從
128
一直選到720
。剛開始以爲這個數值跟訓練過程中的神經元數量有關。後來想想這些模型應該都是訓練好了的,移動平臺還沒有能力進行這樣的訓練。看源碼得知這個就是最終呈現的圖片的尺寸,越高圖片越清晰。但是相應的,對手機性能的要求就越高。我在魅族pro 6 plus上測試,選擇256
之後,就開始卡頓的厲害,720
的話,定在一個點上大概5-7
秒才能看到渲染之後的圖像。
總結
市面上已經有很多運用深度學習的應用的例子。但是大多數都是隻能讓用戶使用已經訓練好的模型,而無法讓用戶自定義。比如我想用我自己喜歡的兩張圖片作爲風格,來渲染視頻,而不是圖庫中已有的。受限於移動平臺自身的計算能力,目前還做不到;而把計算放到雲端,用戶體驗又太差(prizma網絡不好的時候要等很久,還可能失敗…)。
期待用量子計算機來做深度計算哈哈哈~