一、LINUX环境下操作:
1.安装交叉编译SDK (仅针对该型号:i.MX6,不同芯片需要对应的交叉编译SDK)
编译方法参考:手动编译用于i.MX6系列的交叉编译SDK
2.下载Tensorflow
git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
git checkout r1.12
Tensorflow与Bazel编译器(及CUDA,CUDNN)之间需要对应,否则会有兼容性问题。
tensorflowr1.10 python 2.7,3.6 Bazel:0.18.0-0.19.2
tensorflowr1.12 python 2.7,3.6 Bazel:0.18.0-0.19.2
tensorflowr1.14 python 2.7,3.6 Bazel:0.24.0 - 0.25.2
3、下载并安装编译工具Bazel
安装依赖包:
sudo apt-get install pkg-config zip g++ zilb1g-dev unzip
下载Bazel包:
wget https://github.com/bazelbuild/bazel/releases/download/0.18.1/bazel-0.181-installer-linux-86_64.sh
安装Bazel:
chmod +x bazel-0.18.1-installer-linux-86_64.sh
./bazel-0.18.1-installer-linux-86_64.sh --user
设置环境变量:
sudo vi ~/.bashrc,在文件最后添加:export PATH=$PATH":~/bin"
source ~/.bashrc
(如果仅仅是测试DEMO在ARM板上使用,可直接跳过4,5,6,7,8步,直接进行第9步)
4、编译配置:
在Tensorflow源码根目录运行:
./configure (编译LINUX平台时使用默认设置:-march=native,编译ARM平台时需设置成相应值:-march=armv7-a)
5、编译pip:
bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
7、编译包:
./bazel-bin/tensorflow/tools/pip__package/build_pip_package /tmp/tensorflow_pkg
8、安装包:
pip install /tmp/tensorflow_pkg/tensorflow-version-tags.whl
9、下载依赖库:
./tensorflow/contrib/lite/tools/make/download_dependencies.sh(不同版本,位置略有不同,本文路径为r1.12版本)
10、编译Tensorflow Lite:
目前仅支持树莓派: ./tensorflow/contrib/lite/tools/make/build_rpi_lib.sh,该脚本的目标编译平台是ARMv7,即使目标平台是ARMv8,也不要更改。因为设置编译平台为ARMv7可以优化编译,提高运行速度。
生成静态库位置为:
./tensorflow/contrib/lite/toos/make/gen/rpi_arm7l/lib/libtensorflow-lite.a静态库。
11、编译模型:
默认情况下label_image并未编译进去,需要修改Makefile,可参考minimal APK,主要修改以下三部分内容:
LABELIMAGE_SRCS
LABELIMAGE_BINARY
LABEL_OBJS
再次执行: ./tensorflow/contrib/lite/tools/make/build_rpi_lib.sh
编译完成后,在./tensorflow/contrib/lite/tools/make/gen/rpi_arm7l/bin 目录下生成可执行文件label_img
12、在PC上测试label_image
./label_image -v 1 -m ./mobilenet_v1_1.0_224.tflite -i ./grace_hopper.jpg -l ./imagenet_slim_labels.txt
报错信息: bash ./label_image: cannot execute binary file:Exec format error
原因有两个:
一是GCC编译时多加了一个-C,生成了二进制文件;
解决方法:找到GCC编译处,去除-C选项。
二就是编译环境不同(平台芯片不一致)导致
解决方法:需要在对应平台编译。
在tensorflow根目录执行:bazel build tensorflow/examples/label_image:label_image
如果是第一次编译,时间较久;
编译完成后,生成可执行文件:bazel_bin/tensorflow/examples/label_image/label_image
本地测试该文件:
拷贝label_image和libtensorflow_framework.so到tensorflow/examples/label_image下
(第一次测试时,未拷贝libtensorflow_framework.so,直接提示:error while loading shared libraryies:libtensorflow_framework.so:cannot open shared object file:No such file or directory)
再次运行./tensorflow/examples/label_image/label_image
显示结果:military uniform(653):0.834306
mortarboard(668):0.0218695
academic gown(401):0.0103581
pickelhaube(716):0.00800814
bulletproof vest(466):0.00535084
测试OK!
以下操作在ARM板子上:
1、拷贝生成的label_image到板子上
拷贝图片./tensorflow/examples/label_image/data/grace_hopper.jpg到板子上
2、下载模型mobilenet_v1_1.0_224.tflite
(地址:http://download.tensorflow.org/models/mobilenet_v1_2018_02_22/mobilenet_v1_1.0_192.tgz,
如果下载其它模型,可参考该文件:/tensorflow/contrib/lite/g3doc/models.md)
然后拷贝到板子上
3、下载模型所需文件:
curl -L "https://storage.googleapis.com/download.tensorflow.org/models/inception_v3_2016_08_28_frozen.pb.tar.gz" | tar -C tensorflow/examples/label_image/data -xz
拷贝标签文件:./tensorflow/examples/label_image/data/imagenet_slim_labels.txt到板子上
4、运行label_image
确保如下所需文件都已完成:
(拷贝文件1:label_image)
(拷贝文件2:grace_hopper.jpg)
(拷贝文件3:mobilenet_v1_1.0_224.tflite)
(拷贝文件4:mobilenet_v1_1.0_224.tflite)
执行脚本:
./label_image -v 1 -m ./mobilenet_v1_1.0_224.tflite -i ./grace_hopper.jpg -l ./imagenet_slim_labels.txt
如果出现-sh: ./label_image: not found,可能是编译器不一致导致。
尝试方法1:重定向:ln -s ld-linux.so.3 ld-linux-armhf.so.3
新报错:./label_image:/lib/libm.so.6: version 'GLIBC_2.27' not found (required by ./label_image)
PC上所有工作已就续,ARM上待确认,待板子到位后功能确认好再更新。。。