tensorflow源码编译tensorflowlite.so

在android端通过C++调用tflite,不直接通过java调用,这时需要通过编译tensorflow的源码编译生成tflite的so库,下面介绍编译的详细过程

1.下载tensorflow源码

git clone https://github.com/tensorflow/tensorflow.git

注意版本,为了与模型使用的代码相匹配,我使用的是tensorflow=r1.13

进入tensorflow-r1.13目录,进行configure,在命令行运行:

./configure

由于这一步相关的配置较多,不知道含义的都直接使用默认的选项,直接回车键即可,但是python的路径必须要指定

配置完毕后,你还需要在该目录下的WORKSPACE文件中添加ndk的环境,直接在文件的末尾加入如下参数即可,

android_ndk_repository(
    name = "androidndk", # Required. Name *must* be "androidndk".
    api_level = 23,
)

2. 下载NDK

   从google官网下载相应的版本NDK,我下载的是linux版本的ndk-r14b ,下载完后设置ndk环境变量:

export ANDROID_NDK_HOME='/data/xxx/tensorflow-r1.13/android-ndk-r14b'

3. 安装bazel

    可参考:https://docs.bazel.build/versions/master/install-ubuntu.html

通过下面命令下载,安装bazel

     wget bazel-0.21.0-installer-linux-x86_64.sh

    chmod  +x  bazel-0.21.0-installer-linux-x86_64.sh

    ./bazel-0.21.0-installer-linux-x86_64.sh --user

如果这个过程没有报错,就说明安装成功

4. 编译tflite库

 修改tensorflow/lite/BUILD的内容,在该文件的最后加上以下内容:

cc_binary(
name = "libtensorflowLite.so",

linkopts=["-shared", "-W"],
linkshared=1,

copts = tflite_copts(),
deps = [
    ":framework",
    "//tensorflow/lite/kernels:builtin_ops",
],

)

接下来进行编译,编译命令如下:

bazel build -c opt --crosstool_top=//external:android/crosstool              
--host_crosstool_top=@bazel_tools//tools/cpp:toolchain --cxxopt="-std=c++11" 
--fat_apk_cpu=armeabi-v7a --config=android_arm
--linkopt='s'
//tensorflow/lite:libtensorflowLite.so   

bazel对编译、链接的参数进行控制可参考:https://docs.bazel.build/versions/master/user-manual.html,比如链接时可通过参数--linkopt进行控制

注意: tensorflow/lite/BUILD中的name要和编译命令中的so库名(libtensorflowLite.so)一致

最后,提示successfully表示编译成功

编译好的模型libtensorflowlite.so会保存在/tensorflow/bazel-bin/tensorflow/lite文件夹中,下面我们开始配置依赖环境,进行C++业务代码的编写。

参考:https://zhuanlan.zhihu.com/p/71943778

https://stackoverflow.com/questions/49834875/problems-with-using-tensorflow-lite-c-api-in-android-studio-project


版权声明:本文为ab0902cd原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。