系列目录:
IOT设备AI搭建1:Linux上构建Tensorflow Lite
IOT设备AI搭建2:树莓派部署TF Lite(图片分类实例)
IOT设备AI搭建3:TF Lite构建过程解析
IOT设备AI搭建4:MakeFile基础语法
上一边文章,我们构建了最简单的minimal的例子,本章节,我们编译下label_image的例子,并将其部署到树莓派上
为了编译label_image的例子,我们修改了buid和Makefile文件,是的可以指定编译任何的实例;
修改后的文件为
build文件内容
编译
build_rpi.sh文件为
set -x
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
TENSORFLOW_DIR="${SCRIPT_DIR}/../../../.."
FREE_MEM="$(free -m | awk '/^Mem/ {print $2}')"
# Use "-j 4" only memory is larger than 2GB
if [[ "FREE_MEM" -gt "2000" ]]; then
NO_JOB=4
else
NO_JOB=1
fi
if [[ ! -z "${TARGET_ARCH}" ]]; then
make -j ${NO_JOB} TARGET=rpi -C "${TENSORFLOW_DIR}" -f tensorflow/lite/tools/make/Makefile TARGET_ARCH=${TARGET_ARCH}
else
make -j ${NO_JOB} TARGET=arm -C "${TENSORFLOW_DIR}" -f tensorflow/lite/tools/make/Makefile TARGET_ARCH=armv7l
fi
rpi对应的编译配置文件为:
tensorflow/lite/tools/make/targets/rpi_makefile.inc
在Makefile中你需要修改指向的程序路径,为了更通用,我将MININAL_SRC的名称改成了TARGET_PROGRAM_SRCS
TARGET_PROGRAM_SRCS := \
tensorflow/lite/examples/label_image/label_image.cc \
tensorflow/lite/examples/label_image/bitmap_helpers.cc
编译成功后,会在响应目录生成可执行文件
ensorflow/lite/tools/make/gen/arm_armv7l/bin$ ls
benchmark_model benchmark_model_performance_options tf_common
应用图像分类
将tf_common 拷贝到树莓派系统中;下载模型和标签文件;并获取TF源码中的示例图片tensorflow/lite/examples/label_image/testdata/grace_hopper.bmp
运行命令:
tensorflow/lite/tools/make/gen/linux_x86_64/bin$ ./tf_common -v 1 -m ./mobilenet_v1_1.0_224_quant.tflite -i ./grace_hopper.bmp -l ./labels_mobilenet_quant_v1_224.txt
图片加测结果:
average time: 407.108 ms
0.780392: 653 military uniform #%78概率是军装
0.105882: 907 Windsor tie %10的概率是绳子
0.0156863: 458 bow tie #领带
0.0117647: 466 bulletproof vest #防弹衣
0.00784314: 835 suit #西装
报错分析
禁用gpu加速,因为我的电脑不支持
label_image.cc:(.text+0x39): undefined reference to `tflite::evaluation::CreateGPUDelegate()'
/home/jiadongfeng/tensorflow/tensorflow-r2.2/tensorflow/lite/tools/make/gen/linux_x86_64/obj/tensorflow/lite/examples/label_image/label_image.o: In function `tflite::label_image::GetDelegates[abi:cxx11](tflite::label_image::Settings*)':
label_image.cc:(.text+0xa2c): undefined reference to `tflite::evaluation::CreateHexagonDelegate(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)'
label_image.cc:(.text+0xb06): undefined reference to `tflite::evaluation::CreateNNAPIDelegate()'
修改方法:
因为我的电脑不支持GPU加速,Intel的。将相关加速代码去除即可
交叉编译版本问题造成的差异
error:version `GLIBC_2.27' not found
因为我的电脑的交叉编译版本比较高,对应的GLIBC的版本是GLIBC_2.27;而树莓派上交叉编译工具只有GLIBC_2.24
pi@raspberrypi:/lib $ strings arm-linux-gnueabihf/libc.so.6 |grep GLIBC
GLIBC_2.4
GLIBC_2.5
GLIBC_2.6
GLIBC_2.7
GLIBC_2.8
GLIBC_2.9
GLIBC_2.10
GLIBC_2.11
GLIBC_2.12
GLIBC_2.13
GLIBC_2.14
GLIBC_2.15
GLIBC_2.16
GLIBC_2.17
GLIBC_2.18
GLIBC_2.22
GLIBC_2.23
GLIBC_2.24
GLIBC_PRIVATE
GNU C Library (Debian GLIBC 2.24-11+deb9u3) stable release version 2.24, by Roland McGrath et al.
需要将编译的电脑的交叉编译工具换成树莓派的,更换方式:
#指向你的交叉编译工具的位置
TOOLCHAIN=/lib/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/
echo "TOOLCHAIN="${TOOLCHAIN}
if [ ! -d ${TOOLCHAIN} ];then
echo "[ERROR]TOOLCHAIN="${TOOLCHAIN}" not exist!";
return;
fi
#将交叉工具目录添加到path中
export PATH=${TOOLCHAIN}:$PATH
echo "PATH="$PATH;
更换编译方式后,重新编译tflite,再重新拷贝到树莓派上;成功
网友评论