在NXP I.MX8MPlus平台上,因为自带有一颗NPU,所以官方对于很多开源模型有许多适配,从官方的github网站GitHub - NXP/eiq-model-zoo: A collection of machine learning models for vision optimized for NXP products · GitHub中可以查看到具体的适配信息。本篇文章具体介绍NPU的使用过程,以自带的movenet模型为例。

首先根据github上的网址将nxp-model-zoo拉取到PC Ubuntu上。这里要注意的是Ubuntu版本最好是在20.04~24.04之间,因为对python版本有限制。命令如下:
git clone https://github.com/NXP/eiq-model-zoo.git
拉取后生成如下文件(正常拉取没有movenet.tflite文件):

可以看到官方已经写好了docker的配置文件,可以直接根据官方的命令构建docker镜像,命令如下:
docker build -t nxp-model-zoo .
在构建的过程中可能会遇到相关报错,比如说apt update的时候没有默认yes,亦或者dockefile里的python版本不是必须的,这里贴出修改过的文件:

成功构建后可以使用sudo docker images查看构建的镜像,如下图所示:

以上步骤完成后就可以开始启动镜像并且执行对应movenet的构建脚本,构建movenet模型的tflite文件,命令如下所示:
docker run --rm -v "$PWD:/workspace" nxp-model-zoo /workspace/tasks/vision/pose-estimation/movenet/recipe.sh
如果发现有相关报错可能跟路径有关系,再次核对一下路径即可。
运行成功就可以在eqi-model-zoo目录下生成对应的tflite文件movenet.tflite,如下图所示:

至此,我们所需要的关键文件准备完毕,接下来需要核对目标板相关文件并且将测试脚本以及测试图片移动到目标板上用于测试。
这里以我司IAC-IMX8MP-Kit为例,搭载Linux6.6内核,如果有相关测试与文章不符,可首先查看环境是否一致。
将PC上刚刚生成的movenet.tflite、eiq-model-zoo/tasks/vision/pose-estimation/movenet/example.pyeiq-model-zoo/tasks/vision/pose-estimation/movenet/example_input.jpg放入到/root/目录下,同时也要保证板端/usr/lib/下有libtensorflow-lite.so.2.16.2库以及libvx_delegate.so,环境确认之后修改example.py脚本。
因为当前是tensorflowlite处理的模型,所以需要将import tensorflow as tf注释,添加import tflite_runtime.interpreter as tflite。修改完成后测试脚本是否能够正常运行,执行命令python3 example.py,执行正常会在当前目录生成结果图片example_output.jpg,将其拷贝到PC上查看到具体结果,如下图所示:

可以通过打印的log查看到推理所使用的时间,另外可以观察到一个信息:
INFO: Created TensorFlow Lite XNNPACK delegate for CPU.
这表明这次推理是发生在CPU端而不是NPU端。可以通过nxp的官方文档查看到tensorflow的模型想要使用NPU,是使用的vx delegate代理,所以我们需要再次修改脚本,让模型跑在NPU上,可以参考官方的脚本进行修改,路径如下:
https://github.com/nxp-imx/tensorflow-imx/blob/lf-6.6.23_2.0.0/tensorflow/lite/examples/python/label_image.py,
参考修改后在example.py添加如下图所示:

即可,修改完成后运行,当出现一下log打印时说明运行在NPU上:

对比CPU比较明显的便是推理速度很快,这里指的是平均速度,对比单张可能因为缓存等一系列问题,计时会有很大差异,忽略单次推理即可。