2、基础知识:传感器数据的特点、特征工程在TinyML中的挑战与基本流程

TinyML 的起点并非模型结构,而是传感器输出的原始数据流。在嵌入式设备上部署机器学习模型时,我们面对的不是整洁的表格,而是由加速度计、陀螺仪、麦克风、温湿度传感器等硬件持续产生的时序信号。这些信号带有强烈的物理属性、噪声干扰和资源约束。理解传感器数据的内在规律,明确特征工程在内存、功耗、实时性三重限制下的设计原则,是构建可靠 TinyML 应用的前提。本章将系统梳理传感器数据的三大核心特点,剖析特征工程在边缘场景中的特殊挑战,并给出一个可落地的标准处理流程。

TinyML 特征工程核心链路 传感器数据特点 • 时序性:采样率、窗口、趋势 • 噪声:高斯、脉冲、漂移 • 高维:多轴、多通道、多模态 • 资源受限:内存/功耗/算力 TinyML 特征工程挑战 • 内存:特征缓冲区 < 10KB • 功耗:特征计算 < 1mW • 实时性:延迟 < 50ms • 精度:特征区分度 基本流程 ① 原始数据采集 ② 预处理(去噪/去趋势) ③ 窗口化与分段 ④ 特征提取与选择 特征工程在 TinyML 中的落地路径 原始数据 IMU/麦克风/环境 预处理 滤波/去直流/校准 窗口化 滑动窗口/重叠 特征提取 时域/频域/统计 模型推理 分类/回归 关键约束:特征向量内存 < 2KB | 特征计算时间 < 10ms | 支持定点运算 典型特征数:5-20 个/窗口 | 采样率:20-200Hz | 窗口长度:1-5秒 设计原则:先分析数据分布 → 再选择特征 → 最后量化部署

2.1 传感器数据的三大核心特点

传感器数据与普通数据库记录有本质区别。它是由物理世界连续变化量经采样、量化后得到的离散时间序列。在 TinyML 场景中,我们主要处理以下三类数据:运动传感器(加速度计、陀螺仪、磁力计)、环境传感器(温湿度、气压、气体)以及音频传感器(麦克风)。这些数据具有三个显著特点,直接影响特征工程的设计策略。

2.1.1 强时序性与非平稳性

传感器数据本质上是时间序列,相邻样本之间存在强相关性。以 50Hz 采样率的加速度计为例,相邻两个样本的时间间隔为 20ms,人体动作的持续时间通常在 0.5~3 秒之间,这意味着一个完整动作包含 25~150 个采样点。这种时序性要求特征提取必须考虑上下文信息,不能将每个采样点视为独立样本。

更关键的是,传感器数据通常是非平稳的。以工业设备振动监测为例,设备在启动阶段、稳定运行阶段和停机阶段的振动特征完全不同;人体活动识别中,走路、跑步、上下楼梯的加速度信号在幅度、频率和周期性上均有显著差异。非平稳性意味着我们不能使用固定的全局统计量来描述整个数据流,而必须采用滑动窗口机制,在局部时间片段内提取特征。

经验提醒:窗口长度的选择需要权衡。窗口过短(如 0.2 秒)无法捕捉完整的动作周期,导致特征不稳定;窗口过长(如 10 秒)则增加内存占用和推理延迟,且可能包含多个动作的混合信号。对于人体活动识别,1~3 秒窗口配合 50% 重叠是常用配置。

2.1.2 多源噪声与干扰

传感器数据中的噪声来源复杂,大致可分为三类:电子噪声(由传感器自身电路产生,表现为高频随机波动)、环境干扰(如电磁干扰、电源纹波、机械振动耦合)以及人为伪迹(如佩戴松动、设备碰撞产生的瞬时尖峰)。噪声的存在会显著降低特征的可区分度,例如在语音识别中,50Hz 工频干扰会污染频谱特征;在跌倒检测中,碰撞产生的瞬时冲击可能被误判为有效动作。

噪声处理需要分级策略:硬件层面通过低通滤波器(如 RC 滤波)抑制高频噪声;软件层面采用移动平均、中值滤波或高通滤波去除基线漂移。但必须注意,过度滤波会丢失有效信号成分,例如在跌倒检测中,冲击信号的频率成分较高,过度低通滤波会削弱关键特征。

2.1.3 高维度与多模态特性

现代智能设备通常集成多个传感器,每个传感器又包含多个轴。以常见的 9 轴惯性测量单元(IMU)为例,包含 3 轴加速度计、3 轴陀螺仪和 3 轴磁力计,若以 50Hz 采样,每秒产生 450 个数据点。如果直接将这些原始数据送入模型,不仅计算量巨大,而且容易过拟合。高维度的本质是信息冗余——相邻轴之间存在相关性,不同传感器之间也存在耦合。特征工程的核心任务之一就是降维,从高维原始数据中提取出最具区分度的低维特征向量。

