【问题标题】:Tensorflow example for Android适用于 Android 的 TensorFlow 示例
【发布时间】:2016-11-27 16:28:11
【问题描述】:

Tensorflow 提供了这个 tutorial 作为在 Android 应用上使用 TensorFlow 的示例。

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

但我不知道从这里去哪里!我有一个 tensorflow 代码,可以根据训练数据计算准确性。

如何在我自己的 Android 应用中使用该模型。 tensorflow 描述并没有超出构建指令的范围。

请帮忙!

【问题讨论】:

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


    【解决方案1】:

    首先,您需要将模型保存到 .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 的基础知识很有帮助。

    【讨论】:

      【解决方案2】:

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

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

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

      有关更多信息,请查看this blog post,我在其中写了如何执行此操作。

      【讨论】:

        【解决方案3】:

        构建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,你可以直接从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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-08-25
          • 2012-04-28
          • 1970-01-01
          • 1970-01-01
          • 2015-03-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多