多模态可穿戴传感器融合与深度学习在BFRB检测中的应用
身体聚焦重复行为(Body-Focused Repetitive Behaviors,BFRB)是临床上长期被低估的一类问题,典型表现包括咬指甲、抠皮肤、拔头发等。很多人把这类动作当成单纯习惯,但对患者而言,它可能发展为难以自控的行为循环,并伴随皮肤损伤、情绪困扰和社交回避。传统评估主要依赖自我报告和临床观察,数据主观且稀疏,很难捕捉行为发生的时间、频率、持续时间以及伴随的生理状态。可穿戴传感器和深度学习为这个问题提供了一条新的解决路径:通过腕部、手指等位置的加速度计、陀螺仪、肌电和光电传感器,连续采集行为发生时的手部运动、肌肉活动和自主神经信号,再用多模态融合模型自动识别行为片段。
这篇文章围绕“深度多模态可穿戴传感器融合检测 BFRB”这条主线展开,核心是解决三个问题:为什么单模态传感器不够用,多模态数据在工程上如何对齐和融合,以及训练一个可用的检测模型需要处理哪些数据、代码和坑。文章会给出可运行的 PyTorch 示例、数据窗口化与对齐方案、模型设计思路、评估指标以及常见问题排查链路。如果你正在做可穿戴健康监测、行为识别、多模态深度学习,或者准备把传感器模型从实验环境推向部署,这篇内容可以作为完整参考。
1. BFRB 检测为什么需要多模态可穿戴传感器融合
1.1 身体聚焦重复行为的技术定义与检测难点
从行为识别角度看,BFRB 属于“重复性小动作”识别。它和走路、跑步、抬手等大幅度动作不同,很多 BFRB 动作幅度很小,例如用指甲轻轻抠皮肤、用牙齿咬指缘、用手指缠绕头发。这些动作在单一传感器上往往表现为低幅值、短持续、高重复率,而且受个体差异影响极大。
检测难点主要体现在三方面:
第一,类别不平衡。一个人每天可能只有几十次行为片段,而传感器连续采样却会产生百万级数据点,贝叶斯方法、Focal Loss 和重采样策略都是处理这种不平衡的常用手段。
第二,类内差异大。同样是咬指甲,有的人用右手,有的人用左手,有的人把手举到嘴边,有的人直接低头靠近手指。只看运动信号,很难形成统一模式。
第三,行为边界模糊。BFRB 动作往往伴随前兆性冲动,患者可能在行为前出现手部靠近、抓握等“预动作”,这类预动作与正常手部活动高度相似,导致标签判断困难。
因此,单纯依赖单一传感器很难稳定检测。例如加速度计能够捕捉手部运动,但很多手部正常动作与 BFRB 运动波形相似;肌电信号能够反映肌肉用力,但传感器位置偏移就会导致信号漂移。这也是需要多模态融合的直接原因。
1.2 单模态传感器的局限
以加速度计为例,它在可穿戴设备中成本最低、部署最成熟,但加速度计只反映“运动学”信息,无法区分“有意识的运动”还是“无意识的重复行为”。例如手指抓握、抬臂、轻拍桌面,在加速度波形上可能非常接近。
肌电传感器的优势是能直接反映肌肉活动,但 EMG 对电极贴合非常敏感,而且行为发生时肌肉活动可能并不强烈,例如用指甲轻轻刮手背,肌电信号很弱。
光电脉搏波传感器可以反映自主神经系统的变化,行为发生前后心率、心率变异性可能改变,但 PPG 容易受运动伪影污染,在动作发生瞬间信号质量往往最差。
单一传感器还有一个共同问题:无法表达行为的多维度属性。BFRB 不仅仅是动作,它还包括动作、体位、生理激活状态和情境。多模态融合正是为了把这些不同维度的信息组合起来,让模型在“手部在动”的基础上,再看到“肌肉在用力”“生理唤醒水平升高”“运动模式具有重复性”,从而降低误判。
1.3 深度学习在多模态融合中的价值
传统方法通常先对每个模态手工设计特征,例如时域统计特征、频域能量特征、EMG 的均方根,再训练 SVM 或随机森林。这种方案在小规模样本上有效,但泛化能力有限。手工特征很难覆盖 BFRB 个体差异,也很难建模动作的前置、过程和结束状态。
深度学习可以直接从原始时间序列和谱图中学习行为表示。在多模态场景,它还能通过若干种方式完成信息融合:
- 输入层融合:把多个模态信号直接拼接,作为统一的输入张量。
- 特征层融合:每个模态先经过独立的特征提取网络,再把特征拼接、相加或进行注意力加权。
- 决策层融合:每个模态独立预测,再对概率进行平均或投票。
在 BFRB 检测场景里,深度多模态融合的优势不只是准确率,更在于可以端到端训练,让每个模态的表示自动适配检测任务。同时,通过注意力机制可以动态控制哪些模态在哪些时刻更可信,这对传感器接触状态不稳定的真实场景非常实用。
2. 传感器模态、数据格式与实验环境准备
2.1 常见可穿戴传感器模态与物理含义
设计多模态可穿戴系统前,需要先明确每个模态采集的是什么物理量,以及它们对 BFRB 检测各自提供什么信息。
| 模态 | 传感器 | 典型物理量 | 对 BFRB 检测的贡献 | 主要局限 |
|---|---|---|---|---|
| 运动模态 | 加速度计 | 三轴加速度 | 捕捉手部运动、动作姿态 | 大幅度日常动作容易混淆 |
| 姿态模态 | 陀螺仪 | 三轴角速度 | 捕捉旋转动作、手腕翻转 | 静态行为无信息 |
| 肌肉活动模态 | 肌电(EMG) | 肌肉电活动 | 反映肌肉用力程度 | 电极贴合要求高 |
| 生理唤醒模态 | PPG/EDA | 心率、皮电 | 反映行为伴随的紧张、冲动状态 | 运动伪影强 |
| 空间模态 | 磁力计 | 磁场强度 | 辅助姿态估计 | 易受环境磁干扰 |
在实际项目中,最常见的组合是 IMU(加速度计 + 陀螺仪)+ EMG + PPG。IMU 提供行为和运动背景,EMG 提供肌肉活动证据,PPG 提供生理状态线索。传感器通常佩戴在手腕、手指或手背,具体位置取决于目标行为。例如检测啃咬指甲,腕部 IMU 可能不够,指尖附近或手背的 EMG 会更有效。
2.2 数据采集格式与采样率设计
不同传感器对采样率要求不同。加速度计和陀螺仪常用 50Hz 到 100Hz,因为 BFRB 动作频率通常在 0.5Hz 到 2Hz,这个范围足够捕捉动作细节。EMG 需要 500Hz 到 1000Hz 才能比较清晰地反映肌肉电活动,但为了降低功耗和带宽,也可以降采样到 200Hz 左右,损失一部分高频成分。PPG 一般 25Hz 到 64Hz 即可满足心率特征提取,但检测瞬时血流变化可能需要更高采样。
实际项目中不能直接把不同采样率的数据拼接起来,必须先将它们重采样到统一频率。通常选择所有模态中能达到的最有意义频率,例如统一到 100Hz,EMG 先做低通滤波并重采样,PPG 则先做平滑再上采样。数据存储格式建议统一为时间戳 + 数值列的 CSV 或 Parquet,并严格记录采样率、量程和单位。下面是一个典型数据列结构:
其中 label 为 1 表示行为发生,0 表示非行为。这个标签必须由人工或半自动标注产生,通常要求至少两个标注者独立标注后计算一致性。
2.3 开发环境与依赖清单
本文示例基于 Python 和 PyTorch。以下是推荐环境:
| 项目 | 版本建议 | 说明 |
|---|---|---|
| Python | 3.9 或以上 | 兼容主流深度学习库 |
| PyTorch | 2.x | 提供自动微分、GPU 训练 |
| NumPy | 1.24+ | 数组处理 |
| pandas | 2.x | 数据读取与对齐 |
| scikit-learn | 1.3+ | 划分数据集、计算指标 |
| matplotlib / seaborn | 最新稳定版 | 可视化 |
| imbalanced-learn | 0.11+ | 处理类别不平衡(可选用) |
安装命令:
如果使用 GPU 训练,需要额外安装对应 CUDA 版本的 PyTorch,安装前先确认 nvidia-smi 输出的驱动支持的 CUDA 版本。这里并不要求所有环境都跑 GPU,小规模数据在 CPU 上也能完成调试,只是训练速度会明显变慢。
3. 数据预处理与标注对齐
3.1 数据窗口化与滑窗策略
模型不能直接输入整段长序列,因为 BFRB 行为通常持续数秒到数十秒,模型需要在滑动窗口上做片段的分类。常见做法是设置窗口长度 4 秒、滑窗间隔 1 秒,这样既能保留动作的短时上下文,又能产生足够样本。
窗口长度策略需要结合两个因素:
- 行为最短持续时间。如果某些 BFRB 动作只有 1 秒,窗口太长会被非行为占主导。
- 模型计算量。窗口越长,输入维度越大,训练时间和部署耗电量越高。
推荐先做统计分析,查看标注行为片段的时长分布,再决定窗口长度。以下代码用于把原始 DataFrame 切成窗口序列:
这里 window_len 的单位是样本点数。如果统一采样率为 100Hz,400 个点就是 4 秒。标签规则采用了窗口内多数投票,这会让模型倾向于学习持续时间较长的行为模式,具体阈值应根据项目标签设计调整。
3.2 多模态数据对齐与时间戳校正
可穿戴设备并不保证所有传感器严格按照同一时刻采样。不同芯片的晶振误差、设备内部缓冲、无线传输延迟都会导致时间戳漂移。如果直接拼接模态,模型会学到错误的时序对应关系,造成性能下降而不是提升。
对齐步骤通常如下:
第一,把每个模态从原始设备端导出为独立时间戳序列。
第二,以统一的参考时钟为基准,对每个模态做插值。加速度计、陀螺仪和磁力计通常采用线性插值,EMG 和 PPG 根据应用场景可选择线性或样条插值。
第三,检查模态之间的时间偏移。可以通过一个已知的同步动作验证,例如让受试者快速拍手,在加速度计和 EMG 上都能看到突变,计算两者的时间差作为系统固定延迟。
这里的 target_timestamps 应基于主时钟生成。如果目标采样率为 100Hz,对齐点就是每个 10ms 对应的时间戳。
注意:插值只能校正在采样周期内的误差,无法修正传感器本身的物理延迟,例如 PPG 信号从脉搏搏动到血氧计输出之间存在生理延迟。融合前最好由领域人员确认各模态相对动作的延迟是否在可接受范围。
3.3 标签体系与训练集划分
BFRB 检测不是简单的二分类,标签体系至少要区分三类:
- 非行为
- 行为发生中(例如咬指甲进行时)
- 行为前兆期(例如手部接近嘴边的“预备动作”)
如果把前兆期也归为正样本,模型可能学会检测“手在嘴边”而并不是真正的 BFRB。推荐在项目中先建立三级标签,训练时再决定是否合并。
数据集划分要尤其注意“同受试者泄漏”问题。如果同一个人的数据同时出现在训练集和测试集,模型对运动学模式的记忆会产生虚高结果。推荐按受试者划分训练集、验证集和测试集,而不是按样本划分。
这种划分方式更接近真实部署:模型要对从未见过的用户的行为进行检测,难度更大,但结果更可信。
4. 多模态传感器融合模型设计
4.1 融合层次:输入/特征/决策
多模态融合按信息结合位置可分为三种,实际项目中需要根据数据规模、传感器数量和处理平台选择。
| 融合方式 | 实现方法 | 优点 | 缺点 |
|---|---|---|---|
| 输入层融合 | 将各模态在通道维度拼接后输入模型 | 结构最简单,端到端学习 | 模型需要自行发现模态间关系,对特征规模要求高 |
| 特征层融合 | 各模态独立提取特征,再拼接或加权 | 每个模态有独立表示,适合异构模态 | 需要设计特征网络,参数量较大 |
| 决策层融合 | 各模态独立分类,再融合概率 | 训练简单,单模态可离线 | 无法学习模态间关联,精度通常低于中间融合 |
在可穿戴 BFRB 检测中,比较推荐的是“特征层融合”,因为 IMU、EMG、PPG 是三类异构信号,简单的通道拼接会让模型很难直接建立跨模态的时间关系。每个模态先通过一个小的卷积网络提取局部模式,再统一融合时序建模。
4.2 基于 CNN-LSTM 的中间融合模型
下面给出一个可运行 PyTorch 模型定义。它包含三个分支:
- IMU 分支:输入为加速度计和陀螺仪共 6 通道。
- EMG 分支:输入为 2 通道肌电。
- PPG 分支:输入为 1 通道 PPG。
每个分支先经过两个 1D 卷积层,提取短时特征,然后通过 LSTM 建模时间依赖,最后把三个分支的 LSTM 输出拼接,输入全连接分类层。
输入张量形状需要统一为 [batch, time, channel]。注意卷积层要求的输入是 [batch, channel, time],所以 forward 里需要先做 transpose(1, 2)。AdaptiveAvgPool1d 的作用是把时间维压缩到固定长度 32,这样无论原始窗口点数如何变化,LSTM 输入维度都保持稳定。
关键取舍:使用固定长度池化会让模型对窗口长度更鲁棒,但也会丢失部分时间精度。如果窗口长度固定,也可以直接用最后一个时间点。更复杂的方案是去掉池化,把整个时间序列传入 LSTM,但对显存要求更高。
4.3 注意力机制与模态缺失处理
实际佩戴过程中,某个模态可能因为接触不良、设备脱落或用户姿势阻挡而失效。例如 EMG 电极接触不良产生大量噪声,PPG 因为出汗导致信号质量严重恶化。如果模型在输入层简单拼接,一个模态失效会污染全部特征。
两种常用处理方式:
- 模态缺失补零:在输入层把缺失模态置零,并额外加入一个模态有效标志,让模型学习在有效信息不足时降低依赖。
- 注意力加权融合:用注意力模块为每个模态生成权重,让模型根据输入动态调整贡献。
以注意力模块为例,可以在三个分支特征拼合后,先计算每个模态的全局表示,再通过 softmax 生成权重。
这种模块能学习到“在较强运动伪影时降低 PPG 权重、在低幅值行为时提高 EMG 权重”的策略,但要避免过拟合,需要足够多样本。数据量小的时候,过度设计的注意力反而会带来稳定性问题,需要结合交叉验证评估。
5. 训练、验证与评估
5.1 损失函数与类别不平衡处理
BFRB 行为通常在一天中占比很低,正样本可能只占 5% 甚至更少。如果直接使用交叉熵,模型会倾向把所有窗口预测为负样本。两种常用方案:
- 加权交叉熵:给多数类和少数类分别设置损失权重。权重可以设置为反比于类别频率。
- Focal Loss:让模型更关注难以分类的样本,降低已正确分类样本的损失权重。
Focal Loss 的核心参数是 gamma,它控制难易样本的损失衰减速度。gamma 越大,简单样本的贡献越小。在实际项目中可以先从加权交叉熵开始,如果模型仍然重点关注多数类,再尝试 Focal Loss。
这里的第二个类别权重设为 10,表示正样本的相对重要程度。实际权重需要根据训练集正负比例计算,不能直接写死。
5.2 评估指标的计算方式
准确率在类别极不平衡时没有参考价值。一个 95% 负样本的数据集,模型全部预测为负也能有 95% 准确率。因此需要关注:
- 精确率(Precision):预测为正的样本中有多少是真的。
- 召回率(Recall):真实正样本中有多少被找出来。
- F1 分数:精确率与召回率的调和平均。
- 特异度(Specificity):真实负样本中有多少被正确排除。
对于行为检测场景,召回率通常比精确率更重要,因为漏检行为意味着患者可能会在长期监测中被误导,但精确率过低又会导致大量误报,让用户频繁收到无效提醒。生产系统通常设置一个可调阈值,平衡两个指标。
5.3 运行流程与结果解读
训练流程要包含数据加载、模型实例化、优化器选择、训练循环和验证循环。以下是一个简化训练脚本:
训练时要在验证集上监测 F1 分数。常见现象是训练损失持续下降,但验证 F1 不再提升,说明泛化能力已经饱和,此时应停止训练而非继续增加 epoch。验证集应使用按受试者划分的独立数据,不能在训练样本里抽一部分。
结果解读时要注意:单个窗口的预测结果会有较多噪声,可以通过滑动窗口预测的平均值得到平滑的行为概率曲线,然后使用阈值判断行为片段。这样比直接判断每个窗口更稳定。
6. 常见问题排查链路
6.1 传感器数据不同步导致模型不收敛
现象:训练时损失下降缓慢,验证准确率长期徘徊在多数类比例附近。
可能原因主要是三个模态的采样率不同但没有统一重采样,时间戳只保留到秒级精度,导致输入张量内部信号相对位置错误。
检查方式:
- 打印每个模态的实际时间戳间隔,确认是否存在跳变。
- 对齐后画出同一段时间的波形,检查拍手或握拳动作在加速度计、EMG 上是否同时出现。
- 检查输入模型的数据形状,确认 batch size、时间维、通道维是否符合模型定义。
解决方案:重新做插值对齐,使用统一时间基准。对所有时序做可视化抽查,尤其是动作突变附近。
6.2 标注边界模糊导致准确率虚高
现象:训练集和验证集上 F1 很高,但部署到真实用户后效果很差。
可能原因是标签把“预备动作”也标为正样本,模型学习了“手靠近嘴”这一通用动作,而非真正 BFRB;或者标注者在行为开始和结束点上有较大分歧,模型在边界样本上以记忆中不稳定的标签作为目标。
检查方式:
- 计算两个标注者之间的标签一致性,例如 Cohen's Kappa。
- 把模型误判样本按时间出现位置绘制出来,观察错误是否集中在行为开始和结束附近。
解决方案:对标签边界做“遗忘区”,在行为开始前 0.5 秒和行为结束后 1 秒内不参与训练,降低边界噪声。重新评估时保留更宽松的匹配容忍度,例如预测片段和真实标签重合超过 50% 才计入命中。
6.3 跨受试者效果退化严重
现象:按受试者划分后,测试集表现远低于按样本随机划分时的表现。
这几乎是因为模型记住了受试者特有的运动习惯和传感器放置位置,而不是学习到跨人群普遍的行为模式。可穿戴设备每次佩戴位置都会变化,坐姿、手部习惯也因人而异。
检查方式:
- 按受试者拆分后查看测试集是否仍然包含所有行为类别。
- 对每个受试者的均值加速度、均方根 EMG 做分布对比。
- 查看训练集和测试集中同一模态数据的分布差异。
解决方案:
- 增加不同受试者、不同佩戴位置的数据;
- 对 IMU 做方向归一化,例如把重力方向对齐到加速度计坐标;
- 使用域适应或数据增强,例如对时间序列施加旋转、缩放、时间偏移;
- 在部署阶段做少样本个人适配,用每个用户的前几分钟数据微调模型。
6.4 模态缺失导致推理异常
现象:某个传感器断开后,模型输出概率极端或者持续误报。
原因是模型没有见过缺失模态输入。部署系统里如果传感器断流,最常见做法是前向传播时直接把对应通道置零。如果训练时没有模拟过这种输入,模型就会在无依据的情况下做出过拟合判断。
检查方式:
- 人为把 EMG 通道置零,对比与正常输入时的预测分布。
- 查看训练代码里是否存在随机置零的预处理逻辑。
解决方案:在训练阶段以一定概率随机将某个模态置零,并让模型学会忽略缺失模态。生产代码里增加数据完整性检测,连续 N 秒无有效数据就切换到单模态或低置信度模式。
7. 最佳实践与生产环境扩展
7.1 从实验室到真实部署的差异
实验室环境下,传感器佩戴位置固定、行为执行方式刻板、时间标注规范。真实部署则完全不同:用户会忘记佩戴、传感器位置漂移、行为出现前还存在大量无关社交动作。
因此生产系统需要额外增加:
- 佩戴状态检测模块,区分“设备未佩戴”“佩戴但无有效信号”“正常佩戴”。
- 数据质量评分,对 EMG 噪声、PPG 信号质量进行实时评估,低于阈值时限制模型输出。
- 个性化校准流程,用户在首次使用后提供少量标注,让模型在本地微调。
这些模块不应该塞进模型内部,而是在数据流入模型前单独处理,否则模型会因为输入分布复杂而无法收敛。
7.2 模型轻量化与实时推理
深度学习模型在服务器上训练,但推理端通常是移动设备或 MCU。CNN-LSTM 结构在服务器上表现良好,部署到嵌入式设备时参数量可能过大。常见压缩方案包括:
- 把 LSTM 替换为 GRU,减少门控数量。
- 使用深度可分离卷积替代标准卷积。
- 对模型做量化,例如从 FP32 压缩到 INT8。
- 使用知识蒸馏,用一个更小模型学习大模型的软标签。
采用 INT8 量化时要注意,某些传感器信号幅值较小,量化可能导致噪声放大。量化后需要在测试集上重新评估 F1,不能只观察模型是否运行。
7.3 隐私、功耗与长期监测建议
可穿戴设备持续采集 EMG、PPG、运动数据,这些数据包含大量个人敏感信息,例如心率、肌肉状态、行为模式。长期监测系统必须考虑:
- 数据本地优先,原始信号尽量在设备端完成后处理和推理,只在需要同步时才上传聚合结果。
- 对模型参数和特征进行加密传输,避免中间人截获。
- 用户删除机制,允许用户一键清除本地和云端历史数据。
- 功耗控制,传感器采样率和无线传输是主要耗电源,可以通过事件触发策略降低采样频率,例如检测到疑似行为前兆时才启动高采样率。
从工程实践角度,最值得先做的一步是建立一套“数据质量看板”:实时显示各模态的信号质量、对齐延迟、模型置信度和预测片段可视化。这能帮助定位大部分采集与推理问题。多模态融合并不是简单接上多个传感器就能提升模型效果,真正的收益来自对每个模态物理含义的理解、对齐细节的处理,以及训练评估策略的严谨设计。对于 BFRB 这类小样本、个体差异大的行为识别任务,建议先把单模态基线跑通,再用同样的数据协议引入第二、第三模态,通过消融实验确认每个模态带来的增量。可复现性比模型结构创新更值得优先投入。