2、时序推理基础:滑动窗口、特征提取、模型推理的典型流程与计算瓶颈
TinyML 时序推理与静态图像识别最大的不同在于:输入数据不是一张完整的图片,而是一条持续到达的传感器数据流。设备端 MCU 必须在有限的内存和算力约束下,对不断涌入的加速度计、陀螺仪、麦克风或环境传感器数据做出实时响应。理解这一过程的基本流程与计算瓶颈,是后续进行特征缓存与重复计算消除的前提。本章将系统拆解滑动窗口、特征提取、模型推理三个核心环节,并分析每个环节在资源受限设备上的主要矛盾。
2.1 滑动窗口:时序数据的分帧机制
滑动窗口是将无限长的传感器数据流切分为有限长度片段的核心机制。设原始采样率为 \(f_s\),窗口长度为 \(W\)(以样本点数计),滑动步长为 \(S\)(以样本点数计),则每次推理使用的数据为最近 \(W\) 个采样点。窗口每前进 \(S\) 个新样本,就产生一个新的推理请求。窗口重叠率定义为 \((W-S)/W\),当 \(S < W\) 时相邻窗口存在重叠区域。
在 MCU 上实现滑动窗口通常采用环形缓冲区(Ring Buffer)。缓冲区大小固定为 \(W\),新数据写入覆盖最旧数据。每次推理时,模型读取整个缓冲区内容作为输入。这种设计避免了频繁的内存拷贝,但需要注意缓冲区满时的覆盖策略与数据对齐问题。
- 窗口长度 W:需覆盖至少一个完整的行为周期。例如人体步态识别,步频约 1.5~2Hz,采样率 50Hz 时,W 至少取 50~100 个样本(1~2 秒)。W 过短会丢失低频特征,W 过长则增加延迟与内存占用。
- 滑动步长 S:决定推理频率。S 越小,响应越及时,但计算量增大。通常取 W 的 25%~50% 作为步长,兼顾实时性与功耗。
- 重叠率:高重叠率(如 75%)能提升分类平滑度,但重复计算增多,是后续优化的重点对象。
2.2 特征提取:从原始信号到判别信息
原始传感器数据通常包含大量冗余信息。特征提取的目标是压缩数据维度,同时保留对分类任务最有判别力的信息。TinyML 场景下常用的特征分为三类:
| 特征类别 | 典型特征 | 计算复杂度 | 适用场景 |
|---|---|---|---|
| 时域统计 | 均值、方差、均方根、过零率、峰值 | O(W),低 | 运动识别、异常检测 |
| 频域特征 | FFT 幅度谱、功率谱密度、谱质心 | O(W log W),中高 | 振动分析、语音关键词 |
| 时频特征 | 短时傅里叶变换(STFT)、小波系数 | O(W log W × 帧数),高 | 复杂声学场景、生物信号 |
在 MCU 上,时域特征因计算简单而优先被采用。频域特征虽然判别力强,但 FFT 运算会消耗大量 CPU 周期。例如,在 64MHz 的 Cortex-M4 上,执行 256 点 FFT 约需 0.5~1ms,若采样率 1kHz、窗口 256 点,则特征提取时间占可用计算时间的 50% 以上。
2.3 模型推理:从特征到决策
特征向量经过量化后送入神经网络模型。TinyML 模型通常为 2~5 层卷积或全连接网络,参数量在 10KB~500KB 之间。推理过程包括逐层卷积/矩阵乘、激活函数、池化等操作。在 MCU 上,推理时间主要受以下因素影响:
- 算子类型:深度可分离卷积比标准卷积计算量小 8~10 倍。
- 量化方式:INT8 量化比 FP32 快 4~6 倍,内存占用减少 75%。
- 内存带宽:权重和激活值的搬运时间往往超过计算时间。
2.4 计算瓶颈的量化分析与定位
为了精准优化,需要先量化各环节的耗时占比。以下是一个典型的人体活动识别(HAR)案例的实测数据:
硬件: STM32L4 @ 80MHz, 64KB RAM
采样率: 50Hz (3轴加速度计)
窗口: W=50, S=25 (重叠率50%)
特征: 均值(3) + 方差(3) + 过零率(3) + FFT(32点, 取前8个系数) = 17维
模型: 2层全连接 (17→16→3), INT8量化, 参数量 1.2KB
耗时分布:
- 数据采集与窗口滑动: 0.8ms (5%)
- 时域特征计算: 2.1ms (13%)
- FFT计算: 8.5ms (53%)
- 模型推理: 4.2ms (26%)
- 其他开销: 0.4ms (3%)
总计: 16.0ms (预算: 20ms, 余量 25%)
从数据可见,FFT 是最大瓶颈。若将 FFT 改为增量更新(利用重叠窗口的频谱复用),可将其耗时降至 2.0ms,总耗时降至 9.5ms,节省约 40% 的计算量。这正是后续章节要深入讲解的特征缓存技术。
2.5 常见误区与设计复盘
初学者常认为窗口越长,信息越丰富,识别越准。但长窗口意味着更大的内存占用(W×通道数×4字节)和更长的推理延迟。对于步态识别,窗口从 1 秒增加到 3 秒,准确率仅提升 1.2%,但内存占用增加 3 倍,延迟增加 2 倍。正确做法是先用离线数据做窗口长度扫描实验,找到准确率饱和点。
当重叠率高达 75% 时,相邻窗口共享 75% 的数据。若每次重新计算全部特征,相当于 75% 的计算是冗余的。例如上述案例中,若重叠率从 50% 提升到 75%,FFT 计算时间将从 8.5ms 增加到 12.8ms,而通过缓存前一窗口的 FFT 结果,仅需计算新增 25% 数据的增量部分,可将 FFT 时间控制在 3ms 以内。
许多实现采用"采集满窗口→停止采集→计算特征→推理→继续采集"的串行模式。这导致采样中断,可能丢失关键数据。正确做法是使用双缓冲或 DMA 传输,让采样持续进行,推理在后台完成。若推理时间超过采样间隔,应降低推理频率(增大 S)而非阻塞采样。
2.6 案例拆解:智能手环的实时步态识别优化
背景与约束:某智能手环产品需在 Nordic nRF52840(Cortex-M4 @ 64MHz,256KB RAM)上实现实时步态识别。采样率 50Hz,3 轴加速度计,要求推理延迟 < 100ms,平均功耗 < 1mA(含传感器)。
初始方案与问题:工程师最初采用 W=100(2 秒)、S=50(1 秒)的滑动窗口,提取 9 维时域特征 + 16 维 FFT 特征,送入 2 层 LSTM 模型(参数量 8KB)。实测单次推理总耗时 180ms,超过 100ms 预算;且 LSTM 模型在 MCU 上运行效率低,内存占用达 45KB。
分析过程:通过 Profiler 定位耗时分布:FFT 计算占 45%(81ms),LSTM 推理占 40%(72ms),其余为数据搬运与特征拼接。进一步分析发现,窗口重叠率为 50%,FFT 存在大量重复计算;LSTM 的循环结构在 MCU 上无法充分利用硬件加速。
优化措施:
- 将 LSTM 替换为 1D-CNN(卷积核大小 5,3 层),参数量降至 3.2KB,推理时间降至 28ms。
- 实现 FFT 增量缓存:维护前一窗口的频谱,仅计算新增 50 个样本的 FFT 并叠加,FFT 时间从 81ms 降至 22ms。
- 将窗口步长调整为 S=25(重叠率 75%),利用缓存后计算量仅增加 15%,但分类平滑度提升。
- 使用双缓冲 DMA 采集,采样与推理并行。
结果对比:优化后总推理时间 55ms,内存占用 28KB,平均功耗 0.7mA。识别准确率从 91.2% 提升至 93.5%(得益于更高重叠率)。
复盘经验:特征缓存与模型轻量化是 TinyML 时序推理优化的两大杠杆。先消除重复计算,再考虑模型结构替换,往往能以最小改动获得最大收益。同时,重叠率并非越高越好,需在计算量与平滑度之间寻找平衡点。
2.7 总结与设计清单
本章梳理了时序推理的完整链路。在实际项目启动时,建议按以下清单进行初步评估:
| 检查项 | 评估标准 | 优化优先级 |
|---|---|---|
| 窗口长度 W | 是否覆盖 1~2 个完整行为周期 | 高(影响内存与延迟) |
| 重叠率 | 是否超过 50% | 高(决定缓存收益) |
| 特征计算方式 | 是否存在全量重算 | 高(直接节省 CPU) |
| 模型类型 | 是否适合 MCU 算子库 | 中(影响推理时间) |
| 采样与推理 | 是否并行 | 中(影响实时性) |