IOT设备AI搭建2:树莓派部署TF Lite(图片分类实例)

2020-04-16  本文已影响0人  古风子

系列目录:

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文件内容

MakeFile文件内容

编译

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,再重新拷贝到树莓派上;成功

上一篇 下一篇

猜你喜欢

热点阅读