数据采集基础:使用手机、开发板或传感器采集数据,理解数据格式、采样率、时间序列与图像数据的基本要求

在Edge Impulse端侧训练项目中,数据采集是决定模型性能的基石。许多初学者将大量精力投入到模型架构与超参数调优上,却忽视了数据采集环节,最终导致模型在真实场景中表现不佳。本章将系统讲解如何利用手机、开发板及各类传感器完成高质量数据采集,深入剖析数据格式、采样率、时间序列与图像数据的基本要求,帮助您建立一套科学、可复现的数据采集方法论。

Edge Impulse 数据采集链路与关键参数 数据源层 手机(加速度/麦克风/相机) 开发板(STM32/ESP32/nRF) 外部传感器(I2C/SPI/模拟) 采样率:10Hz ~ 100kHz 数据格式层 CSV / JSON / WAV / JPG 时间戳 + 多轴数值 int16 / float32 / uint8 窗口长度:1s ~ 10s Edge Impulse 平台 数据上传与标注 时频域特征提取 模型训练与部署 支持增量学习 关键参数决策矩阵 采样率 ≥ 2倍信号最高频率 动作识别:50Hz 窗口长度 覆盖完整动作周期 语音:20-40ms 样本数量 每类 ≥ 100个样本 覆盖多用户/多环境 数据平衡 各类别样本数均衡 避免类别偏差 数据采集标准流程 1. 场景定义 明确目标与约束 2. 参数选择 采样率/窗口/格式 3. 数据采集 多设备/多场景 4. 质量验证 可视化/统计检查 5. 上传 标注与分割

核心原理:数据采集为何决定模型上限

端侧训练模型与云端模型最大的差异在于:端侧模型通常参数量更小、计算资源受限,因此对输入数据的质量要求更为苛刻。Edge Impulse的完整工作流遵循"数据→特征→模型→部署"的链路,其中数据采集环节直接决定了后续特征提取的有效性和模型泛化能力。一个在实验室环境中采集的完美数据集,如果忽略了真实场景中的噪声、设备差异和用户多样性,训练出的模型在部署后往往会出现严重的性能衰减。

从信号处理的角度看,数据采集本质上是将物理世界的连续模拟信号转换为数字世界离散样本的过程。这一过程涉及三个核心参数:采样率(每秒采集的样本数)、分辨率(每个样本的位深)和通道数(同时采集的信号维度)。根据奈奎斯特采样定理,采样率必须至少为信号最高频率成分的两倍,才能无失真地重建原始信号。例如,人体运动信号的频率通常集中在0.5Hz至20Hz之间,因此50Hz的采样率已经足够;而音频信号需要覆盖20Hz至20kHz的听觉范围,采样率至少需要40kHz(CD音质为44.1kHz)。

在Edge Impulse中,数据采集还需要考虑窗口长度(window length)和滑动步长(window stride)的概念。窗口长度决定了每次送入模型进行推理的样本片段大小,它必须能够覆盖一个完整的动作周期或事件模式。例如,识别"挥手"动作可能需要2秒的窗口,而识别"敲击"可能只需要200毫秒。滑动步长则影响推理的实时性和计算负载,步长越小,推理越频繁,但功耗也越高。

核心原则:数据采集的目标不是"尽可能多",而是"尽可能代表真实场景"。一个包含1000个样本但全部来自同一用户、同一环境的数据集,其价值远不如包含200个样本但覆盖5个用户、3种环境的数据集。在开始采集之前,请先明确模型的部署场景、目标用户群体和环境条件。

数据格式与采样率:从传感器到Edge Impulse的标准化流程

Edge Impulse支持多种数据上传方式,包括通过手机App(Edge Impulse Mobile)、开发板固件(Data Forwarder)、以及SD卡或串口上传CSV文件。无论采用哪种方式,数据最终都需要转换为平台可识别的格式。理解数据格式的底层逻辑,有助于您在采集过程中避免常见的格式错误。

时间序列数据格式是Edge Impulse最常用的数据类型,适用于加速度计、陀螺仪、磁力计、麦克风等传感器。其基本结构为:每一行代表一个采样时刻,每一列代表一个传感器通道。以下是一个典型的三轴加速度计CSV格式示例:

timestamp,acc_x,acc_y,acc_z
1609459200000,0.12,-0.34,9.81
1609459200020,0.15,-0.31,9.78
1609459200040,0.18,-0.29,9.82
...

