3. 传感器数据采集基础

在TinyML测试数据集的构建中,传感器数据采集是决定模型泛化能力与部署效果的第一道关口。无论是板端回放还是真实传感器输入,其本质都是将物理世界的连续模拟信号转换为数字系统可处理的离散序列。这一过程涉及三个核心维度:数据格式(如何编码与存储)、采样率与量纲(如何定义时间分辨率与物理意义)、时间戳处理(如何对齐多源数据流)。本章将围绕加速度计、麦克风、摄像头三类典型传感器,系统讲解数据采集的基础规范与工程实践要点。

传感器数据采集链路与关键参数映射 物理世界 加速度/声波/光强 连续模拟信号 传感器前端 加速度计 (I2C/SPI) 麦克风 (PDM/I2S) 摄像头 (DVP/MIPI) 信号调理 放大/滤波/抗混叠 ADC 量化 数据格式封装 int16/uint8/float32 帧结构/字节序 量纲归一化 采样率控制 定时器/中断驱动 Nyquist 准则 多传感器同步 时间戳处理 单调时钟/epoch 中断时间戳捕获 插值与对齐 测试数据集生成 CSV/二进制/TFRecord 格式 数据帧结构

上图展示了从物理世界到测试数据集的完整链路。传感器前端将物理量转换为电信号,经过信号调理与ADC量化后,以特定数据格式输出。采样率控制与时间戳处理贯穿整个采集过程,最终生成可用于TinyML模型训练与验证的数据集。下面我们将逐一拆解每个环节的技术细节。

3.1 常见传感器数据格式与编码规范

不同传感器因其物理原理和应用场景差异,数据格式截然不同。理解这些格式是正确解析数据、避免字节序错误和精度丢失的前提。

3.1.1 加速度计:整数与浮点的权衡

加速度计(如MPU6050、LIS3DH)通常通过I2C或SPI接口输出。其原始数据格式为16位有符号整数(int16),范围-32768至+32767。量程可通过寄存器配置为±2g、±4g、±8g或±16g。实际物理加速度值需通过以下公式换算:

// 以±2g量程为例
float accel_g = raw_int16 / 16384.0f;  // 1g = 16384 LSB
// 若量程为±4g,则1g = 8192 LSB

这种整数格式的优势在于传输效率高、无需浮点运算,适合MCU直接处理。但需要注意:不同厂商的灵敏度(LSB/g)不同,在数据集标注时必须记录量程配置,否则回放时无法还原真实物理量。

3.1.2 麦克风:PDM与I2S的差异

数字麦克风(如ICS-43434)输出PDM(脉冲密度调制)或I2S(集成电路内置音频总线)格式。PDM是1-bit流,需要经过抽取滤波器转换为PCM数据;I2S则直接输出16位或24位PCM样本。常见采样率为8kHz、16kHz、48kHz。音频数据的量纲为振幅(无单位),通常归一化到[-1.0, 1.0]浮点范围或[-32768, 32767]整数范围。

关键点:PDM麦克风在MCU上需要额外的抽取滤波计算,而I2S麦克风可直接DMA传输。在板端回放测试中,若使用PDM麦克风,必须确保回放数据与采集时的抽取滤波器配置一致。

3.1.3 摄像头:像素格式与帧结构

摄像头输出格式多样,常见的有:

  • 灰度图(GRAY8):每像素1字节,值域0-255,适合低算力TinyML场景。
  • RGB565:每像素2字节,R占5位、G占6位、B占5位,节省带宽。
  • JPEG压缩流:适合传输,但解码需要额外算力。

摄像头数据量远大于加速度计和麦克风,通常需要DMA和帧缓冲管理。在数据集采集中,应记录分辨率、色彩空间、裁剪区域等元数据。

传感器类型 典型数据格式 位宽 量纲 接口
加速度计 int16 原始值 16-bit g (重力加速度) I2C/SPI
麦克风 PCM int16 / float32 16/24-bit 振幅 (归一化) PDM/I2S
摄像头 GRAY8 / RGB565 / JPEG 8/16-bit 像素亮度/颜色 DVP/MIPI

3.2 采样率选择与多传感器同步策略

采样率决定了时间分辨率,直接影响模型能捕捉的频率特征。根据Nyquist定理,采样率必须大于信号最高频率的2倍。但实际工程中,还需考虑MCU算力、存储带宽和功耗。

