4. 数据预处理

在TinyML姿态识别项目中,IMU(惯性测量单元)输出的原始数据几乎不可能直接用于模型训练或推理。传感器本身存在零偏、温漂、噪声,而人体动作产生的信号往往叠加在低频趋势和高频干扰之上。如果跳过数据预处理,轻则模型精度下降,重则导致动作分类完全失效。本章围绕数据清洗、去噪滤波、校准标定和时间序列切片四个核心环节,系统讲解从原始IMU数据到可训练样本的完整处理链路。

IMU数据预处理链路 原始IMU数据 加速度计+陀螺仪 含噪声/零偏/离群点 数据清洗 去除离群点/缺失值 滑动窗口统计过滤 滤波去噪 低通/高通/卡尔曼 消除高频抖动与漂移 校准标定 零偏补偿 尺度因子校正 时间序列切片 滑动窗口/重叠切片 生成训练样本 关键参数配置 • 采样率:50-200Hz • 低通截止:5-15Hz • 窗口长度:1-3秒 • 重叠率:50%-75% 输出到模型训练 • 样本形状:(N, 窗口长度, 6) • 标签:动作类别 • 训练/验证/测试集划分 预处理质量直接影响模型精度与泛化能力

4.1 数据清洗:剔除异常与缺失

核心原理:IMU传感器在数据采集过程中,可能因硬件抖动、通信丢包、电源波动等原因产生离群点(spike)或缺失值。这些异常值如果不加处理,会被模型误认为真实动作特征,导致分类错误。数据清洗的目标是识别并处理这些异常,保证数据质量。

判断方法:常用的离群点检测方法包括:

  • 阈值法:设定加速度计或陀螺仪的合理范围(如加速度±4g,角速度±2000°/s),超出范围即视为异常。
  • 滑动窗口统计法:计算窗口内数据的均值与标准差,若某点偏离均值超过3σ,则判定为离群点。
  • 差分法:计算相邻采样点的差值,若差值突变超过物理极限(如加速度突变超过2g/ms),则标记为异常。

对于缺失值,可采用线性插值或前向填充法处理。在TinyML场景下,由于计算资源有限,推荐使用简单的前向填充或删除该段数据。

风险提示:清洗过度会丢失真实动作特征,尤其是快速动作(如挥手、跳跃)本身就会产生较大的加速度突变。建议先观察原始数据分布,再设定合理的清洗阈值。

4.2 滤波去噪:低通、高通与卡尔曼滤波

核心原理:IMU信号中的噪声主要分为两类:高频随机噪声(由电子器件热噪声、振动引起)和低频漂移(由温度变化、积分累积误差引起)。滤波的目标是根据信号频率特性,保留有用信号成分,抑制噪声。

滤波类型 适用场景 截止频率/参数 优缺点
低通滤波 去除高频振动噪声,保留动作低频成分 5-15Hz(人体动作频率通常低于10Hz) 实现简单,但会引入相位延迟
高通滤波 去除低频漂移和重力分量 0.1-0.5Hz 可消除积分漂移,但会削弱慢速动作信号
卡尔曼滤波 融合加速度计与陀螺仪数据,估计姿态 需建立状态方程和观测方程 精度高,但计算量大,TinyML设备需优化

操作流程:在TinyML项目中,推荐使用一阶或二阶IIR低通滤波器,因其计算量小、适合嵌入式实现。例如,一阶低通滤波公式为:

y[n] = α * x[n] + (1 - α) * y[n-1]
其中 α = 1 / (1 + 2π * fc / fs)
fc为截止频率,fs为采样率

卡尔曼滤波虽然精度更高,但在资源受限的MCU上需要简化矩阵运算,通常只用于姿态解算而非原始信号滤波。

经验建议:对于动作分类任务,低通滤波通常足够。先尝试5Hz截止频率,观察分类精度;若动作包含快速冲击(如拍手),可适当提高至10Hz。

4.3 数据校准:零偏补偿与标定

核心原理:IMU传感器在静止状态下,加速度计输出应为1g(重力加速度),陀螺仪输出应为0°/s。但由于制造误差和温度影响,实际输出存在零偏(bias)和尺度因子误差。校准的目标是消除这些系统性误差。

校准方法:

  1. 零偏校准:将设备静止放置30秒以上,计算输出均值作为零偏值,后续采样值减去该值。
  2. 六面标定法:将设备分别朝上、朝下、左、右、前、后六个方向静止,记录加速度计输出,通过最小二乘法求解尺度因子和零偏。
  3. 陀螺仪温漂补偿:在设备上电后预热2分钟,记录静止时的陀螺仪输出作为温漂补偿值。

校准后的数据应满足:静止时加速度计模长接近1g,陀螺仪输出接近0。

案例拆解:某TinyML手势识别项目使用MPU6050传感器,初始采集时发现静止状态下加速度计Z轴输出为1.12g,陀螺仪X轴有0.5°/s的漂移。通过六面标定法,计算出Z轴尺度因子为0.89,X轴零偏为-0.5°/s。校准后,静止状态下的加速度模长误差从0.12g降至0.02g,模型分类准确率从82%提升至91%。

4.4 时间序列切片:构建训练样本

核心原理:IMU数据是连续的时间序列,而动作分类需要固定长度的输入。时间序列切片通过滑动窗口将连续数据切分为固定长度的样本,每个样本对应一个动作类别标签。

切片参数设计:

  • 窗口长度:根据动作持续时间确定。例如,挥手动作约1秒,若采样率为100Hz,则窗口长度为100个采样点。
  • 重叠率:通常设为50%-75%,以增加样本数量并避免动作边界被截断。
  • 标签分配:窗口中心点对应的动作标签作为该样本的标签。

操作流程:

def sliding_window(data, window_size, overlap):
    step = int(window_size * (1 - overlap))
    samples = []
    for i in range(0, len(data) - window_size + 1, step):
        samples.append(data[i:i+window_size])
    return samples

切片后的数据形状为(样本数,窗口长度,特征维度),其中特征维度为6(加速度计3轴+陀螺仪3轴)。

常见误区:窗口长度过短会丢失动作上下文,过长则引入无关数据。建议先统计动作时长分布,再设定窗口长度。另外,切片时需确保训练集和测试集不重叠,避免数据泄漏。

4.5 预处理流程总结与实战要点

完整的预处理流程为:原始数据 → 数据清洗 → 滤波去噪 → 校准标定 → 时间序列切片 → 训练样本。在实际项目中,还需注意以下几点:

环节 关键参数 调试建议
采样率 50-200Hz 根据动作频率设定,过高增加计算量,过低丢失细节
低通截止频率 5-15Hz 观察频谱图,选择信号能量集中区域
窗口长度 1-3秒 统计动作时长,取中位数或略大于最大值
重叠率 50%-75% 样本不足时提高重叠率,但需注意过拟合

在TinyML部署阶段,预处理代码需移植到C语言并优化内存占用。例如,将滤波系数预先计算为整数定点数,避免浮点运算;切片操作改为环形缓冲区实现,减少数据拷贝。

复盘经验:预处理环节的调试应基于可视化分析。将原始数据、滤波后数据、校准后数据分别绘制曲线图,对比观察噪声消除效果和动作特征保留情况。不要盲目追求滤波效果而丢失动作的细微特征,尤其是快速动作的峰值信息。