其中,timestamp为Unix毫秒时间戳,acc_x/acc_y/acc_z为三轴加速度值(单位通常为m/s²或g)。Edge Impulse要求时间戳必须是单调递增的,且采样间隔尽量均匀。如果使用Data Forwarder通过串口上传数据,时间戳可以由平台自动生成,但需要确保串口传输的波特率与采样率匹配,避免数据积压导致时间戳漂移。

图像数据格式相对简单,Edge Impulse支持JPG、PNG等常见格式,但需要注意以下几点:

  • 分辨率:建议使用640×480或更低分辨率,过高的分辨率会增加传输和训练时间,且端侧模型通常无法利用超高分辨率细节。
  • 色彩空间:默认使用RGB三通道,如果任务不依赖颜色信息(如边缘检测),可以转换为灰度图以减少计算量。
  • 文件命名:建议采用"类别_序号.扩展名"的命名方式,便于后续标注和管理。

关于采样率的选择,下表总结了常见应用场景的推荐参数:

应用场景 传感器类型 推荐采样率 推荐窗口长度 数据格式
人体活动识别(走路/跑步) 加速度计 50Hz 2-4秒 CSV(3轴)
手势识别(挥动/旋转) 加速度计+陀螺仪 100Hz 1-2秒 CSV(6轴)
语音命令(唤醒词) 麦克风 16kHz 1秒 WAV
工业振动监测 加速度计 1kHz-5kHz 0.5-1秒 CSV(单轴)
图像分类(物体识别) 摄像头 N/A(帧率) 单帧 JPG/PNG
经验提醒:在设置采样率时,不要盲目追求高采样率。过高的采样率会导致数据量激增、功耗上升,且可能引入高频噪声。一个实用的方法是:先以理论值的2-3倍进行预采集,通过频谱分析观察信号的主要能量集中范围,再调整到合适的采样率。

操作流程:使用手机与开发板采集数据的完整步骤

下面分别介绍使用手机和开发板采集数据的标准操作流程,这两种方式覆盖了Edge Impulse最常见的入门路径。

方式一:使用Edge Impulse Mobile手机App

手机内置的加速度计、陀螺仪、麦克风和摄像头使其成为最便捷的数据采集工具。Edge Impulse Mobile App支持iOS和Android平台,操作步骤如下:

  1. 创建项目:在Edge Impulse官网创建新项目,获取API Key。
  2. 连接设备:在手机App中输入API Key,选择目标项目,连接成功后App会显示可用的传感器列表。
  3. 配置采样参数:选择传感器类型(如加速度计)、采样率(如50Hz)、窗口长度(如2秒)。
  4. 开始采集:点击"Start"按钮,按照预设的动作模式(如"挥手")执行动作,App会实时显示波形并自动保存数据。
  5. 标注与上传:为每组数据添加标签(如"wave"),点击上传,数据将自动同步到Edge Impulse平台。

手机采集的优点是零硬件成本、上手快,适合快速验证想法;缺点是手机传感器精度有限,且无法控制采样时序的精确性(操作系统调度可能导致时间戳抖动)。

方式二:使用开发板(以STM32 + IMU传感器为例)

开发板采集适合需要精确控制采样时序、或需要接入外部传感器的场景。以常见的STM32F4系列搭配MPU6050六轴IMU为例:

  1. 硬件连接:将MPU6050通过I2C接口(SCL/SDA)连接至STM32,供电电压3.3V,注意上拉电阻配置。
  2. 固件开发:使用STM32CubeMX配置I2C和UART外设,编写固件读取MPU6050的加速度和角速度数据,并通过UART以CSV格式输出。
  3. 配置Data Forwarder:在Edge Impulse的Devices页面下载Data Forwarder工具,配置串口端口和波特率(如115200),指定CSV格式的列名。
  4. 数据流式上传:运行Data Forwarder,开发板通过USB串口持续发送数据,Data Forwarder将数据实时转发至Edge Impulse平台。
  5. 实时监控:在Edge Impulse的Data Acquisition页面可以实时查看波形,确认数据质量后点击"Stop"保存样本。

开发板采集的关键在于固件中采样时序的稳定性。建议使用定时器中断(如TIM2)触发ADC或I2C读取,确保采样间隔精确。以下是一个简化的STM32定时器中断配置示例:

// 定时器2配置,1ms中断一次(即1kHz采样率)
void TIM2_Init(void) {
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    TIM_TimeBaseInitTypeDef TIM_InitStruct;
    TIM_InitStruct.TIM_Prescaler = 84 - 1;  // 84MHz/84 = 1MHz
    TIM_InitStruct.TIM_Period = 1000 - 1;   // 1MHz/1000 = 1kHz
    TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_InitStruct);
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    NVIC_InitTypeDef NVIC_InitStruct;
    NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
    TIM_Cmd(TIM2, ENABLE);
}

