gpt4 book ai didi

android - 在 Android 上运行 TensorFlow 模型

转载 作者:IT老高 更新时间:2023-10-28 23:13:05 35 4
gpt4 key购买 nike

我正在尝试找出在 Android 上训练和部署 Tensorflow 模型的工作流程。我知道 StackOverflow 上与此类似的其他问题,但它们似乎都没有解决我遇到的问题。

在研究了 Tensorflow 存储库中的 Android 示例后,我认为工作流应该是这样的:

  1. 在 Python 中构建和训练 Tensorflow 模型。
  2. 创建一个新图,并将所有相关节点(即不是负责训练的节点)转移到这个新图上。经过训练的权重变量作为常量导入,以便 C++ API 可以读取它们。
  3. 用 Java 开发 Android GUI,使用 native 关键字来 stub 对 Tensorflow 模型的调用。
  4. 运行 javah 为 Tensorflow 原生调用生成 C/C++ stub 代码。
  5. 使用 Tensorflow C++ API 填充 stub ,以读入和访问经过训练/序列化的模型。
  6. 使用 Bazel 构建 Java 应用、原生 Tensorflow 接口(interface)(作为 .so 文件)并生成 APK。
  7. 使用 adb 部署 APK。

    第 6 步是问题所在。 Bazel 将愉快地编译一个 native (针对 OSX).dylib,我可以通过 JNI 从 Java 调用它。同样,Android Studio 会生成一大堆 XML 代码来制作我想要的 GUI。但是,Bazel 希望所有 java 应用程序代码都位于“WORKSPACE”顶级目录中(在 Tensorflow 存储库中),并且 Android Studio 立即从 SDK 链接到各种外部库以制作 GUI(我知道是因为我的Bazel 编译运行在找不到这些资源时失败)。我能找到强制 Bazel 交叉编译 .so 文件的唯一方法是使其成为 Android 规则的依赖规则。直接交叉编译原生库是我更喜欢移植我的 A.S. Bazel 项目的代码。

    我该如何平方? Bazel 应该会编译 Android 代码,但 Android Studio 会生成 Bazel 无法编译的代码。来自 Google 的所有示例都只是为您提供了来自 repo 的代码,而没有任何关于它是如何生成的线索的。据我所知,作为 Android Studio 应用程序一部分的 XML 应该是生成的,而不是手工制作的。如果可以手工制作,我如何避免对所有这些外部库的需要?

    也许我的工作流程有误,或者我不理解 Bazel/Android Studio 的某些方面。任何帮助表示赞赏。

谢谢!

编辑:

我最终做的几件事可能有助于图书馆的成功 build :

  1. 我升级到了最新的 Bazel。
  2. 我从源代码重建了 TensorFlow。
  3. 我在下面实现了推荐的 Bazel BUILD 文件,并添加了一些内容(取自 Android 示例):

    cc_binary(
    name = "libName.so",
    srcs = ["org_tensorflowtest_MyActivity.cc",
    "org_tensorflowtest_MyActivity.h",
    "jni.h",
    "jni_md.h",
    ":libpthread.so"],
    deps = ["//tensorflow/core:android_tensorflow_lib",
    ],
    copts = [
    "-std=c++11",
    "-mfpu=neon",
    "-O2",
    ],
    linkopts = ["-llog -landroid -lm"],
    linkstatic = 1,
    linkshared = 1,
    )

    cc_binary(
    name = "libpthread.so",
    srcs = [],
    linkopts = ["-shared"],
    tags = [
    "manual",
    "notap",
    ],
    )

我还没有验证这个库是否可以在 Android 中加载和使用; Android Studio 1.5 似乎对承认原生库的存在非常挑剔。

最佳答案

在您的 WORKSPACE 文件中设置 Android NDK 后,Bazel 可以为 Android 交叉编译 .so,如下所示:

cc_binary(
name = "libfoo.so",
srcs = ["foo.cc"],
deps = [":bar"],
linkstatic = 1,
linkshared = 1,
)

$ bazel build foo:libfoo.so \
--crosstool_top=//external:android/crosstool --cpu=armeabi-v7a \
--host_crosstool_top=@bazel_tools//tools/cpp:toolchain
$ file bazel-bin/foo/libfoo.so
bazel-bin/foo/libfoo.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), not stripped

Bazel wants all of the java app code to be inside the 'WORKSPACE' top-level directory (in the Tensorflow repo)

当 0.1.4 发布(现在正在推送)并且我们已经向 TensorFlow 和 Protobuf 推送了一些修复时,您可以开始将 TensorFlow 存储库用作远程存储库。在 WORKSPACE 文件中进行设置后,您可以使用 @tensorflow//foo/bar 标签引用 TensorFlow 规则。

关于android - 在 Android 上运行 TensorFlow 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34889605/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com