STM32N6 NPU 上的 IMU 时序分类:从量化到板端运行

info
文档定位

本文将单 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 数据文件
warning
事实与建议的边界

文中标注“当前”“已确认”的数字来自本次实验;论文建议、候选贡献和未来消融实验不是已完成结果。发布前应把两者分开,给每个实测结论附上脚本、日志或板端输出。

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 后,主要流程如下:

  1. 通过 LL_ATON 获取输入输出 buffer info;
  2. 将 32×3=96 个 int8 输入样本复制到 NPU 输入缓冲区;
  3. 启动 Neural-ART/LL_ATON 推理;
  4. 等待任务完成并读取 3 个 int8 logits;
  5. 直接 argmax 得到类别 ID;
  6. 必要时将 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. 可形成的论文贡献

这套方案的学术价值主要来自“任务—模型—工具链—硬件—运行时”的完整贯通,而不是单一网络层创新。可候选概括为:

  1. 在 STM32N6 NPU 上验证单 IMU、短窗口、三分类时序识别;
  2. 面向冲击类大动态信号,分析代表性校准集与 INT8 饱和风险;
  3. 总结真实开发板上的 XSPI2 NOR Flash 地址重映射和内存池适配方法;
  4. 记录 LL_ATON 版本 ABI 兼容、buffer 物理布局和全 NPU 执行的工程约束;
  5. 提供从 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 运行时调用,完成从训练模型到真实板端推理的闭环。