4、数据准备与预处理:数据清洗、去噪、归一化、时间序列与图像数据的格式化、数据增强策略

在Edge Impulse端侧模型训练的工作流中,数据准备与预处理是决定模型性能上限的关键环节。端侧模型(TinyML)通常运行在资源受限的MCU或低功耗DSP上,其参数量小、计算能力有限,因此对输入数据的质量与格式高度敏感。如果原始数据未经清洗、去噪或归一化,即便采用最先进的网络结构,模型在真实部署时也可能出现严重的过拟合或推理漂移。本章将系统拆解从原始传感器数据到可训练数据集的完整加工链路,涵盖数据清洗、去噪、归一化、时间序列与图像数据的格式化,以及数据增强策略,并结合Edge Impulse平台的具体操作给出可落地的工程建议。

数据准备与预处理工程链路 原始数据源 IMU / 麦克风 / 摄像头 环境传感器 / 日志 数据清洗与去噪 异常值剔除 / 滤波 缺失值处理 / 平滑 时间戳对齐 / 去重 归一化与格式化 Min-Max / Z-Score 窗口切片 / 尺寸调整 通道重排 / 数据类型转换 数据增强 时域扰动 / 加噪 裁剪 / 翻转 / 混合 合成数据生成 数据集构建 训练/验证/测试划分 特征工程 FFT / MFCC / 统计特征 模型训练与验证 EON Tuner / 交叉验证 端侧部署与推理 量化 / 内存优化 / 实时性 迭代优化 关键约束 内存 < 100KB · 延迟 < 50ms

上图展示了从原始数据到端侧部署的完整数据加工链路。在实际项目中,数据准备往往占据整个开发周期60%以上的时间,而Edge Impulse平台通过内置的预处理模块(如Spectral Analysis、Image Preprocessing)将部分流程自动化,但理解底层原理仍然至关重要。下面我们将逐一深入每个环节。

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

核心原理:传感器数据在采集过程中常因硬件抖动、环境干扰、通信丢包等原因产生异常值(Outlier)和缺失值(Missing Value)。异常值会扭曲统计特征(如均值、方差),导致模型学习到错误的边界;缺失值则会造成时间序列不连续,影响窗口切片的完整性。数据清洗的目标是识别并处理这些“脏数据”,使数据集尽可能反映真实物理世界。

判断方法与操作流程:

  1. 可视化初筛:在Edge Impulse的“Data Explorer”中查看原始波形,标记明显超出物理范围的尖峰(例如加速度计读数超过±16g)。
  2. 统计阈值法:计算每个通道的均值和标准差,将超出均值±3σ的样本视为异常候选。
  3. 缺失值处理:对于时间序列,若缺失点少于总长度的5%,可采用线性插值或前向填充;若超过20%,建议删除该段数据。
  4. 去重与时间戳对齐:多传感器采集时,需确保所有通道的时间戳同步,否则后续窗口切片会错位。
风险提示:清洗过度会丢失真实物理信息。例如,在振动监测中,某些“异常尖峰”可能代表真实的冲击事件,直接剔除会导致模型漏检。建议先保留原始数据备份,清洗后与领域专家确认异常值的物理含义。

4.2 去噪:从时域滤波到频域特征提取

核心原理:噪声是叠加在真实信号上的随机扰动,主要来源包括电源工频干扰(50/60Hz)、机械振动噪声、热噪声等。去噪的目标是提高信噪比(SNR),让模型关注有效信号成分。在端侧场景中,去噪必须考虑计算开销,复杂的自适应滤波(如卡尔曼滤波)可能不适合MCU实时运行。

常用去噪方法对比:

方法适用场景计算开销Edge Impulse实现
移动平均滤波平滑缓变信号(温度、湿度)极低自定义Block
中值滤波去除脉冲噪声(尖峰)低自定义Block
高通/低通滤波分离特定频段(如去除直流偏置)低Spectral Analysis内置
小波去噪非平稳信号(语音、振动)高不推荐端侧

实战建议:在Edge Impulse中,对于加速度计或麦克风数据,通常先使用“Spectral Analysis”模块自动提取FFT频谱特征,这本身就有带通滤波的效果。如果原始时域波形噪声明显,可在“Processing Block”中先添加一个简单的移动平均或中值滤波,再进入特征提取。

4.3 归一化:让特征尺度一致

核心原理:不同传感器通道的量纲和数值范围差异巨大(例如加速度计读数在±2g,而温度读数在20-40℃)。如果不做归一化,模型训练时梯度更新会被大数值特征主导,导致收敛缓慢或陷入局部最优。归一化还能提高量化部署时的数值稳定性。

两种主流方法:

  • Min-Max归一化:将数据线性映射到[0,1]区间,公式为x' = (x - min) / (max - min)。适用于已知边界的数据(如图像像素0-255)。
  • Z-Score标准化:使数据均值为0、标准差为1,公式为x' = (x - μ) / σ。适用于数据分布近似高斯的情况,对异常值更鲁棒。
