教程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  


在 tensorflow/tensorflow/lite/tools/make/build_rpi_lib.sh的脚本 找到rpi_makfile.inc


将里边的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


sitemap