TensorFlow Lite编译Android so库

工作中最近用到了Google TensorFlow技术,Android端对相机预览图进行预处理,并加载tflite模型并推测运行结果。期间需要用到lite的so库等相关sdk,并自己实践编译了一下。
通过编译tensorflow源码生成tensorflowlite.jar 和 libtensorflowlite_jni.so库。

一、tensorflow源码

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

二、编译环境和工具

1、Bazel编译工具:https://docs.bazel.build/versions/master/install-ubuntu.html.
官网有详细介绍如何在Ubuntu下载和安装Bazel流程,按照步骤操作即可。

2、Python 3,tensorflow configure需要用到Python。

3、OpenJDK 11(与Ubuntu 18.04.5需对应)

4、Android NDK & CMake:可直接在Android Studio的SDK Manager中直接勾选并下载NDK,、CMake、SDK Build-Tools工具。

三、编译过程

tensorflow源码中包括很多目录,我们只需关注编译tensorflow lite即可。
进到tensorflow-master源码根目录输入命令 ./configure后会弹出一系列选项提示去选择y/N,
比如Python安装目录,是否支持CUDA等。一般选择N或者填入default选项。
当提示是否希望为Android 构建交互配置 ./WORKSPACE的时候需要则输入y

Would you like to interactively configure ./WORKSPACE for Android builds? [y/N]: y

后面根据自己本地实际情况选择Android NDK和SDK版本就好。
最后configure完成如下:
在这里插入图片描述
当显示Configuration finished后就可以使用Bazel编译了,在tensorflow-maste根目录下输入如下命令:

bazel build -c opt --fat_apk_cpu=arm64-v8a,armeabi-v7a --host_crosstool_top=@bazel_tools//tools/cpp:toolchain //tensorflow/lite/java:tensorflow-lite

编译没有错误后生成包的路径如下:
/home/liuke/Project/tensorflow-master/bazel-bin/tensorflow/lite/java下的tensorflow-lite.aar

解压出来就能看到与平台相关的libtensorflowlite_jni.so库了
在这里插入图片描述

四、编译总结

1、运行./configure后No module named ‘numpy’,因为我本地同时安装了python2(已安装numpy)和python3,针对python3可通过命令sudo apt-get install python3-numpy特定安装。
在这里插入图片描述
2、Bazel requires Android build tools version 30.0.0 or newer, 29.0.0 was provided
Bazel版本需要和Android build tools版本对应,尽量适配最新的版本来容错。
同时jdk版本也要对应,比如Bazel所使用的jdk版本要和Ubuntu系统版本对应。

3、missing input file ‘external/androidsdk/build-tools/31.0.0/lib/dx.jar’
最新的build tools版本默认没有了dx.jar,然后我就从较低版本的29.0.0的build tools拷贝该jar到31.0.0对应路径。重新configure后编译即可。

4、若还有其它Tensorflow for Android的库需要用到工程的,可以参考官方文档:
Build TensorFlow Lite for Android.
Build TensorFlow Lite with CMake.

猜你喜欢

转载自blog.csdn.net/qq_23069607/article/details/122668174