之前就看到Tensorflow
有手机平台的API
了,今天终于抽了点时间出来鼓捣一下。
首先是把tensorflow
克隆到本地一份。
git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git
既然是谷歌官方要求的,最好把--recurse-submodules
加上,文档说可以避免一些数据结构序列化时的编译问题。
1c8b: 准备编译
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)
1c8c: 开始编译
在tansorflow
根目录执行,
bazel build -c opt //tensorflow/examples/android:tensorflow_demo
进行编译,编译过程如下:
一切顺利的话,编译成功,如下图:
1c8d: 安装APK DEMO
变异成功之后bazel
会在bazel-bin
目录下面生成apk
文件。用数据线连上手机,执行
adb install -r bazel-bin/tensorflow/examples/android/tensorflow_demo.apk
即可安装到手机。
1c8e: DEMO截图
-
TF Classify
图片分类的Demo。可以看到tf识别出了台式电脑和显示器。
-
TF Stylize
这个Demo很好玩,不只是将一张图片的风格渲染到摄像头,还能通过调节来综合两张图片的风格。
点击左上角的数字按钮,可以从
128
一直选到720
。刚开始以为这个数值跟训练过程中的神经元数量有关。后来想想这些模型应该都是训练好了的,移动平台还没有能力进行这样的训练。看源码得知这个就是最终呈现的图片的尺寸,越高图片越清晰。但是相应的,对手机性能的要求就越高。我在魅族pro 6 plus上测试,选择256
之后,就开始卡顿的厉害,720
的话,定在一个点上大概5-7
秒才能看到渲染之后的图像。
1c8f: 总结
市面上已经有很多运用深度学习的应用的例子。但是大多数都是只能让用户使用已经训练好的模型,而无法让用户自定义。比如我想用我自己喜欢的两张图片作为风格,来渲染视频,而不是图库中已有的。受限于移动平台自身的计算能力,目前还做不到;而把计算放到云端,用户体验又太差(prizma网络不好的时候要等很久,还可能失败...)。
期待用量子计算机来做深度计算哈哈哈~