|
|
发表于 2026-7-23 15:51:00
|
显示全部楼层
这是我整理的TensorFlow Lite Micro(TFL微版)完整部署全流程:
环境:Windows 10/11 + STM32F407ZG
目标:PC 上 Python 训练模型 → 转为 TFLite → 生成 TFLite Micro 可执行 C 数组模型 → 移植到 STM32 裸机 / RTOS 工程,MCU 实时推理。
TFLM 官方不支持 Windows 原生编译,模型转换在 Windows Python 完成;MCU 侧 TFLM 源码直接纳入 Keil/STM32CubeIDE 工程编译。
一、Windows PC 需要安装全部软件清单
1. Python 环境(模型训练、转换核心):推荐版本:Python 3.8 ~ 3.10(太高版本 TensorFlow 兼容性差)
2. STM32 开发工具(二选一)
方案 A:STM32CubeIDE(免费,推荐)官网下载 1.10~1.13 版本,自带 GCC 编译器,无需 Keil
方案 B:Keil MDK-ARM 5.37+,需要 STM32F4 器件支持包;注意:TFLM 大量 C++ 代码,Keil 必须开启 C++ 支持。
3. 辅助工具
- Git for Windows:拉取 TFLite Micro 源码
- STM32CubeMX:生成 STM32F407 底层初始化工程(时钟、串口、ADC、DMA 等)
- ST-LINK 驱动:下载程序到开发板
4. 获取 TensorFlow Lite Micro 源码(核心!)
二、略、
三、阶段 1:PC Python 数据集准备 + 模型训练
3.1 数据集形式:一维数据,数据集格式:csv 文件每行:特征 1, 特征 2, 特征 3... ,
数据集来源:
1.自己采集 MCU 传感器数据,串口上传 PC 保存 csv
2.公开数据集:UCI 传感器数据集、MNIST 手写数字 (28×28 灰度,经典入门)
3.2 Keras 训练模型完整示例:新建 train_model.py,运行:python train_model.py,本阶段生成物:mnist_model.h5
四、阶段 2:.h5模型转换为 .tflite(浮点 / INT8 量化)
方式 A:浮点模型(简单,速度慢,RAM 占用高,不推荐 F407 长期使用)
方式 B:INT8 全量化【强烈推荐 STM32F407!】MCU 没有硬件 FPU 浮点加速时,int8 推理速度提升 3~10 倍,Flash 占用更小。
新建脚本 convert_tflite.py,运行脚本得到:model_int8.tflite,当前阶段产物model_float.tflite / model_int8.tflite 二进制模型文件
五、阶段 3:.tflite 文件转为 C数组(最重要一步)
MCU 不能直接读取外部 bin 文件,必须把模型编译进 Flash,转换成头文件数组。
方法 1:Windows 下使用 python 脚本转换(最简单,不用命令行工具)
generate_model_header.py运行后输出 model.h,产物:model.h,直接拷贝进 STM32 工程。
六、阶段 4:STM32F407 工程搭建 + 移植 TFLM 源码
6.1 使用 STM32CubeMX 生成基础工程,TFLM 推理时需要内存缓冲区,栈太小直接 HardFault!
TFLM 主体是 C++ 代码,开启工程 C++ 编译支持,main.c 如果调用 TFLM 函数,需要使用 extern "C" 包裹接口。
6.2 筛选需要导入工程的 TFLM 源码文件:从tensorflow/tensorflow/lite/micro/ 复制下列目录到你的 STM32 工程目录,命名 tflite_micro需要包含:
tensorflow/
├─ lite/
├─ micro/ # 核心micro接口
├─ c/ # flatbuffer解析代码
├─ core/ # tflite基础结构
├─ kernels/ # 算子实现(conv,dense,maxpool等)
├─ schema/ # flatbuffer模型解析头文件
必须添加的头文件路径(工程 Include Path)
../tflite_micro
../tflite_micro/tensorflow
../tflite_micro/tensorflow/lite
../tflite_micro/tensorflow/lite/micro
6.3 TFLM 最重要概念:张量内存缓冲区(Arena)
TFLM 不在堆动态 malloc!所有推理中间变量放在一块预先分配连续内存 Tensor ArenaSTM32F407ZG RAM 只有 192KB,Arena 大小必须精准估算。示例定义: Arena 太小 → 初始化解释器直接失败,推理崩溃。
// 放在全局区(不要定义在函数栈里!栈空间很小)
#define TENSOR_ARENA_SIZE 60*1024 // 60KB,根据模型调整
uint8_t tensor_arena[TENSOR_ARENA_SIZE];
七、阶段 5:MCU 推理主代码编写(完整可参考框架)
把前面生成的 model.h 复制到工程 Inc/新建 tflm_inference.cpp(C++ 文件)
在 main.c 调用(注意 extern C) |
|