3.2.1 采样率设定的工程准则

  • 加速度计:人体活动识别通常用50-100Hz;振动分析需1kHz以上。
  • 麦克风:语音识别常用16kHz;超声波检测需100kHz以上。
  • 摄像头:帧率通常为15-30fps,但TinyML视觉任务常降至5-10fps以降低算力。

多传感器同步是测试数据集构建中的难点。例如,在“跌倒检测”场景中,加速度计和麦克风数据必须时间对齐。常用方法有:

  1. 硬件同步:使用同一中断源触发所有传感器采样。
  2. 时间戳插值:各传感器独立采样,记录时间戳后通过线性插值对齐。
  3. FIFO缓冲:利用传感器内置FIFO,批量读取并附加时间信息。

3.3 时间戳处理:从单调时钟到数据对齐

时间戳是连接不同数据流的“粘合剂”。在板端回放测试中,时间戳的精度直接影响回放时序的准确性。

3.3.1 时间戳的两种类型

单调时钟(Monotonic Clock):从系统启动开始计数,不受系统时间调整影响,适合测量时间间隔。在MCU上通常使用SysTick或定时器实现,精度可达微秒级。墙上时钟(Wall Clock):即Unix时间戳(epoch),用于跨设备同步,但可能因NTP调整而跳变。

风险提示:在TinyML设备上,不要直接使用millis()作为高精度时间戳,因为其分辨率通常只有1ms,且可能受中断影响。推荐使用32位定时器直接读取计数值,并记录定时器频率。

3.3.2 时间戳捕获的最佳实践

// 在传感器中断服务函数中捕获时间戳
volatile uint32_t timestamp_us;
void sensor_ISR(void) {
    timestamp_us = TIMER->CNT;  // 读取定时器计数值
    // 将数据与timestamp_us一起存入FIFO
}

这种“中断时间戳捕获”方式能确保时间戳与数据样本的对应关系,避免因主循环调度延迟导致的时间偏差。

3.4 实战案例:多传感器跌倒检测数据集采集

下面通过一个完整的案例,展示如何将上述原理应用于实际数据集构建。

背景与目标:某团队需要为老人跌倒检测TinyML模型构建测试数据集。设备搭载加速度计(100Hz)、麦克风(16kHz)和气压计(50Hz)。要求数据能区分“跌倒”、“坐下”、“行走”三类动作。

初始现象:首次采集的数据在模型训练时准确率仅72%,且回放测试时出现时序错乱。

关键参数分析:

  • 加速度计原始int16值未转换为g单位,导致不同设备间数据分布不一致。
  • 麦克风数据未归一化,振幅范围在[-0.3, 0.3]之间,而回放时使用了[-1.0, 1.0]的假设。
  • 时间戳仅用millis()记录,精度不足导致加速度计与麦克风对齐误差达±5ms。

操作步骤:

  1. 将加速度计量程固定为±4g,并在数据头部记录灵敏度8192 LSB/g。
  2. 对麦克风PCM数据做归一化处理,存储为float32格式。
  3. 改用32位定时器(1MHz分辨率)记录时间戳,在传感器中断中捕获。
  4. 编写离线脚本,根据时间戳对三路数据进行最近邻插值对齐。

结果对比:处理后模型准确率提升至91%,回放测试时序误差降至±0.1ms以内。

复盘经验:数据格式的统一和量纲标准化是数据集可复用的前提;时间戳精度必须高于最高采样率的周期,否则无法准确重建时序关系。

3.5 常见误区与总结

经验提醒:在构建测试数据集时,务必在文件头或元数据中记录传感器型号、量程、采样率、时间戳分辨率等参数。这些信息在模型部署到不同硬件时至关重要。

常见误区包括:

  • 忽略量纲转换:直接使用原始整数训练模型,导致模型对设备敏感。
  • 采样率不匹配:回放时使用与采集时不同的采样率,造成数据失真。
  • 时间戳精度不足:使用低分辨率时钟导致多传感器数据错位。
  • 字节序错误:在x86主机上解析ARM设备采集的数据时,未处理大小端问题。

总结而言,传感器数据采集是TinyML测试数据集构建的基石。只有确保数据格式规范、采样率合理、时间戳精确,才能保证后续的板端回放测试真实反映模型在物理世界中的表现。建议在项目初期就制定统一的数据采集规范,并编写验证脚本检查数据完整性。