4、数据标注与数据集:公开数据集(如WISDM、UCI-HAR、MobiAct)介绍,数据标注规范与类别不平衡问题
在TinyML活动识别项目中,数据是模型性能的天花板,而算法只是逼近这个天花板的手段。对于步行、跑步与跌倒检测这类基于惯性传感器(加速度计、陀螺仪)的任务,数据的质量、标注的准确性以及类别的分布直接决定了模型在真实设备上的表现。本章将围绕三大公开数据集(WISDM、UCI-HAR、MobiAct)展开,深入剖析数据标注规范,并重点讨论在跌倒检测场景中几乎必然遇到的类别不平衡问题及其工程化解法。
4.1 三大公开数据集深度对比
选择合适的数据集是TinyML活动识别项目的第一步。WISDM、UCI-HAR和MobiAct是三个最常被引用的公开数据集,但它们的定位、采集方式和适用场景差异显著。理解这些差异,能帮助你在项目初期就避免“数据集与任务不匹配”的致命问题。
4.1.1 WISDM:轻量级手机加速度计数据集
WISDM(Wireless Sensor Data Mining)数据集由美国福特汉姆大学发布,是最早用于活动识别研究的公开数据集之一。它使用手机内置的加速度计,以20Hz的采样率采集了36名受试者的数据,包含步行、慢跑、上楼、下楼、坐、站六类活动。其特点是数据量适中(约100万条样本),文件格式简单(CSV),非常适合作为TinyML模型的入门验证数据。
但WISDM的局限性也很明显:采样率较低(20Hz),对于跌倒这类持续时间短(通常300-500ms)、冲击特征明显的动作,20Hz的采样率可能无法完整捕捉冲击峰值。此外,WISDM不包含跌倒类别,因此它更适合做步行/跑步等日常活动(ADL)的基线模型训练。
4.1.2 UCI-HAR:多传感器融合的经典基准
UCI-HAR(Human Activity Recognition Using Smartphones)数据集由西班牙UC Irvine发布,采集自30名受试者佩戴在腰部的智能手机,使用加速度计和陀螺仪,采样率50Hz。它包含六类活动:步行、上楼、下楼、坐、站、躺。UCI-HAR的显著优势在于:已经做了预处理和特征工程,提供了561维特征向量,方便直接用于传统机器学习模型(如SVM、随机森林)。
对于TinyML场景,UCI-HAR的原始传感器数据(Inertial Signals目录)更适合用于训练轻量级神经网络。但需要注意,UCI-HAR的传感器佩戴位置固定(腰部),如果实际部署时设备放在口袋或手腕上,模型性能会显著下降。这是传感器位置迁移问题,在模型部署前必须考虑。
4.1.3 MobiAct:跌倒检测专用数据集
MobiAct数据集是跌倒检测领域的事实标准,由意大利MobiAct项目组发布。它使用三星Galaxy S3手机,采集了57名受试者的数据,包含加速度计、陀螺仪和磁力计,采样率200Hz(部分版本为100Hz)。MobiAct定义了四大类活动:
- ADL(日常活动):步行、跑步、上下楼、坐、站、捡东西等
- 跌倒(Falls):前向跌倒、后向跌倒、侧向跌倒、从椅子滑落等
- 过渡态(Transition):从坐到站、从站到坐、从躺到坐等
- 复合动作:跌倒后立即起身等
MobiAct的跌倒样本标注非常精细,每个跌倒样本都标注了跌倒开始时间、冲击时刻和结束时间。这对于训练时序模型(如LSTM、TCN)非常宝贵。但MobiAct的数据量相对较小(跌倒样本约2500条),且采集设备较老(Android 4.x),传感器噪声特性与现代设备有差异。
| 对比维度 | WISDM | UCI-HAR | MobiAct |
|---|---|---|---|
| 传感器 | 加速度计 | 加速度计+陀螺仪 | 加速度计+陀螺仪+磁力计 |
| 采样率 | 20Hz | 50Hz | 200Hz |
| 佩戴位置 | 手机(裤袋/手拿) | 腰部 | 手机(裤袋/手拿) |
| 活动类别 | 6类ADL | 6类ADL | ADL+跌倒+过渡态 |
| 是否含跌倒 | 否 | 否 | 是(约2500条) |
| 适合场景 | 入门验证、步行/跑步 | 特征工程、传统ML | 跌倒检测、时序模型 |
4.2 数据标注规范:从原始信号到可用标签
数据标注是连接原始传感器数据与监督学习模型的桥梁。标注质量直接决定了模型的上限。在活动识别场景中,标注不仅仅是“给数据贴标签”,还涉及窗口分割、标签粒度、过渡态处理等一系列规范问题。
4.2.1 窗口分割策略
传感器数据是连续的时间序列,无法直接输入模型。标准做法是使用滑动窗口将数据切分为固定长度的片段。窗口长度和滑动步长的选择需要权衡时间分辨率和计算开销:
- 窗口长度:对于步行/跑步,2-3秒的窗口足够捕捉完整的步态周期(约1-1.5秒);对于跌倒,窗口长度建议为2秒(包含跌倒前0.5秒、冲击瞬间和跌倒后1秒),以便模型学习上下文信息。
- 滑动步长:通常设置为窗口长度的50%(即50%重叠),这样既能保证相邻窗口之间的连续性,又不会产生过多冗余数据。重叠窗口可以增加训练样本量,但要注意在训练/测试划分时避免同一段数据同时出现在训练集和测试集中(数据泄露)。
4.2.2 标签粒度与过渡态处理
标签粒度决定了模型能学到什么。在活动识别中,有两种常见的标注方式:
- 逐样本标注:每个时间点都有一个标签。这种方式标注成本高,但模型可以学习到精确的动作边界。适用于需要检测动作起止时刻的场景(如跌倒冲击时刻)。
- 逐窗口标注:整个窗口共享一个标签。这是TinyML中最常用的方式,因为模型输出的是窗口级别的分类结果。标注效率高,但会丢失窗口内部的时序细节。
过渡态(如从坐到站)是标注中最容易产生歧义的部分。一个窗口可能同时包含“坐”和“站”两种状态。建议的规范是:以窗口内占比超过60%的活动作为该窗口的标签,并在标注文档中明确这一规则。对于跌倒检测,过渡态窗口(如跌倒后立即起身)应单独标注,避免与“跌倒”类别混淆。
4.2.3 标注质量控制流程
标注错误是不可避免的,但可以通过流程控制将错误率降到最低。推荐以下标注流程:
标注流程(以MobiAct为例):
1. 原始数据采集:受试者按脚本执行动作,同时记录传感器数据
2. 初步标注:标注员A根据视频录像或动作脚本,为每个窗口打标签
3. 交叉验证:标注员B独立标注同一批数据,计算标注一致性(Cohen's Kappa)
4. 争议解决:Kappa < 0.8 的样本由标注员C仲裁
5. 最终确认:标注结果由项目负责人审核,生成最终标签文件
6. 版本管理:记录标注日期、标注员、标注规则版本,便于追溯
4.3 类别不平衡问题:跌倒检测的核心挑战
在真实场景中,跌倒事件是低频事件。一个老年人可能一天中99.9%的时间都在进行日常活动,只有极少数时间发生跌倒。这种类别不平衡问题会导致模型严重偏向多数类(ADL),而忽略少数类(跌倒)。在TinyML场景中,由于模型容量有限,不平衡问题的影响更加显著。
4.3.1 不平衡程度的量化
不平衡比(Imbalance Ratio, IR)是衡量类别分布差异的指标:
IR = 多数类样本数 / 少数类样本数
以MobiAct为例:
- ADL样本:约200,000个窗口
- 跌倒样本:约2,500个窗口
- IR = 200,000 / 2,500 = 80:1
这意味着模型即使把所有样本都预测为ADL,准确率也能达到98.8%。
因此,在类别不平衡场景下,准确率(Accuracy)不是合适的评估指标。应该使用精确率(Precision)、召回率(Recall)、F1分数和PR-AUC(Precision-Recall Area Under Curve)作为主要评估指标。
4.3.2 数据层面的平衡策略
数据层面的方法通过调整训练数据的分布来缓解不平衡问题:
- 随机过采样(Random Oversampling):从少数类中随机复制样本,直到与多数类数量接近。简单有效,但容易导致过拟合(因为复制的样本完全相同)。
- SMOTE(Synthetic Minority Over-sampling Technique):在少数类样本的K近邻之间进行线性插值,生成新的合成样本。对于传感器数据,SMOTE可以在特征空间生成合理的合成样本,但要注意不要跨越类别边界。
- 随机欠采样(Random Undersampling):从多数类中随机删除样本。会丢失大量信息,一般不推荐用于TinyML。
- 数据增强:对少数类样本进行旋转、缩放、添加噪声等变换,生成多样化的训练样本。对于传感器数据,常见的增强方法包括:时间扭曲(Time Warping)、幅度缩放(Magnitude Scaling)、添加高斯噪声等。
4.3.3 算法层面的平衡策略
算法层面的方法通过修改训练过程或模型结构来应对不平衡:
- 加权损失函数(Weighted Loss):在交叉熵损失中为少数类分配更高的权重。例如,跌倒类的权重设为10,ADL类的权重设为1。这样模型在训练时会更加关注跌倒样本。
- 阈值调整(Threshold Tuning):模型默认输出概率大于0.5时预测为正类。在不平衡场景下,可以将跌倒类的判定阈值降低到0.3或0.2,以提高召回率。但阈值过低会降低精确率,需要根据业务需求权衡。
- 代价敏感学习(Cost-Sensitive Learning):为不同类型的错误分配不同的代价。例如,将跌倒误判为ADL的代价设为10,将ADL误判为跌倒的代价设为1。模型在训练时会倾向于避免高代价的错误。
4.4 案例拆解:基于MobiAct的跌倒检测模型数据准备
下面通过一个完整的案例,展示如何将MobiAct数据集处理为适合TinyML模型训练的数据集,并解决类别不平衡问题。
4.4.1 项目背景与约束
假设我们要为一个智能手环开发跌倒检测功能。硬件约束:MCU主频80MHz,RAM 256KB,Flash 1MB。模型需要实时运行,每2秒输出一次分类结果。业务要求:跌倒检测召回率≥95%,误报率≤1次/天。
4.4.2 数据准备步骤
步骤1:数据筛选与预处理
从MobiAct中提取加速度计和陀螺仪的X/Y/Z轴数据。由于MobiAct采样率为200Hz,而我们的目标采样率为50Hz(降低功耗),需要对原始数据进行降采样。使用抗混叠滤波器(如Butterworth低通滤波器,截止频率25Hz)后再降采样,避免混叠效应。
# 降采样伪代码
from scipy import signal
# 设计低通滤波器
b, a = signal.butter(4, 25, fs=200, btype='low')
# 滤波
filtered_data = signal.filtfilt(b, a, raw_data)
# 降采样到50Hz
downsampled_data = filtered_data[::4]
步骤2:窗口分割与标签分配
使用2秒窗口(100个采样点@50Hz),滑动步长1秒(50%重叠)。对于每个窗口,根据MobiAct的标注文件确定标签。如果窗口内包含跌倒冲击时刻,则标记为“跌倒”;否则标记为“ADL”。过渡态窗口(如跌倒后起身)单独标记为“过渡态”,但在本案例中,我们将过渡态归入ADL类,以简化问题。
步骤3:类别不平衡处理
经过窗口分割后,我们得到约180,000个ADL窗口和2,200个跌倒窗口,IR≈82:1。采用以下策略:
- 数据增强:对跌倒窗口进行时间扭曲(随机缩放时间轴0.8-1.2倍)、幅度缩放(随机缩放0.9-1.1倍)、添加高斯噪声(σ=0.05g)。每种增强生成2个新样本,将跌倒样本扩展到6,600个。
- 加权损失:在交叉熵损失中,设置跌倒类权重为5,ADL类权重为1。这样即使增强后IR≈27:1,模型仍然会重点关注跌倒样本。
步骤4:数据集划分
按受试者划分数据集,确保同一受试者的数据不会同时出现在训练集和测试集中。使用40名受试者训练,10名受试者验证,7名受试者测试。这种受试者独立划分方式能更真实地评估模型的泛化能力。
4.4.3 结果与复盘
使用一个轻量级1D-CNN模型(3层卷积+2层全连接,参数量约50K)进行训练。在测试集上的结果为:
| 评估指标 | 未处理不平衡 | 数据增强+加权损失 |
|---|---|---|
| 准确率 | 98.7% | 97.2% |
| 跌倒召回率 | 61.3% | 95.8% |
| 跌倒精确率 | 82.5% | 76.4% |
| F1分数 | 0.703 | 0.850 |
可以看到,虽然准确率略有下降,但跌倒召回率从61.3%提升到95.8%,F1分数从0.703提升到0.850。在跌倒检测场景中,召回率比准确率重要得多——漏报一次跌倒可能导致严重后果。
4.4.4 复盘经验
从这个案例中,我们可以总结出以下经验:
- 不要被准确率迷惑:在不平衡场景下,准确率是“虚高”的指标,必须关注召回率和精确率的平衡。
- 数据增强要谨慎:时间扭曲和幅度缩放对传感器数据有效,但过度的增强会引入噪声,导致模型学习到不真实的模式。
- 受试者独立划分是必须的:如果随机划分,同一受试者的数据会同时出现在训练和测试集中,导致模型“记住”了受试者的个体特征,泛化能力被高估。
- TinyML部署时要考虑量化影响:上述模型在浮点精度下F1为0.850,但量化为8位整数后,F1可能下降到0.82左右。需要在训练时加入量化感知训练(QAT)来缓解。
4.5 常见误区与总结
在数据标注与数据集处理中,以下误区需要特别注意:
- 误区1:直接使用原始数据而不做窗口分割。传感器数据是连续的,必须分割成固定长度的窗口才能输入模型。窗口长度和步长的选择需要根据动作持续时间和硬件算力来权衡。
- 误区2:忽略传感器佩戴位置的影响。同一个模型,在腰部采集的数据和在手腕采集的数据,特征分布差异巨大。如果训练数据来自腰部,部署在手腕上,模型性能会急剧下降。解决方案是收集目标佩戴位置的数据,或使用域适应(Domain Adaptation)技术。
- 误区3:在类别不平衡时使用准确率评估。如前所述,准确率在不平衡场景下会严重失真。应使用F1分数、PR-AUC等指标。
- 误区4:数据增强过度导致过拟合。数据增强的目的是增加多样性,但如果增强幅度过大,模型会学习到增强引入的伪模式,反而损害泛化能力。
- 误区5:忽略数据泄露。在窗口分割时,如果训练集和测试集来自同一受试者的相邻窗口,模型会“记住”时间上的连续性,导致评估结果过于乐观。务必按受试者划分数据集。