【问题标题】:Using tensorflow on Android NDK side directly (Not using JAVA api)直接在 Android NDK 端使用 tensorflow(不使用 JAVA api)
【发布时间】:2017-05-25 08:09:46
【问题描述】:

我正在尝试使用 C++ 在 Android 上运行神经网络。示例 (https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/androidhttps://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/android) 展示了如何使用使用 JNI 函数调用 C++ 的 JAVA api 使用 tensorflow。有没有人尝试在 Android 上的 C++ 中直接使用 tensorflow?如何构建和链接 tensorflow 库以在 Android 上使用 C++ api。你能指导我吗?我想以与 iOS 示例中类似的方式在 Android 上使用 C++ api。

【问题讨论】:

    标签: android c++ tensorflow android-ndk


    【解决方案1】:

    这是我解决这个问题的方法。虽然没有太多关于在 android 上使用 c++ api 以及编译和链接 tensorflow 到 NDK 的文档,但 makefile 有重要的 cmets 以及相关的脚本。编译步骤与ios非常相似。

    1. 安装以下依赖项 a)autoconf b) automake c)automake。然后运行 ​​tensorflow/contrib/makefile/download_dependencies.sh;我第一次在 2017 年 5 月 10 日的存储库上运行,当时它运行良好。在 6 月 1 日左右的后期版本中,由于 tensorflow/workspace.bzl 的一些变化,我不明白在 download_dependencies.sh 中无法识别 download_dependencies 正在尝试下载的 tar 文件。我刚刚从 5 月 10 日的 repo 提交中替换了 workspace.bzl。
    2. 第2步是像这样运行tensorflow/contrib/makefile/compile_android_protobuf.sh

      NDK_ROOT=absolute/path/to/ndk/folder ./tensorflow/contrib/makefile/compile_android_protobuf.sh

    3. 运行make。但首先您可能需要在 Makefile 中进行一些更改。将 -fPIE 标志替换为 -fPIC 标志。还将 -fPIC 标志添加到 HOST_CXXFLAGS。然后像这样运行make:

      make -f tensorflow/contrib/makefile/Makefile TARGET=ANDROID NDK_ROOT=absolute/path/to/ndk/folder

      或者,也可以运行 build_all_android.sh,它可以一次性运行所有 3 个步骤,但您可能需要对标志进行 Makefile 更改。

    这生成了 tensorflow/contrib/makefile/gen/protobuf/lib/libprotobuf.a 和 tensorflow/contrib/makefile/gen/lib/libtensorflow-core.a;这可以链接到 LOCAL_LDLIBS 下 Android.mk 文件中的 Android NDK 项目。应该在 Android.mk 文件中的 LOCAL_CFLAGS 和 Application.mk 文件中的 APP_STL := gnustl_shared 中使用这些链接标志-Wl,--build-id -Wl,--allow-multiple-definition -Wl,--whole-archive 以及 -std=c++11。

    这应该足以构建您的 NDK 项目的共享库。

    【讨论】:

    • 知道如何使用 CMake 在新的 Android 中使用它吗?我尝试了很多东西,但无法将 C++ tensorflow 调用与 android NDK C++ 代码一起使用。
    • 你好,build_all_android.sh 是构建 tensorflow 推理,这是一个旧版本,关于使用 ndk build 构建 tensflow lite 的任何想法。
    【解决方案2】:

    100% 可能,但有一点警告......

    Android 的大部分 UI 都是用 Java 完成的。您可以创建一个native activity,但要获得任何输出到屏幕,您需要使用 OpenGL(它没有所有漂亮的 Android UI 视图),或者您需要转换 JNI 屏障以获取数据输出tofrom 向用户显示的本机代码。

    取决于您对 OpenGLES、EGL 等的熟悉程度。您可能会选择转换 JNI 屏障而不是创建 native_activity,但横截面要小得多。

    您可以创建一个 Runnable 并在有工作要执行时发出信号。使用并发队列(在 Java 中)来提交工作,并使用另一个(并发)队列来接收结果。 Runnable 弹出工作队列,调用单个 JNI/C 函数来提交工作并返回 JSON 字符串。然后它将工作提交到完成队列。

    【讨论】:

    • 如果我的问题不清楚,我很抱歉。我根本不关心 UI 部分。我无论如何都会通过 JNI 传递数据来处理。我的问题是关于如何为 android 构建 tensorflow 并将其包含在 android 项目中以在 Android 应用程序的 C++ 端调用 tensorflow api。我在 C++ 端有图像缓冲区,我想通过神经网络运行而不将其发送到 JAVA。
    猜你喜欢
    • 2011-01-14
    • 2017-09-17
    • 2012-09-22
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多