4、数据采集与标注:如何采集传感器数据、数据格式、采样频率、标注工具与数据集构建方法
TinyML 机器人项目的核心挑战,在于让资源受限的微控制器(MCU)在真实物理世界中做出可靠决策。无论是手势识别、震动检测还是环境感知,模型的性能上限往往不取决于神经网络结构有多精巧,而取决于训练数据的质量与分布。本章将系统讲解从传感器原始信号到可训练数据集的完整链路,涵盖数据采集策略、格式规范、采样频率设定、标注工具选型以及数据集构建的工程方法论。我们将以 IMU(惯性测量单元)和麦克风阵列为例,剖析数据采集中的关键参数与常见陷阱,帮助你在动手训练模型之前,先建立一条稳定、可复现、可扩展的数据生产线。
4.1 传感器数据采集的核心原理与硬件链路
在 TinyML 机器人项目中,传感器数据采集不是简单的“读寄存器”操作,而是一个涉及物理信号感知、模拟前端调理、模数转换(ADC)、数字滤波与时间戳同步的完整链路。以最常见的 IMU(如 MPU6050 或 LSM6DSOX)为例,其内部包含三轴加速度计和三轴陀螺仪,输出数据经过 I2C 或 SPI 接口传输至 MCU。采集链路的关键参数包括:量程(±2g 至 ±16g)、分辨率(通常 16 位)、输出数据速率(ODR,从 1Hz 到 6.6kHz)以及内部低通滤波器截止频率。
对于麦克风阵列(如 PDM 数字麦克风),采集链路则涉及 PDM 时钟频率(典型 1.2MHz 至 3.2MHz)、抽取滤波器(Decimation Filter)以及 PCM 数据输出。此时,MCU 的 DMA 控制器需要高效地将数据搬运至内存缓冲区,避免 CPU 干预导致的数据丢失。理解这些硬件细节,是设定正确采样参数的前提。
4.2 数据格式规范与采样频率设定方法
数据格式决定了后续处理与模型训练的便捷性。在 TinyML 工作流中,常见的数据格式有三种:CSV(逗号分隔值)适合小规模数据集与快速调试;JSON 适合包含丰富元数据(如传感器 ID、采样率、时间戳)的场景;二进制格式(如 .npy 或 .bin)适合大规模数据集与嵌入式部署,因为其解析速度快、占用空间小。无论选择哪种格式,都必须包含以下核心字段:时间戳(Unix 时间或相对时间)、传感器通道值(如 acc_x, acc_y, acc_z, gyro_x, gyro_y, gyro_z)、以及可选的标签字段。
采样频率的设定需要结合信号特性与 MCU 资源。下表给出了不同应用场景的推荐采样率与数据量估算:
| 应用场景 | 传感器类型 | 信号频率范围 | 推荐采样率 | 单通道数据量(1秒) |
|---|---|---|---|---|
| 手势识别 | IMU(6轴) | 0.5 ~ 5 Hz | 50 Hz | 6 × 50 × 2字节 = 600 B |
| 震动检测 | 加速度计 | 10 ~ 100 Hz | 500 Hz | 3 × 500 × 2字节 = 3 KB |
| 关键词唤醒 | PDM麦克风 | 100 ~ 4000 Hz | 16 kHz | 1 × 16000 × 2字节 = 32 KB |
| 电机故障诊断 | 电流/振动 | 50 ~ 1000 Hz | 4 kHz | 2 × 4000 × 2字节 = 16 KB |
在设定采样率时,还需要考虑 MCU 的存储容量与功耗。例如,使用 Arduino Nano 33 BLE Sense(配备 256KB RAM)采集 16kHz 的麦克风数据,1 秒数据即占用 32KB,因此通常采用“滑动窗口 + 边缘触发”的方式,仅在检测到有效信号时才进行连续采集。
4.3 标注工具选择与数据集构建流程
标注是监督学习的基础。对于 TinyML 传感器数据,标注方式与图像标注有显著差异。传感器数据通常是时间序列,标注粒度分为窗口级标注(整个时间窗口属于一个类别)和事件级标注(在连续数据流中标记特定事件的起止时间)。常用的标注工具包括:
- Edge Impulse Studio:专为 TinyML 设计,内置数据采集、标注、训练一站式流程,支持 IMU、麦克风等常见传感器,可直接从开发板采集数据并在线标注。
- Audacity:免费音频编辑器,适合对麦克风数据进行精细的起止点标注,导出标签文件后可与原始数据合并。
- Label Studio:开源标注平台,支持时间序列数据的自定义标注,适合复杂多标签场景。
- Python 脚本 + Matplotlib:对于需要高度定制化的场景,可以编写脚本将传感器数据可视化,通过鼠标交互标注,并保存为 JSON 格式。
数据集构建流程应遵循以下步骤:数据分割(按时间顺序或随机方式划分为训练集 70%、验证集 15%、测试集 15%)、类别平衡(确保每个类别的样本数量相近,避免模型偏向多数类)、数据增强(对时间序列进行加噪、时间拉伸、幅度缩放等操作,增加模型鲁棒性)、版本管理(使用 DVC 或 Git LFS 对数据集进行版本控制,确保实验可复现)。
4.4 实战案例:基于 IMU 的手势识别数据采集与标注
假设我们要构建一个识别“左挥”、“右挥”、“上抬”三种手势的 TinyML 模型,使用 Arduino Nano 33 BLE Sense 板载 IMU。以下是完整的数据采集与标注闭环:
背景与约束:目标设备 RAM 仅 256KB,Flash 1MB,需要将模型大小控制在 50KB 以内。手势动作持续时间约 0.5~1 秒,采样率设定为 50Hz,每个手势样本包含 50 个时间点(1 秒窗口),每个时间点 6 个通道(3 轴加速度 + 3 轴陀螺仪),因此每个样本的数据量为 50 × 6 × 2 字节 = 600 字节。
采集过程:编写 Arduino 固件,通过 I2C 读取 IMU 数据,使用串口以 CSV 格式输出。采集时,要求操作者按照预设动作规范执行,每个动作重复 50 次,共 150 个样本。同时,采集 50 个“无动作”样本作为背景类。为了增加多样性,让 3 位不同操作者分别采集,共 600 个样本。
标注与处理:使用 Edge Impulse 的 Data Acquisition 功能,将串口数据直接导入,并在时间序列上框选每个手势的起止点,标注为“left_swipe”、“right_swipe”、“up_swing”或“idle”。Edge Impulse 自动将数据切分为固定长度的窗口(1 秒,步长 0.5 秒),并生成训练/测试集。
数据增强与结果:对“idle”类样本添加高斯噪声(σ=0.02g)和轻微的时间偏移,将样本量扩充至 200 个。最终数据集包含 800 个训练样本和 200 个测试样本。使用 1D 卷积神经网络(Conv1D)训练,准确率达到 96.5%。
复盘经验:初始采集时,由于操作者动作幅度不一致,导致模型对“上抬”手势的识别准确率仅 82%。通过分析混淆矩阵,发现“上抬”与“左挥”的陀螺仪 Z 轴数据相似。解决方案是增加动作规范说明,并在采集时要求操作者手腕保持伸直,同时增加“上抬”动作的样本数量至 80 次。调整后准确率提升至 96.5%。
4.5 常见误区与总结复盘
在数据采集与标注环节,以下误区最容易导致项目返工:
- 采样率过高或过低:过高导致存储和计算压力,过低导致信号失真。务必先分析信号的频谱,再确定采样率。
- 忽略时间戳同步:多传感器融合时,如果各传感器的时间戳不对齐,模型将无法学习到正确的时序关系。建议使用 MCU 的硬件定时器统一触发采样。
- 标注不一致:多人标注时,不同标注者对动作边界的判断可能不同。应制定详细的标注规范,并进行标注一致性检验(如 Cohen's Kappa 系数)。
- 数据泄露:在数据分割时,如果同一操作者的数据同时出现在训练集和测试集中,模型评估结果会过于乐观。应按照操作者或采集批次进行分组分割。