TensorFlow 提供了本教程作为在 Android 应用程序上使用 TensorFlow 的示例。
我已经成功构建了应用程序并在我的设备上启动了它。我也阅读了代码。
但我不知道从这里去哪里!我有一个 tensorflow 代码,可以根据训练数据计算准确性。
如何在我自己的 android 应用程序中使用该模型。tensorflow 描述并没有超出构建指令的范围。
请帮忙!
TensorFlow 提供了本教程作为在 Android 应用程序上使用 TensorFlow 的示例。
我已经成功构建了应用程序并在我的设备上启动了它。我也阅读了代码。
但我不知道从这里去哪里!我有一个 tensorflow 代码,可以根据训练数据计算准确性。
如何在我自己的 android 应用程序中使用该模型。tensorflow 描述并没有超出构建指令的范围。
请帮忙!
首先,您需要将模型保存到 .pb(protobuf) 文件中。在您的应用程序中,您需要加载此 .pb 文件。你可以用tf/python/tools freeze_graph.freeze_graph()
您还需要包含所有 c++ 实现的 libtensorflow_inference.so。
最后,您将需要 libandroid_tensorflow_inference_java.jar。
有了这些,你就可以写:
inferenceInterface.initializeTensorFlow(getAssets(), MODEL_FILE);
inferenceInterface.fillNodeFloat(INPUT_NODE, INPUT_SIZE, inputFloats);
inferenceInterface.runInference(new String[] {OUTPUT_NODE});
inferenceInterface.readNodeFloat(OUTPUT_NODE, resu);
这里有一个很棒的教程:https ://omid.al/posts/2017-02-20-Tutorial-Build-Your-First-Tensorflow-Android-App.html
该应用程序的 GitHub 存储库:https ://github.com/omimo/TFDroid
对我来说,这有助于理解 tf 在 Android 上的基础知识。
构建 TensorFlow for Android 的完整详细方法
git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git
注意: --recurse-submodules 对于拉取子模块很重要。
从这里安装 Bazel。Bazel 是 TensorFlow 的主要构建系统。现在,编辑 WORKSPACE,我们可以在之前克隆的 TensorFlow 的根目录中找到 WORKSPACE 文件。
# Uncomment and update the paths in these entries to build the Android demo.
#android_sdk_repository(
# name = "androidsdk",
# api_level = 23,
# build_tools_version = "25.0.1",
# # Replace with path to Android SDK on your system
# path = "<PATH_TO_SDK>",
#)
#
#android_ndk_repository(
# name="androidndk",
# path="<PATH_TO_NDK>",
# api_level=14)
如下所示,我们的 sdk 和 ndk 路径:
android_sdk_repository(
name = "androidsdk",
api_level = 23,
build_tools_version = "25.0.1",
# Replace with path to Android SDK on your system
path = "/Users/amitshekhar/Library/Android/sdk/",
)
android_ndk_repository(
name="androidndk",
path="/Users/amitshekhar/Downloads/android-ndk-r13/",
api_level=14)
然后构建 .so 文件。
bazel build -c opt //tensorflow/contrib/android:libtensorflow_inference.so \
--crosstool_top=//external:android/crosstool \
--host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
--cpu=armeabi-v7a
用我们想要的目标架构替换 armeabi-v7a。图书馆将位于:
bazel-bin/tensorflow/contrib/android/libtensorflow_inference.so
要构建 Java 对应项:
bazel build //tensorflow/contrib/android:android_tensorflow_inference_java
我们可以在以下位置找到 JAR 文件:
bazel-bin/tensorflow/contrib/android/libandroid_tensorflow_inference_java.jar
现在我们有 jar 和 .so 文件。我已经构建了 .so 文件和 jar,您可以直接从项目中使用。
将 libandroid_tensorflow_inference_java.jar 放在 libs 文件夹中,然后右键单击并添加为库。
compile files('libs/libandroid_tensorflow_inference_java.jar')
在主目录中创建 jniLibs 文件夹,并将 libtensorflow_inference.so 放入 jniLibs/armeabi-v7a/ 文件夹中。
现在,我们将能够调用 TensorFlow Java API。
TensorFlow Java API 通过类 TensorFlowInferenceInterface 公开了所有必需的方法。
现在,我们必须使用模型路径调用 TensorFlow Java API 并加载它。
我在这里写了一个完整的博客。
有一些很好的教程可以指导您完成这些步骤。
假设我们正在讨论图像分类问题,您应该只需要:
strip_unused
(使其与 Android 演示应用程序兼容)。.pb
模型和.txt
新标签复制到 Androidassets
文件夹中。有关更多信息,请查看我写了如何执行此操作的这篇博客文章。