【STM32H5 评测】MNIST 数字识别
本文介绍了 NUCLEO-H5E5ZJ 开发板结合 STM32Cube AI Studio 软件和 MNIST 数据集以及 TFLite 预训练模型,实现手写数字识别的项目设计,包括环境搭建、工程创建、关键代码、流程图、效果演示等。

项目介绍
NUCLEO-C562RE 开发板实现手写数字识别。
- 准备工作:环境搭建、STM32Cube AI Studio、硬件连接、模型获取等;
- 工程创建:流程图、模型转换、工程代码等;
- 工程测试:工程编译、固件上传、效果演示等。
硬件连接
使用 Type-C 数据线连接开发板 ST-LINK V3 接口与主机 USB 接口;
根据原理图,选择 PD8 和 PD9 作为 USART3 (板载ST-LINK虚拟串口)的通信引脚。

环境搭建

- 进入 Setting 设置标签页,自动安装所需工具,包括 STM32CubeMX、STM32CubeProgrammer、STM32CubeIDE、ST Edge AI Core;
-
-

模型获取
使用预训练的 TFLite 模型,下载 trained.tflite 文件 。
参考:Mnist数字识别 · OpenMV .
TFLite
TFLite 模型是 TensorFlow Lite 的轻量级模型格式,用于在移动端和嵌入式设备上高效运行机器学习推理。

TensorFlow Lite(TFLite)是 TensorFlow 的轻量级版本,专注于在移动设备、嵌入式系统和物联网设备上运行机器学习模型。TFLite 模型文件以 .tflite 为扩展名,采用 FlatBuffer 二进制格式存储,具有高效、低内存占用和快速访问的特点。
工程创建
新建工程,选择 NUCLEO-H5E5ZJ 开发板为目标设备;

工具链选择 CMake 以便使用 VS Code 调试,点击创建工程;

- 选择 mnist 模型路径,确认相关参数(mode 为 on desktop);
- 点击开发板右侧的设置按钮,配置串口为 USART3,PD8 和 PD9 引脚,点击运行按钮;


- 点击
Generate code 按钮生成工程文件;

- 点击打开工程文件夹,使用 VS Code 打开工程。

详见:【STM32U3 评测】MNIST 数字识别 .
流程图

工程代码
打开 ./AI/APP/app_x-cube-ai.c 添加如下代码
int acquire_and_process_data()
{
/* USER CODE BEGIN acquire_and_process_data */
if (in_length != STAI_NETWORK_IN_NUM || stai_input[0] == NULL) {
LC_PRINT("Input buffer is not available\r\n");
return -1;
}
int8_t *input = (int8_t *)stai_input[0];
for (stai_size i = 0; i < STAI_NETWORK_IN_1_SIZE; i++) {
input[i] = (int16_t)pixel_data[i] + STAI_NETWORK_IN_1_ZERO_POINT;
}
return 0;
/* USER CODE END acquire_and_process_data */
}
int post_process()
{
/* USER CODE BEGIN post_process */
if (out_length != STAI_NETWORK_OUT_NUM || stai_output[0] == NULL) {
LC_PRINT("Output buffer is not available\r\n");
return -1;
}
const int8_t *scores = (const int8_t *)stai_output[0];
uint32_t best_digit = 0;
for (uint32_t digit = 1; digit < STAI_NETWORK_OUT_1_SIZE; digit++) {
if (scores[digit] > scores[best_digit]) {
best_digit = digit;
}
}
LC_PRINT("Recognized digit: %u\r\n", (unsigned int)best_digit);
LC_PRINT("Confidence by digit:\r\n");
for (uint32_t digit = 0; digit < STAI_NETWORK_OUT_1_SIZE; digit++) {
uint32_t confidence =
(((uint32_t)((int16_t)scores[digit] - STAI_NETWORK_OUT_1_ZERO_POINT)
* 10000U) + 128U) / 256U;
LC_PRINT(" %u: %u.%02u%%\r\n",
(unsigned int)digit,
(unsigned int)(confidence / 100U),
(unsigned int)(confidence % 100U));
}
return 0;
/* USER CODE END post_process */
}
保存代码。
编译上传
- 点击下方工具栏的
生成 按钮,编译工程;
- 点击左侧工具栏的
调试运行 按钮,点击上方的运行按钮,上传调试固件;
- 待进入调试状态,点击悬浮工具栏的启动按钮,开始运行程序;

效果演示
- 运行串口调试助手软件,连接 STLINK-V3 对应的虚拟串口,配置波特率 115200 bps,打开串口;
- 短按板载复位按键,串口输出数字识别结果、计算时间等信息;

总结
本文介绍了 NUCLEO-H5E5ZJ 开发板结合 STM32Cube AI Studio 软件和 MNIST 数据集以及 TFLite 预训练模型,实现手写数字识别的项目设计,包括环境搭建、工程创建、关键代码、流程图、效果演示等,为相关产品在边缘 AI 领域的快速开发和应用设计提供了参考。 |