// 中断服务函数中读取IMU数据
void TIM2_IRQHandler(void) {
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) {
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
        // 读取MPU6050数据并格式化输出
        Read_MPU6050_And_Send();
    }
}

案例拆解:工业设备振动监测的数据采集实战

为了更好地理解数据采集的完整流程,我们以一个工业电机振动监测项目为例进行拆解。该项目的目标是通过加速度计采集电机振动信号,识别电机是否处于正常、轴承磨损或转子不平衡三种状态。

背景与约束:电机转速为1500RPM(即25Hz),轴承故障特征频率通常在100Hz至500Hz之间。现场环境存在较强的电磁干扰和工频噪声(50Hz)。项目要求使用低成本的STM32F103开发板,部署在电机外壳上,通过WiFi模块将数据上传至Edge Impulse平台。

初始现象与目标:初步尝试使用手机App采集振动数据,但发现手机加速度计的量程(±2g)不足以捕捉电机的高频振动细节,且手机无法固定在电机外壳上。因此改用开发板+工业级加速度计(ADXL345,量程±16g)的方案。

关键参数决策:

  • 采样率:根据轴承故障特征频率最高500Hz,按照奈奎斯特定理,采样率至少1000Hz。考虑到需要留出抗混叠滤波的裕量,最终选择2000Hz采样率。
  • 窗口长度:电机振动信号是周期性的,但故障特征可能间歇出现。选择1秒窗口(即2000个采样点),既能覆盖多个旋转周期,又不会产生过大的延迟。
  • 数据格式:使用CSV格式,包含时间戳和单轴加速度值(Z轴垂直于电机表面)。
  • 样本数量:每种状态采集200个样本,共600个样本,其中80%用于训练,20%用于验证。

实际操作步骤:

  1. 将ADXL345通过I2C连接至STM32F103,配置量程为±16g,输出数据速率为3200Hz(实际使用2000Hz采样)。
  2. 编写固件,使用定时器中断以2000Hz频率读取加速度数据,通过UART以CSV格式输出。
  3. 使用Edge Impulse Data Forwarder配置串口参数,将数据流式上传至平台。
  4. 在平台上创建三个标签(normal、bearing_wear、rotor_unbalance),分别采集三种状态的数据。
  5. 采集过程中,通过平台的实时波形监控功能检查数据质量,发现部分样本存在明显的尖峰噪声,分析后确认是电机启动瞬间的冲击信号,决定在采集时避开启动阶段。

结果对比与复盘:使用2000Hz采样率采集的数据,在Edge Impulse中经过FFT频谱分析,可以清晰看到轴承磨损特征频率(约230Hz)的峰值,而使用手机采集的数据(采样率100Hz)完全无法分辨这些特征。最终模型在验证集上的准确率达到97.3%。复盘经验:采样率的选择必须基于信号的物理特性,而非设备的最大能力;同时,采集环境中的电磁干扰需要通过屏蔽和滤波处理,否则会污染数据。

风险提示:在工业现场采集数据时,务必注意传感器安装的机械耦合。如果传感器仅用双面胶固定,高频振动信号会因共振而失真。建议使用螺纹安装或强力胶固定,并确保传感器轴线与振动方向对齐。

常见误区与总结复盘

在数据采集环节,初学者最容易犯以下几类错误,需要特别警惕:

  • 采样率不足或过高:采样率不足导致信号混叠,高频成分被折叠到低频区域;采样率过高则产生大量冗余数据,增加存储和计算负担。解决方法是先进行预采集,通过频谱分析确定信号的有效带宽。
  • 忽略时间戳均匀性:使用手机或操作系统调度采集时,时间戳可能出现抖动。Edge Impulse在特征提取时会假设采样间隔均匀,如果时间戳不均匀,会导致频谱分析结果失真。解决方法是使用开发板+定时器中断,或对手机数据进行重采样。
  • 数据类别不平衡:如果"正常"状态采集了500个样本,而"故障"状态只采集了50个样本,模型会严重偏向多数类。解决方法是确保每类样本数量接近,或使用数据增强技术(如添加噪声、时间偏移)扩充少数类。
  • 忽视环境多样性:只在实验室环境采集的数据,在真实场景中往往表现不佳。建议在不同时间、不同温度、不同操作人员条件下采集数据,增加数据的鲁棒性。
  • 标注不一致:多人协作标注时,对"正常"和"异常"的界定可能不同。建议制定明确的标注规范,并在标注后进行交叉验证。