4、数据采集与标注:如何采集传感器数据、数据格式、采样频率、标注工具与数据集构建方法

TinyML 机器人项目的核心挑战,在于让资源受限的微控制器(MCU)在真实物理世界中做出可靠决策。无论是手势识别、震动检测还是环境感知,模型的性能上限往往不取决于神经网络结构有多精巧,而取决于训练数据的质量与分布。本章将系统讲解从传感器原始信号到可训练数据集的完整链路,涵盖数据采集策略、格式规范、采样频率设定、标注工具选型以及数据集构建的工程方法论。我们将以 IMU(惯性测量单元)和麦克风阵列为例,剖析数据采集中的关键参数与常见陷阱,帮助你在动手训练模型之前,先建立一条稳定、可复现、可扩展的数据生产线。

TinyML 传感器数据采集与标注工程链路 物理世界 手势/震动/声音 传感器采样 IMU/PDM麦克风 数据格式化 CSV/JSON/二进制 标注与增强 Edge Impulse/LabelImg 采样频率设定 Nyquist + 余量 时间戳对齐 多传感器同步 标注工具 Edge Impulse / Audacity 数据集构建核心流程 数据分割 → 类别平衡 → 数据增强 → 版本管理 输出:训练集 / 验证集 / 测试集(.json / .csv / .npy) 关键点: • 采样率匹配信号带宽 • 标注粒度(窗口级/事件级) • 数据平衡与增强 • 时间戳同步

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 干预导致的数据丢失。理解这些硬件细节,是设定正确采样参数的前提。

核心原则:采样频率必须遵循奈奎斯特采样定理,即采样率至少为信号最高频率分量的两倍。但工程实践中,建议采样率设置为信号最高频率的 5~10 倍,以留出抗混叠滤波器的过渡带余量。例如,手势识别中人体动作频率通常低于 5Hz,IMU 采样率设为 50Hz 即可;而语音识别需要捕捉 4kHz 以上的频率成分,麦克风采样率至少需要 16kHz。

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 对数据集进行版本控制,确保实验可复现)。

常见误区:许多初学者在采集数据时,只在一个固定环境、固定角度下采集,导致模型泛化能力极差。正确的做法是:在多个不同场景(如不同光照、不同背景噪声、不同操作者)下采集数据,并记录每个样本的元数据(环境描述、操作者 ID、设备 ID),以便后续分析模型失败原因。

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%。

经验提醒:在采集数据时,务必记录每个样本的“操作者 ID”和“采集批次”。如果后续发现模型在特定用户上表现不佳,可以针对性地补充该用户的数据,而不是盲目增加所有用户的数据量。

4.5 常见误区与总结复盘

在数据采集与标注环节,以下误区最容易导致项目返工:

  1. 采样率过高或过低:过高导致存储和计算压力,过低导致信号失真。务必先分析信号的频谱,再确定采样率。
  2. 忽略时间戳同步:多传感器融合时,如果各传感器的时间戳不对齐,模型将无法学习到正确的时序关系。建议使用 MCU 的硬件定时器统一触发采样。
  3. 标注不一致:多人标注时,不同标注者对动作边界的判断可能不同。应制定详细的标注规范,并进行标注一致性检验(如 Cohen's Kappa 系数)。
  4. 数据泄露:在数据分割时,如果同一操作者的数据同时出现在训练集和测试集中,模型评估结果会过于乐观。应按照操作者或采集批次进行分组分割。