Edge Impulse操作要点:在“Create Impulse”页面中,每个Processing Block的输出都可以设置“Scale”选项。对于图像数据,平台默认自动将像素值除以255;对于时间序列,建议在自定义代码块中手动计算训练集的均值和标准差,并保存为常量供推理时使用。注意:归一化参数必须从训练集计算,并直接应用于验证集和测试集,避免数据泄漏。

4.4 时间序列与图像数据的格式化

时间序列格式化:原始传感器数据是连续流,必须切割成固定长度的窗口(Window)才能训练模型。窗口长度取决于物理事件的持续时间(例如一个手势约1秒,则采样率50Hz时窗口长度为50个样本)。Edge Impulse支持滑动窗口(重叠率通常设为50%-75%)以增加样本数量。格式化时还需注意:每个窗口必须包含完整的类别标签,且窗口边界不能跨越不同类别的数据段。

图像数据格式化:端侧视觉模型通常接受固定尺寸输入(如96×96或128×128像素)。格式化步骤包括:

  1. 尺寸调整:使用双线性插值或最近邻法缩放图像,保持宽高比并填充边缘。
  2. 通道处理:灰度图转为单通道,RGB图保持三通道,必要时进行通道均值归一化。
  3. 数据类型转换:将uint8像素值转为float32,再除以255归一化。

案例拆解:工业缺陷检测的数据格式化

某工厂需要检测传送带上的金属零件表面划痕,使用Edge Impulse训练一个二分类模型(正常/缺陷)。原始图像由工业相机采集,分辨率为1920×1080,帧率30fps。约束条件:部署设备为STM32H7系列MCU,内存仅1MB,推理延迟要求小于100ms。

初始现象:直接使用原始分辨率训练,模型参数量过大,无法部署;且光照变化导致误检率高。

分析判断过程:首先将图像中心裁剪为正方形(1080×1080),再缩放至96×96像素,这样保留了关键区域且大幅减少计算量。然后对每个通道计算训练集的均值(如R通道均值=142.3),推理时减去该均值并除以255。最后采用随机亮度调整和水平翻转进行数据增强。

实际操作步骤:

# 在Edge Impulse自定义Block中实现
import cv2
import numpy as np

def preprocess(image):
    # 中心裁剪
    h, w = image.shape[:2]
    s = min(h, w)
    x = (w - s) // 2
    y = (h - s) // 2
    cropped = image[y:y+s, x:x+s]
    # 缩放
    resized = cv2.resize(cropped, (96, 96), interpolation=cv2.INTER_LINEAR)
    # 归一化
    normalized = (resized.astype(np.float32) - MEAN) / 255.0
    return normalized

结果对比:原始方案模型大小约2.3MB,量化后仍超内存;格式化后模型仅需180KB,推理延迟62ms,准确率从91.2%提升至96.8%(因为裁剪去除了无关背景干扰)。

风险与代价:中心裁剪可能丢失边缘区域的缺陷,后续通过增加随机裁剪增强来缓解。

4.5 数据增强策略:扩充有限样本

核心原理:端侧项目往往面临数据采集成本高、样本量不足的问题。数据增强通过对现有样本施加不影响语义标签的变换,生成新的训练样本,提高模型泛化能力。但增强必须保持物理真实性——例如对加速度计数据做随机旋转,不能超出传感器实际可能输出的范围。

不同数据类型增强策略:

数据类型增强方法注意事项
时间序列(IMU)随机缩放、添加高斯噪声、时间扭曲、通道交换缩放因子控制在0.9-1.1之间
音频背景噪声叠加、音调偏移、时间拉伸保持采样率不变
图像随机裁剪、翻转、旋转(±15°)、亮度/对比度调整旋转角度不宜过大,避免语义变化

Edge Impulse内置增强:平台在“Data Augmentation”选项卡中提供基础增强功能,但更灵活的方式是在自定义Processing Block中实现。注意:增强应在训练时动态进行(on-the-fly),而不是预先保存所有增强样本,否则会占用大量存储空间。

经验总结:数据增强不是越多越好。过度增强会引入噪声,导致模型欠拟合。建议从轻量增强开始(如添加5%的高斯噪声),逐步增加强度,并通过验证集准确率监控效果。对于时间序列数据,优先使用时间扭曲和缩放,因为它们模拟了真实世界中运动速度的变化。

4.6 常见误区与复盘

  • 误区一:先归一化再划分数据集。正确做法是先划分训练/验证集,再在训练集上计算归一化参数,否则验证集信息会泄漏到训练过程。
  • 误区二:忽略数据平衡。若类别A样本是类别B的10倍,模型会偏向A。可通过欠采样、过采样或调整类别权重解决。
  • 误区三:清洗时删除所有“异常”。某些异常可能是关键事件信号,建议先可视化并咨询领域专家。
  • 误区四:图像增强过度。例如对数字识别任务做90°旋转,会导致6和9难以区分。

总结复盘:数据准备的核心原则是“保持物理真实性,控制计算开销”。在Edge Impulse中,建议建立标准化的数据预处理流水线,将清洗、去噪、归一化、格式化、增强封装为可复用的代码块。每次修改预处理参数后,重新训练并对比验证集指标,记录最佳配置。端侧模型对数据质量极其敏感,一个干净、格式规范、增强合理的数据集,往往比更换网络结构带来更显著的性能提升。