教程1:tensorflow lite 交叉编译和安装一
教程1:tensorflow lite 交叉编译和安装一
教程2:tensorflow lite 编译和安装二 使用bazel编译
教程3:tensorflow lite c++ 接口解读
教程4:TensorFlow2.0 label_image 的编译和使用
在嵌入式Linux上运行TensorFlow lite首先需要交叉编译 ,然后生成静态库。
tensoflowlite 自带minimal 这个小程序,编译成功后可以将这个小程序拷贝到目标板进行验证。这里用的时高通Linux开发板。
第一步下载TensorFlow;
git clone https://github.com/tensorflow/tensorflow Cloning into 'tensorflow'... remote: Enumerating objects: 743058, done. Receiving objects: 100% (743058/743058), 415.93 MiB | 148.00 KiB/s, done. Resolving deltas: 100% (600343/600343), done. Checking connectivity... done. (base) lid@lid-VirtualBox:~/tf2$ ls
这里我们编译TensorFlow2.0所以切换到2.0的分支上。
(base) lid@lid-VirtualBox:~/tf2/tensorflow$ git checkout r2.0 Branch r2.0 set up to track remote branch r2.0 from origin. Switched to a new branch 'r2.0' (base) lid@lid-VirtualBox:~/tf2/tensorflow$ git branch -a master r1.12 * r2.0 remotes/origin/0.6.0 remotes/origin/1.8.0 remotes/origin/HEAD -> origin/master remotes/origin/ggadde-1-15-rc3-version remotes/origin/jvishnuvardhan-patch-9 remotes/origin/master remotes/origin/master-at-alpha0 remotes/origin/master-where-we-want-it remotes/origin/mrry-patch-1 remotes/origin/r0.10 remotes/origin/r0.11 remotes/origin/r0.12 remotes/origin/r0.7 remotes/origin/r0.8 remotes/origin/r0.9 remotes/origin/r1.0 remotes/origin/r1.1 remotes/origin/r1.10 remotes/origin/r1.11 remotes/origin/r1.12 remotes/origin/r1.13 remotes/origin/r1.14 remotes/origin/r1.15 remotes/origin/r1.2 remotes/origin/r1.3 remotes/origin/r1.4 remotes/origin/r1.5 remotes/origin/r1.6 remotes/origin/r1.7 remotes/origin/r1.8 remotes/origin/r1.9 remotes/origin/r2.0 remotes/origin/tflite-v1.10.1
利用本身自带的脚本下载所依赖的库:
./tensorflow/lite/tools/make/download_dependencies.sh
如果不下载会出现flatbuffer的问题。
完成后会出现
downloading https://storage.googleapis.com/mirror.tensorflow.org/github.com/google/farmhash/archive/816a4ae622e964763ca0862d9dbd19324a1eaf45.tar.gz
downloading https://storage.googleapis.com/mirror.tensorflow.org/github.com/google/flatbuffers/archive/v1.11.0.tar.gz
downloading https://storage.googleapis.com/mirror.tensorflow.org/www.kurims.kyoto-u.ac.jp/~ooura/fft2d.tgz
download_dependencies.sh completed successfully.
(base) lid@lid-VirtualBox:~/tf2/tensorflow$
走到这里其实很简单,关键的时下面浪费了很多时间,这里特别说一下,高通使用yocto编译环境会产生工具链,工具链名称叫arm-oe-linux-gnueabi-
用这个交叉编译会出现很多头文件找不到的问题,网上大多参考树莓派 安装 gcc-arm-linux-gnueabihf-
这里有个区别就是 gnueabihf 和gnueabi 在处理浮点上是不同的所以即使编译成功也不能用,后来经过几番测试终于找到对应的arm-gcc
方法就是:
首先找到arm-oe-linux-gnueabi-gcc 属于哪个版本 可以通过
arm-oe-linux-gnueabi-gcc -v
来找到,这里是使用的时4.9.3.然后去下载对应的gcc交叉编译工具链。
链接 http://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabi/
完整的链接 http://publishing-ap-linaro-org.s3.amazonaws.com/releases/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabi/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar.xz
这里用4.9.4就可以匹配。也就是不用arm-oe-linux-gnueabi- 换成arm-linux-gnueabi-
一开始用的是 8.2的gcc工具链,也可以编译成功,但是把可执行程序推到目标板会提示
/lib64/libm.so.6: version `GLIBC_2.27' not found
在Ubuntu上用arm-linux-gnueabi-nm minimal |grep 2.27 会出现
一些exp log等数学函数不对,所以可以知道是glibc版本过高了。
用ldd --version 也可以直到Ubuntu下的glibc版本信息。
xz -d 解压文件 arm-linux-gnueabi/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar.xz
tar -xvf arm-linux-gnueabi/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar
将路径配到bashrc
vi ~/.bashrc
最后一行添加 export PATH=$PATH":/home/lid/arm-gcc/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin"
source ~/.bashrc
arm 敲tab健是否出现 arm-linux-gnueab--gcc
将里边的arm-linux-gnueabihf- 换成arm-linux-gnueabi-
成功的样子
??R@@ benchmark_model minimal mm-qcamera-daemon
/system/bin # ./minimal
minimal <tflite model>
/system/bin #
用arm-oe-linux-gnueabi- 会出现
出现错误
rflow/lite/tools/make/gen/apq_armv7/obj/tensorflow/lite/core/api/error_reporter.o
In file included from tensorflow/lite/allocation.cc:16:0:
./tensorflow/lite/allocation.h:20:18: fatal error: cstdio: No such file or directory