适用于Android的Tensorflow示例

时间:2016-11-27 16:28:11

标签: android python-2.7 machine-learning tensorflow tensorflow-serving

Tensorflow提供了此tutorial作为在Android应用上使用tensorflow的示例。

我已经成功构建了应用并在我的设备上启动了它。我也读了这段代码。

但我无法弄清楚从哪里开始!我有一个张量流代码,可根据训练数据计算准确度。

如何在我自己的Android应用中使用该模型。张量流描述不会超出构建指令。

请帮忙!

3 个答案:

答案 0 :(得分:3)

首先,您需要将模型保存为.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

对我来说,这有助于理解Android上的tf基础知识。

答案 1 :(得分:0)

有一些很好的教程可以引导您完成这些步骤。

假设我们正在讨论图像分类问题,您应该只需要:

  • 使用strip_unused工具处理您的TensorFlow模型(使其与Android演示应用兼容)。
  • 将已剥离的TensorFlow .pb模型和.txt新标签复制到Android assets文件夹中。
  • 再次构建Android演示应用。

有关详细信息,请查看this blog post我写过如何执行此操作的内容。

答案 2 :(得分:0)

为Android构建TensorFlow的完整详细方法

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,你可以直接使用project

将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并加载它。

我写了一篇完整的博客here