数据类型 采样率范围 维度 典型噪声源 特征提取重点
加速度计 20~200Hz 3 轴 重力分量、振动 时域统计、频域能量
陀螺仪 20~200Hz 3 轴 角速度漂移、温漂 积分角度、角速度方差
麦克风 8~48kHz 1 通道 环境噪声、回声 MFCC、过零率、频谱质心
温湿度 0.5~2Hz 2 通道 热噪声、量化误差 均值、变化率、阈值

2.2 特征工程在 TinyML 中的四大挑战

与云端或 PC 端不同,TinyML 设备通常是电池供电的 MCU(微控制器),其资源极度受限。特征工程的设计必须围绕以下四个约束展开。

2.2.1 内存约束:特征缓冲区与模型共存

典型的 TinyML 设备(如 Cortex-M4 内核 MCU)拥有 64KB~256KB 的 SRAM。其中,模型权重、中间激活值、运行时栈和特征缓冲区需要共享这块有限的内存。以一个包含 20 个特征的向量为例,若使用 float32 存储,需要 80 字节;但若使用 int8 量化存储,仅需 20 字节。更关键的是,特征提取过程中需要暂存原始数据窗口。假设采样率为 50Hz,窗口长度为 2 秒,3 轴加速度计,则一个窗口包含 300 个 float32 数据点,占用 1200 字节。如果同时缓存多个窗口用于重叠计算,内存占用会成倍增加。

风险提示:在 MCU 上动态分配内存(malloc)可能导致内存碎片化,且分配时间不确定。建议在编译期静态分配特征缓冲区,并采用环形缓冲区(ring buffer)管理原始数据流。

2.2.2 功耗约束:特征计算与无线传输的权衡

MCU 的功耗主要由计算、内存访问和无线传输三部分构成。在特征工程中,复杂的数学运算(如 FFT、开方、三角函数)会显著增加功耗。以 32 点 FFT 为例,在 48MHz 的 Cortex-M4 上执行约需 0.5ms,消耗约 0.1mJ 能量。相比之下,一次无线传输(BLE 广播)消耗约 0.5mJ。这意味着,在本地进行特征提取并仅传输特征向量,比传输原始数据更省电。但特征提取本身也有功耗,因此需要寻找计算复杂度与传输功耗之间的平衡点。

2.2.3 实时性约束:特征计算延迟与系统响应

许多 TinyML 应用对实时性有硬性要求。例如,工业异常检测要求在故障发生后 100ms 内发出警报;可穿戴跌倒检测要求在跌倒发生后 500ms 内触发 SOS。特征提取的计算时间必须远小于应用允许的延迟预算。以 128 点 FFT 为例,在 80MHz 的 MCU 上执行约需 2ms,加上窗口滑动和特征计算,总耗时约 5ms,可以满足大多数实时性要求。但如果使用复杂的时频分析(如小波变换),计算时间可能超过 50ms,就需要考虑简化算法或使用硬件加速器。

2.2.4 精度约束:特征区分度与量化误差

MCU 通常不支持浮点运算或浮点运算较慢,因此特征计算常使用定点数(如 Q15 格式)或整数运算。量化过程会引入误差,例如将 float32 的加速度值转换为 int16 时,量化步长为 0.001g(假设量程为 ±32g),这可能导致特征值(如方差、峰值)产生微小偏差。在特征选择时,应优先选择对量化误差不敏感的特征,例如均值、过零率,而避免使用对精度敏感的熵值或高阶矩。

2.3 特征工程的基本流程

在 TinyML 中,特征工程不是一次性完成的工作,而是一个迭代优化的过程。标准流程包含以下五个阶段:

  1. 数据采集与标注:在目标设备上采集原始数据,并同步记录标签。采集时需覆盖不同用户、不同环境、不同姿态,确保数据多样性。
  2. 预处理:包括去直流分量(消除重力加速度影响)、滤波(去除高频噪声)、校准(修正传感器偏移和尺度因子)。预处理的目标是提高信噪比,但不改变信号的基本形态。
  3. 窗口化:将连续数据流切分为固定长度的片段。窗口长度和重叠率是关键超参数,需要根据动作持续时间和采样率确定。
  4. 特征提取:从每个窗口中计算候选特征。常用特征包括时域特征(均值、方差、均方根、峰值、过零率)、频域特征(FFT 峰值、频谱能量、频谱质心)以及统计特征(偏度、峰度、相关系数)。
  5. 特征选择与降维:从候选特征中筛选出最具区分度的子集。常用方法包括方差阈值、相关系数分析、主成分分析(PCA)或基于模型的特征重要性排序。
