tensorflow C++ API封装以及tensorflow安卓可用动态库编译
为了简单起见,我们首先通过网上的方法对tensorflow原始的c++接口进行封装,只暴露出两个接口。
初始化接口:InitTensorflowModel
图运行接口:RunTensorflowModel
步骤如下:
1、在github上下载https://github.com/leeor-langer/Tensorflow-Android-Cpp(主要根据这个库编译之后可能对一些模型会有错误,本系列文章会解决)
2、下载后解压重命名为tfwld,把这个tfwld文件夹复制到tensorflow源码目录/tensorflow/tensorflow/tools/下。
3、tensorflow1.13版本,但经过作者的实验,1.9本版会有比较多坑,比如如下两个issue:
1)https://github.com/tensorflow/tensorflow/issues/16502
2)https://github.com/tensorflow/tensorflow/issues/13651
4、解压tensorflow源码后,进入tensorflow目录,在第一级目录terminal下输入:
./configure
这时会让你选择python

请输入你安装好的anaconda的python环境(比如/root/anaconda3/env/python/bin/python),因为默认的python环境有可能是python2。
接下来以下这条输入-march=armv7-a,其它都选择N

5、修改/tensorflow/目录下的WORKSPACE文件:
在WORKSPACE最后加上:
android_sdk_repository(
name = "androidsdk",
api_level = 24,
build_tools_version = "27.0.3",
# Replace with path to Android SDK on your system
path = "/mnt/e/crnncpp/android-sdk-linux"##你的sdk目录
)
##这里注意最好选ndk-r15c或ndk-r14b,这两个版本是经过作者实验的
##特别注意ndk-r16是坑
android_ndk_repository(
name = "androidndk",
path = "/mnt/e/crnncpp/android-ndk-r15c",##你的ndk目录
api_level = 24
)
6、在/tensorflow目录terminal下输入:
cpu也可以选择arm64-v8a,但arm64-v8a是兼容armeabi-v7a的,用arm64-v8a编译的包会比armeabi-v7a的so包大10M左右,所以这里选择armeabi-v7a
bazel build -c opt --copt="-fPIC" --cxxopt='-std=c++11' --crosstool_top=//external:android/crosstool --cpu=armeabi-v7a --host_crosstool_top=@bazel_tools//tools/cpp:toolchain --config monolithic tensorflow/tools/tfwld:libTensorflowInference.so
编译pc端的so库:
编译pc端的so库由于我们使用的是linux编译,所以需要修改tfwld中的代码,把其中的.cc和.h文件中的__windows替换成linux
,然后使用如下脚本编译:
bazel build -c opt --copt="-fPIC" --cxxopt='-std=c++11' tensorflow/tools/tfwld:libTensorflowInference.so --verbose_failures
7、大改经过30到60分钟会编译好,现在在/tensorflow/bazel-bin/tensorflow/tools/tfwld/目录下会有libTensorflowInference.so文件生成
动态库编译好,如果有root的手机,只需要把动态库放入手机的system/lib下就可以使用了。
网友评论