4、数据采集与标注:如何构建高质量标注数据集
智能穿戴设备的误报优化,本质上是一场数据驱动的工程实践。无论是剧烈运动导致的心率尖峰、松动佩戴引发的信号断续,还是传感器漂移造成的基线偏移,其根因都隐藏在原始传感器时序数据之中。若没有一套覆盖真实场景、标签定义清晰、经过严格清洗与平衡处理的标注数据集,任何算法优化都如同在流沙上筑塔。本章将系统拆解高质量标注数据集的构建全流程,从场景模拟到标签体系,从清洗规则到平衡策略,为后续模型训练与规则调优奠定数据基石。
4.1 真实场景模拟:让数据“长”在用户手腕上
实验室环境采集的数据往往过于“干净”,无法触发误报的临界条件。真实场景模拟的核心原则是“以误报触发条件为导向”,即先分析历史误报日志,反推需要覆盖的物理场景,再设计采集协议。以心率误报为例,典型触发条件包括:手臂高频摆动(跑步摆臂频率2.5-3.5Hz)、腕带与皮肤间隙超过2mm(松动)、传感器窗口被汗液或污渍遮挡(光学路径改变)、以及温度骤变导致的基线漂移(如从空调房到户外)。
采集方案应包含三个层次:受控实验室模拟(使用机械臂模拟规律摆动,可重复性强)、半自然场景(受试者按脚本执行特定动作序列,如“快走30秒→突然加速跑→急停→甩手”)、完全自由生活(受试者佩戴一周,记录日常活动,通过日志标注特殊事件)。对于松动佩戴场景,建议使用不同腕围的受试者,并在采集过程中人为调整表带松紧度,同时记录佩戴松紧等级(紧/正常/松/极松)作为辅助标签。
4.2 标签定义:从“好/坏”到多维语义
标签体系的设计直接决定模型能学到什么。对于误报优化任务,建议采用三级标签结构:一级标签为信号质量类别(0-正常,1-运动伪迹,2-松动伪迹,3-传感器漂移,4-其他异常);二级标签为具体行为上下文(跑步、跳绳、挥拍、打字、睡眠等);三级标签为置信度评分(1-5分,5分表示标注员完全确定)。这种结构允许模型在不同粒度上学习,例如先判断“是否异常”,再判断“属于哪类异常”,最后结合上下文修正。
标注时间粒度建议采用滑动窗口+事件标记结合的方式。滑动窗口固定为2秒(步进1秒),每个窗口赋予一个主标签;同时记录事件起止时间戳(如“松动开始于12:03:15,结束于12:03:22”)。对于边界模糊的样本(如从正常到松动的过渡段),应单独标记为“过渡态”,避免强制二分类造成标签噪声。标注工具推荐使用ELAN或自研Web标注平台,支持波形缩放、频谱叠加显示、多通道同步回放。
| 标签层级 | 字段名 | 取值示例 | 标注依据 |
|---|---|---|---|
| 一级 | signal_quality | 0/1/2/3/4 | 波形形态、频谱能量分布、PPG信噪比 |
| 二级 | activity_context | running/jumping/typing/sleeping | 加速度计频谱、陀螺仪角速度、视频同步 |
| 三级 | confidence | 1-5 | 标注员主观判断、多标注员一致性 |
| 辅助 | wear_status | tight/normal/loose/very_loose | 采集时记录、图像验证 |
多标注员一致性是标签质量的生命线。建议至少2名标注员独立标注同一批数据(约10%的样本),计算Cohen's Kappa系数。若Kappa低于0.8,需重新培训标注员并细化标注规则。对于争议样本,由专家仲裁并记录仲裁理由,形成“标注规则版本日志”。
4.3 数据清洗:剔除“脏数据”而不误伤“难样本”
数据清洗的目标是去除物理上不可能或传感器硬件故障产生的数据,但必须保留那些“看似异常但真实存在”的误报触发样本。清洗流程分为四步:物理合理性校验、信号质量指数(SQI)计算、时间戳对齐修复、人工复核。
物理合理性校验包括:加速度幅值是否超过±16g(硬件量程)、PPG值是否超出[0, 4095] ADC范围、连续相同值是否超过1秒(传感器死锁)、相邻采样点跳变是否超过阈值(尖峰噪声)。SQI计算综合时域和频域特征,例如PPG信号的峰谷比、加速度计高频能量占比、信号熵值。建议设定SQI阈值(如0.6),低于阈值的窗口标记为“低质量”,但不直接删除——而是单独存放,用于测试模型在极端噪声下的鲁棒性。
# 伪代码:SQI计算与清洗决策
def compute_sqi(acc_x, acc_y, acc_z, ppg):
# 时域特征:峰谷差、方差、过零率
ppg_peak_valley = np.ptp(ppg)
acc_energy = np.sqrt(acc_x**2 + acc_y**2 + acc_z**2).mean()
# 频域特征:高频占比(>5Hz)
fft_ppg = np.fft.fft(ppg)
high_freq_ratio = np.sum(np.abs(fft_ppg[5:])) / (np.sum(np.abs(fft_ppg)) + 1e-6)
# 综合评分
sqi = 0.4 * (ppg_peak_valley / 2000) + 0.3 * (1 - high_freq_ratio) + 0.3 * min(acc_energy / 3.0, 1.0)
return np.clip(sqi, 0, 1)
# 清洗决策:SQI < 0.3 且 非目标场景 → 剔除;SQI < 0.3 但属于目标误报场景 → 保留并标记
if sqi < 0.3 and label not in ['motion_artifact', 'loose_artifact']:
drop_window()
else:
keep_window(mark_low_quality=True)
时间戳对齐问题常被忽视。多传感器(ACC/GYRO/PPG)可能由不同芯片驱动,存在微秒级延迟。若不对齐,特征提取时会出现“加速度计领先PPG 20ms”的系统误差。建议使用互相关法估计延迟,并重采样至统一时间基准。清洗完成后,应统计各标签类别的样本量分布,为平衡策略提供输入。
4.4 平衡策略:让模型“见过”足够多的误报样本
真实场景中,“正常”样本远多于“误报”样本,比例可能达到50:1甚至更高。若不处理,模型会倾向于将所有样本预测为“正常”,从而获得极高准确率但零召回率。平衡策略的目标是让训练集中各类别比例可控,同时不丢失真实分布信息。
常用方法包括:欠采样(随机丢弃多数类样本,适用于多数类冗余场景)、过采样(复制少数类样本,简单但易过拟合)、SMOTE合成(在少数类样本的特征空间内插值生成新样本,适用于特征维度较低的场景)、分段加权(在损失函数中为少数类样本赋予更高权重,不改变数据分布)。对于时序数据,推荐窗口级SMOTE变体——在保持时间连续性的前提下,对窗口内特征做小幅扰动(如添加高斯噪声、时间轴微伸缩)。
跨受试者划分是另一个关键点。同一受试者的数据高度相关(皮肤特性、佩戴习惯、运动模式),若训练集和验证集包含同一受试者的不同时段数据,模型可能“记住”个体特征而非泛化规律。推荐采用Leave-One-Subject-Out (LOSO)交叉验证,或至少保证训练集与验证集的受试者无重叠。
4.5 案例拆解:从误报日志到平衡数据集的完整闭环
背景与约束:某健康手环产品收到用户投诉,称“跳绳时心率从120bpm瞬间跳到185bpm,持续10秒后回落”。工程师分析日志发现,该误报由PPG信号被跳绳时手腕旋转产生的周期性遮挡触发。团队需构建一个包含此类场景的标注数据集,用于训练异常检测模型。
初始现象与目标:现有数据集包含500小时正常数据,但仅有2小时跳绳数据(且未标注)。目标是在2周内构建一个包含至少10小时跳绳场景、5小时松动场景、3小时漂移场景的标注数据集,并完成清洗与平衡。
关键输入数据与参数:原始日志显示误报时加速度计Z轴频谱在2.8Hz处有强峰(跳绳频率),PPG信号出现周期性“凹陷”(遮挡)。采集时使用同一型号手环,采样率ACC 100Hz、PPG 50Hz,受试者腕围14-18cm。
分析判断过程:团队决定采用“脚本化采集+自由生活补充”双轨方案。脚本化采集设计5种跳绳节奏(慢速60次/分、中速90次/分、快速120次/分、双摇、交叉跳),每种持续5分钟,中间穿插30秒休息。同时安排3名受试者佩戴手环进行自由跳绳,并通过手机App记录开始/结束时间。松动场景通过调整表带扣位实现(正常→松一格→松两格),并让受试者做甩手、挥臂动作。
实际操作步骤:① 设计采集App,同步记录ACC/GYRO/PPG数据和视频(用于标注参考);② 招募12名受试者,完成知情同意;③ 执行脚本化采集(每人约1.5小时),同时记录佩戴松紧等级;④ 自由生活采集持续3天,要求受试者每天跳绳至少10分钟;⑤ 标注团队使用ELAN对视频和波形同步标注,一级标签区分“正常/运动伪迹/松动伪迹/漂移”,二级标签记录具体动作;⑥ 计算标注一致性,Kappa=0.85,对争议样本(主要出现在“松动”与“运动伪迹”边界)进行专家仲裁,补充标注规则(如“若PPG信号在遮挡后1秒内恢复,判为运动伪迹;若持续衰减超过3秒,判为松动伪迹”)。
结果对比:清洗前原始数据共180小时,清洗后保留152小时(剔除15%低质量数据)。类别分布从最初的“正常:异常=45:1”平衡至“正常:异常=5:1”(通过SMOTE合成和欠采样结合)。使用平衡后数据集训练一个1D-CNN模型,在保留的真实分布验证集上,误报率从优化前的8.2次/天降至1.5次/天,召回率从0.32提升至0.78。
风险与代价:SMOTE合成样本可能引入不真实的特征组合,导致模型在极端场景下误判。为此,团队保留了一个“纯真实样本”测试集(不包含合成样本),确保模型在真实数据上的表现不退化。此外,标注成本较高(12人×3天×2小时),但相比后续算法返工,这笔投入是值得的。
复盘经验:① 场景模拟必须基于真实误报日志反推,不能凭空设计;② 标签规则需要“活文档”管理,随争议样本不断细化;③ 平衡策略不是一次性操作,而是随模型误报分析持续迭代——每次模型在验证集上发现新的误报模式,就应补充对应场景的数据。
4.6 常见误区与总结复盘
- 误区一:只采集“干净”数据。忽略临界状态(如半松动、微汗液遮挡)会导致模型在真实世界失效。解决:主动制造“灰色地带”样本,并标注过渡态。
- 误区二:标签粒度过粗。仅标注“正常/异常”无法定位根因。解决:采用三级标签结构,保留行为上下文和置信度。
- 误区三:清洗时误删“难样本”。低SQI样本可能正是误报触发条件。解决:将低质量样本单独存放,用于鲁棒性测试。
- 误区四:平衡策略污染验证集。对验证集做过采样会导致评估指标虚高。解决:验证集保持真实分布,仅对训练集做平衡。
- 误区五:忽视时间戳对齐。多传感器延迟会导致特征错位。解决:采集时记录各芯片时间戳,离线做互相关对齐。
总结而言,高质量标注数据集的构建是一个“场景驱动—标签精细—清洗审慎—平衡有度”的系统工程。它需要算法工程师、硬件工程师和标注团队紧密协作,且必须建立数据版本管理机制(如DVC),确保每次迭代可追溯。当数据集能够真实反映误报触发条件时,后续的模型训练和规则优化才能事半功倍。