核心原则:特征工程的目标不是提取尽可能多的特征,而是在资源约束下提取最具区分度的特征。一个包含 10 个精心设计特征的模型,往往优于包含 50 个冗余特征的模型,且内存占用更小、推理速度更快。

2.4 实战场景:可穿戴设备的人体活动识别

下面通过一个具体的案例来说明上述流程的应用。假设我们要在 STM32L4 系列 MCU(Cortex-M4,128KB SRAM,80MHz)上实现一个简单的人体活动识别系统,区分静止、走路和跑步三种状态。

初始条件:使用 3 轴加速度计,采样率 50Hz,量程 ±16g。MCU 的 SRAM 预算为 20KB(留给特征工程部分),功耗预算为 5mW(特征计算部分)。

第一步:数据采集。在 5 名受试者的手腕上佩戴设备,分别记录静止(坐姿)、走路(自然步速)和跑步(慢跑)各 5 分钟的数据。共采集 15 分钟数据,按 2 秒窗口切分,得到 450 个样本(每类 150 个)。

第二步:预处理。原始加速度数据包含重力分量(约 1g 的直流偏置)。使用一阶高通滤波器(截止频率 0.5Hz)去除直流分量,保留动态加速度。同时使用 3 阶中值滤波去除瞬时尖峰。

第三步:窗口化。采用 2 秒窗口,50% 重叠(即步长 1 秒)。每个窗口包含 100 个采样点 × 3 轴 = 300 个数据点。使用环形缓冲区存储,内存占用 300 × 2 字节(int16)= 600 字节。

第四步:特征提取。从每个窗口的每个轴提取以下特征:

  • 均值(反映静态分量,已去除重力后接近 0)
  • 方差(反映活动强度)
  • 均方根(RMS,反映信号能量)
  • 峰值(窗口内最大值)
  • 过零率(反映频率特性)
  • 频谱质心(使用 32 点 FFT 计算,反映主频位置)

每个轴 6 个特征,3 轴共 18 个特征。每个特征使用 int16 存储,特征向量总大小为 36 字节。

第五步:特征选择。通过计算每个特征与标签的相关系数,发现“方差”和“频谱质心”对三类活动的区分度最高。静止时方差接近 0,频谱质心低;走路时方差中等,频谱质心约 2Hz;跑步时方差大,频谱质心约 3Hz。最终保留 6 个特征(3 轴的方差 + 3 轴的频谱质心),特征向量大小降至 12 字节。

结果对比:使用 18 个特征训练一个 3 层全连接神经网络(输入 18,隐藏层 16,输出 3),模型大小约 1.2KB,准确率 96.5%。使用 6 个特征后,模型大小降至 0.6KB,准确率 95.8%,仅下降 0.7 个百分点,但内存占用减少 50%,推理时间从 8ms 降至 3ms。

复盘经验:特征选择比特征提取更重要。在本案例中,通过分析特征与标签的相关性,我们剔除了 12 个冗余特征,换来了更小的模型和更快的推理。在 TinyML 中,“少即是多”是特征工程的核心哲学。

2.5 常见误区与总结

在 TinyML 特征工程实践中,开发者常犯以下错误:

  • 误区一:照搬 PC 端特征工程方法。例如直接使用 1024 点 FFT 或复杂的时频分析,导致 MCU 无法实时处理。应优先选择计算简单的时域特征,仅在必要时使用短点数 FFT。
  • 误区二:忽视数据分布差异。在实验室采集的数据与真实场景数据存在分布偏移(如佩戴位置不同、个体差异),导致特征失效。应在多个场景下采集数据,并验证特征的鲁棒性。
  • 误区三:特征数量越多越好。在资源受限的 MCU 上,每个特征都占用内存和计算时间。应通过特征选择方法精简特征集,避免维度灾难。
  • 误区四:忽略量化影响。在 PC 上使用 float32 提取特征效果良好,但移植到 MCU 后使用 int16 量化,特征值可能发生偏移。应在目标硬件上验证特征的一致性。

总结而言,TinyML 特征工程的核心是在内存、功耗、实时性和精度四个维度之间寻找最优平衡。设计者需要深入理解传感器数据的物理特性,合理选择预处理方法,精心设计窗口参数,并采用系统化的特征选择策略。一个成功的 TinyML 特征工程方案,往往不是最复杂的,而是最适配硬件约束的。