STM32N6 NPU 上的 IMU 时序分类:从量化到板端运行
本文将单 IMU 三轴时序分类任务整理为一套完整的端到端技术方案,覆盖模型设计、INT8 量化、NPU 编译、Flash 地址映射、固件集成与板端验收。它更适合作为 TinyML/嵌入式 AI 的工程方法笔记和论文素材;其中“首次”“填补空白”等判断,必须经过系统文献检索后才能写入论文结论。
1. 方法概览
任务是在 STM32N647(ATK-CNN647B)上,对单个三轴 IMU 的短时窗口进行三分类:
- 输入:X/Y/Z 三轴 IMU,时间窗口 32;
- 模型输入形状:1×32×3×1(NHWC);
- 输出类别:steady、periodic、impact;
- 推理目标:全 NPU 执行,软件 Epoch 数为 0,并在 MCU 端直接完成 argmax。
完整链路为:
训练数据
→ Keras CNN
→ 全 INT8 TFLite
→ ST Edge AI Core / Neural-ART 编译
→ 链接脚本与内存池配置
→ 生成烧录文件
→ LL_ATON 运行时调用
→ 板端输出 logits 与类别
2. 技术方案总表
| 阶段 | 关键做法 |
|---|---|
| 任务与数据 | 单 IMU、三轴、32 帧窗口、三分类 |
| 训练框架 | Keras CNN,NHWC 输入 |
| 量化 | TensorFlow Lite 全 INT8,代表性数据 180 组 float32 样本 |
| 量化参数 | 已获得示例 scale=0.00996、zero_point=-24 |
| 模型裁剪 | 去掉末端 Softmax,保留 logits,由 argmax 完成后处理 |
| 编译工具 | ST Edge AI Core 2.2.0 + Neural-ART |
| 硬件 | STM32N647,32 MB XSPI2 NOR Flash |
| 地址映射 | 自定义内存池,将权重固定到 0x71000000 |
| 板端调用 | LL_ATON 读取 buffer info,memcpy 96 字节 int8 输入并启动 NPU |
| 版本管理 | 统一 LL_ATON dev16/dev14,避免 ABI 结构体不一致 |
| 首轮验收 | 固定向量对齐 PC float32 与 INT8 反量化结果,argmax 均为类别 1 |
复现前置条件
开始编译前先固定下面四类输入,避免把环境问题误判为模型问题:
| 类别 | 必须确认 | 记录位置 |
|---|---|---|
| 硬件 | STM32N647(ATK-CNN647B)、32 MB XSPI2 NOR、IMU 接线与供电 | 实验记录/照片 |
| 主机工具 | Keras/TensorFlow、TFLite、ST Edge AI Core 2.2.0、Neural-ART 版本 | requirements 或环境导出 |
| 固件运行库 | LL_ATON dev16/dev14 只选一套,头文件与库版本一致 | 构建日志 |
| 验收输入 | 固定 32×3 样本、量化参数、期望 argmax | golden 数据文件 |
文中标注“当前”“已确认”的数字来自本次实验;论文建议、候选贡献和未来消融实验不是已完成结果。发布前应把两者分开,给每个实测结论附上脚本、日志或板端输出。
3. 量化与模型设计
3.1 全 INT8 量化
代表性数据集包含 180 组 float32 样本,用于估计输入和中间张量的动态范围。典型量化关系为:
real_value = scale × (quantized_value − zero_point)
示例参数为 scale=0.00996、zero_point=-24。由于 impact 类信号可能包含较大幅值,校准集必须覆盖稳态、周期和冲击等不同动态范围,否则容易发生 INT8 饱和并损失分类边界。
建议记录:
- 校准样本的类别构成与幅值分布;
- 每层量化参数和饱和比例;
- 量化前后准确率、混淆矩阵及代表性样本误差;
- 固定验收向量及其反量化结果。
3.2 去除 Softmax
部署模型保留分类 logits,不在网络末端执行 Softmax。板端只需读取 3 个输出值并进行 argmax:
class_id = argmax(logits[0], logits[1], logits[2])
这样可以减少算子数量和后处理开销,并有利于 Neural-ART 将整个计算图编译为 NPU 执行。Softmax 概率若用于可视化或置信度分析,可在 PC 端离线计算。
4. NPU 编译与内存布局
4.1 编译路径
建议固定工具链版本并保存完整命令、生成日志和模型摘要:
Keras → TFLite INT8 → ST Edge AI Core 2.2.0 → Neural-ART
→ C 源文件/头文件 → 编译链接 → objcopy 生成烧录 HEX
中文路径曾导致编译器解析失败,因此工程目录和脚本路径宜使用纯英文、无空格路径。
4.2 Flash 地址重映射
ATK-CNN647B 使用 32 MB XSPI2 NOR Flash。为避免沿用官方大容量 Demo 配置造成访问越界,采用自定义内存池:
- 前 16 MB 预留给 FSBL 与应用;
- 网络权重固定映射到 0x71000000;
- 根据实际存储容量裁剪 memory pool;
- 同步检查链接脚本、烧录地址、启动配置和运行时 buffer 地址。
这一步是板级部署中最容易被忽略、但最影响稳定性的环节。地址配置必须通过 map 文件、生成镜像大小和板端读写测试共同确认。
5. 板端集成
板端替换 imu_network.c / imu_network.h 后,主要流程如下:
- 通过 LL_ATON 获取输入输出 buffer info;
- 将 32×3=96 个 int8 输入样本复制到 NPU 输入缓冲区;
- 启动 Neural-ART/LL_ATON 推理;
- 等待任务完成并读取 3 个 int8 logits;
- 直接 argmax 得到类别 ID;
- 必要时将 logits 反量化后打印,便于与 PC 端核对。
输入布局、步长、通道 Padding 和 buffer 对齐必须以实际 buffer info 为准,不能仅按模型摘要中的逻辑形状猜测。若编译器添加了 C 轴填充,应按照运行时描述的物理布局复制数据。
6. 版本与 ABI 风险
LL_ATON dev16 与 dev14 之间可能存在结构体大小或字段布局差异。头文件、静态库、生成代码和应用工程若版本不一致,可能出现编译通过但运行时 HardFault。
最低限度的版本管理要求:
- 锁定并记录 LL_ATON 版本;
- 保证编译器生成代码与运行库来自同一版本体系;
- 清理旧生成文件后重新编译;
- 对关键结构体执行 sizeof 或静态断言检查;
- 在首次启动阶段打印版本和 buffer 信息。
7. 分层验收方法
7.1 PC 端数值验收
使用固定输入样本,比较:
- Keras float32 输出;
- TFLite INT8 输出反量化值;
- 三者 argmax 是否一致。
当前首个验收向量的 argmax 均为类别 1。该结果只能证明模型转换和量化链路的基本一致性,不能代替完整测试集评估。
7.2 板端静态验收
将同一固定输入写入板端,检查:
- 输入 96 字节是否按预期落入 buffer;
- NPU 是否完整执行;
- 输出 3 字节 logits 是否可读;
- 板端 argmax 是否与 PC 端一致;
- 是否出现越界、HardFault 或异常复位。
7.3 真实 IMU 验收
最后接入连续传感器流,按窗口滑动推理,报告延迟、吞吐、功耗、内存占用和三类场景下的混淆矩阵。静态向量通过后再进行动态测试,可以显著缩小问题定位范围。
8. 可形成的论文贡献
这套方案的学术价值主要来自“任务—模型—工具链—硬件—运行时”的完整贯通,而不是单一网络层创新。可候选概括为:
- 在 STM32N6 NPU 上验证单 IMU、短窗口、三分类时序识别;
- 面向冲击类大动态信号,分析代表性校准集与 INT8 饱和风险;
- 总结真实开发板上的 XSPI2 NOR Flash 地址重映射和内存池适配方法;
- 记录 LL_ATON 版本 ABI 兼容、buffer 物理布局和全 NPU 执行的工程约束;
- 提供从 Keras、TFLite、Neural-ART 到固件运行时的可复现部署链路。
论文中应把“首次”改写为“据我们检索,在所覆盖文献范围内尚未见完整报道”,并提供检索范围、对比表和可复现实验。工程数字如 180 组校准样本、0x71000000、32 MB Flash、96 字节输入和 0 个软件 Epoch,只有在日志、脚本和硬件实验可追溯时,才应作为核心证据呈现。
9. 推荐论文图与实验
最有辨识度的一张图应展示:
float32 输入 → INT8 量化公式与参数 → NPU 张量布局(含 Padding)
→ Flash/内存地址映射 → LL_ATON 调用
→ logits 反量化 → argmax 决策
实验建议包括:
- float32、INT8 CPU、INT8 NPU 的精度和延迟对比;
- 不同校准集规模与构成的消融;
- Softmax 保留/移除的资源对比;
- 不同 Flash 地址和内存池配置的稳定性测试;
- LL_ATON 版本一致与不一致时的故障复现实验;
- 真实 IMU 流上的功耗、吞吐和端到端响应时间。
10. 一句话总结
该工作的核心贡献是建立一条可复现的全栈嵌入式 AI 部署链路:用轻量 CNN 处理短窗口 IMU 信号,以全 INT8 和 logits 输出适配 STM32N6 NPU,再通过 Flash 地址重映射、内存池裁剪、ABI 对齐和 LL_ATON 运行时调用,完成从训练模型到真实板端推理的闭环。