移植Tensorflow Lite Micro源码到ArmClang Cortex-M

1.获取最新tensorflow lite micro仓库

从2021年6月25号后,TFLM(tensorflow lite micro)作为tensorflow的子分支被独立到一个新的仓库地址:tensorflow/tflite-micro: Infrastructure to enable deployment of ML models to low-power resource-constrained embedded targets (including microcontrollers and digital signal processors). (github.com)

因此需要使用以下命令克隆最新的TFLM仓库。

git 复制代码
git clone https://github.com/tensorflow/tflite-micro.git

2.生成最小依赖源码树

参考tflite-micro/tensorflow/lite/micro/docs/new_platform_support.md,使用命令

shell 复制代码
python3 tensorflow/lite/micro/tools/project_generation/create_tflm_tree.py \
  -e hello_world \
  /tmp/tflm-tree

可以生成针对hello_world工程的最小依赖源码树,在这个过程中会去下载第三方源码库,其中pigweed仓库由于采用了google的git源,大概率会下载失败,可以在脚本外手动git clone一下然后丢回源码目录里重新执行create_tflm_tree.py,这边对git bash进行了代理才可以正常克隆pigweed仓库。

分析Makefile,对第三方库的下载操作是通过相应的脚本进行的。

检查pigweed_download.sh

发现得到pigweed仓库后还进行了checkout、create_git_repo、apply_patch_to_folder等操作,因此把下载到的仓库添加到指定路径后还要手动修改一下检查pigweed_download.sh,使其跳过目录检查和下载执行后续操作。

如果出现No module named 'numpy'的问题,解决办法:

shell 复制代码
pip install numpy

如果没有别的问题,将得到生成的最小依赖源码目录。

如果一些IDE无法识别.cc后缀,可以附加--rename_cc_to_cpp选项将.cc改为.cpp后缀。

得到的最小依赖源码目录仍缺少两个文件,查看Makefile后进行手动补齐

3.移植源码到Keil IDE

tflite-micro/tensorflow/lite/micro/cortex_m_generic/README.md 提到要实现移植需要针对所在平台需要完成对debug_log.cc和micro_time.cc的实现。

tflite-micro/tensorflow/lite/micro/tools/make/targets/cortex_m_generic_makefile.inc 提到TARGET_ARCH可支持的所有架构。

可以使用以下指令得到源码清单。

makefile 复制代码
make -f tensorflow/lite/micro/tools/make/Makefile TARGET=cortex_m_generic TARGET_ARCH=cortex-m4 list_library_sources > src_list.txt

依照源码清单对源码结构进行分组,添加到keil项目中,如果不进行分组,keil IDE是无法在同一个组中添加同名源码文件的。

tflm相关头文件包含路径。

选择AC6编译器,并取消勾选Micro Lib:

编译选项:

堆栈设置

操作完成后进行编译

下载并运行程序,在监视器中查看量化模型的估计结果,基本符合预期。

后续可以将源码与模型分离开,生成.a或者.lib库,方便移植。

相关推荐
用户8055336980315 小时前
嵌入式Linux开发——烧写你的镜像:存储介质基础 - 先分清 SD、eMMC 和块设备
linux·嵌入式
济6172 天前
ROS开发专栏---ROS2 机械臂应用入门(1)---JointState 消息解析与机械臂往复运动控制实验---适配Ubuntu 22.04
嵌入式硬件·嵌入式·ros2·机器人开发·机器人方向
济6172 天前
ROS开发专栏---ROS2 三维视觉应用(2)---使用 PCL 进行桌面物品检测实验---适配Ubuntu 22.04
嵌入式硬件·嵌入式·ros2·机器人开发·机器人方向
道川贤林2 天前
EMMC开发环境的搭建与备份
linux·嵌入式·rk3588·orangepi
凉、介3 天前
深入理解 ARMv8-A|Application Binary Interface (ABI)
c语言·笔记·学习·嵌入式·arm
济6173 天前
ROS2 Humble 开发专栏---ROS2 三维视觉应用(1)---RGB-D 相机三维点云数据获取实验---适配Ubuntu 22.04
ubuntu·嵌入式·ros2·机器人开发·机器人方向
bush43 天前
嵌入式linux学习记录十,定时器
linux·嵌入式
nnnnichijou3 天前
Qt 6.9 嵌入式 Linux 交叉编译全栈填坑指南(以树莓派5 AArch64 为例
qt·嵌入式·交叉编译·qml·树莓派5
bush44 天前
嵌入式linux学习记录七,中断
linux·嵌入式
都在酒里5 天前
FreeRTOS 综合实战:串口命令控制 LED 闪烁模式与系统监控
stm32·单片机·嵌入式硬件·嵌入式·rtos·嵌入式软件