☰
物理约束深度学习如何用三轴体震信号实现无接触血压监测
2026/10/28 11:12:39 网站建设 项目流程

物理约束深度学习模型用于无接触血压监测,这个方向在生物医学信号处理里讨论得越来越多。核心思路并不复杂:从三轴体震记录里提取身体表面由心跳和血流引起的微弱机械振动,再用带有物理规律的神经网络估计血压,避免纯数据模型在个体差异、运动伪影和样本不足时到处乱飘。适合三类人看:做生理信号建模的研究者,做无接触健康监测产品原型验证的工程师,以及想搞明白深度学习怎么和医学物理约束结合的学生。

先说我的整体判断。这个方向最大的价值不是“换一个传感器测血压”,而是把心血管系统里已经明确的关系,比如脉搏波传导时间、心率变异性、收缩压和舒张压之间的统计关系,作为模型训练的约束条件。这样一来,模型不只是在拟合血压标签,还在学习一个“不会违反基本物理规则”的血压估计器。对于无接触场景尤其重要,因为三轴体震信号比心电图、脉搏血氧信号更弱,更容易受呼吸和肢体移动干扰,如果没有任何物理约束,模型很容易学出短期指标好看、实际部署就失灵的结果。这篇内容会按信号原理、建模流程、物理约束嵌入方式、评估标准、复现踩坑的顺序拆开讲,尽量落到具体步骤和可执行的判断标准上。

1. 先搞清楚三轴体震信号是什么,为什么它能和血压挂钩

1.1 从“身体震动”到心血管指标,中间隔了一层机械信号

三轴体震记录的英文是 triaxial bodyseismography,翻译成“三轴体震记录”或“三轴身体地震记录”都可以。它不是测量电信号,而是测量身体表面因为心脏泵血、血管扩张、血液冲击血管壁而产生的微小机械振动。用高灵敏度加速度计、压电传感器或激光测振设备,可以记录到这种振动。

这种信号在历史上和心冲击图、心震图有关联。心冲击图记录的是心脏每次搏动时身体受到的反作用力,心震图记录的是胸壁表面因心肌收缩和瓣膜开闭产生的振动。三轴体震记录可以理解为从三个方向同时记录这种机械振动,因此比单轴信号多了一些空间信息:不仅能看上下方向的血流冲击,还能看左右、前后的身体摆动和局部组织振动。

很多人第一反应是,为什么不用 PPG 或 ECG 做无接触血压监测?PPG 需要光学接触皮肤,ECG 至少需要电极接触,严格意义上的无接触都做不到。身体震信号的优势在于,它可以通过床垫传感器、座椅传感器、雷达配合振动反演等方式采集,不需要贴身佩戴。缺点是信号幅度小、噪声大、形态因人而异。要把它变成血压估计的输入,必须同时解决采集、预处理和模型设计三个问题。

1.2 三轴信号里能提取哪些和血压相关的信息

先说人体里已经确认的几个关系。

第一,心脏每次收缩会把血液射入主动脉,主动脉壁会因此产生向外扩张的波动。这个波动的传播速度,也就是脉搏波传导时间,和血压有较强相关性。血压升高时血管壁张力增加,传导速度变快。三轴体震记录里的某些特征点,比如心肌收缩产生的初搏、主动脉瓣射血引起的振动、外周血管反射回来的波,都可能对应脉搏波传导过程中的时间事件。

第二,心率和心率变异性与血压调节有关。体震信号里可以检测到稳定的心跳间隔,所以能计算瞬时心率以及连续心搏间期变化。

第三,收缩期和舒张期造成的身体振动模式不同。收缩期血液快速射出,身体受到的冲击更集中,舒张期则更缓慢。三轴信号在时域幅度、频谱能量分布上会呈现周期性的强弱变化。这些特征如果直接输入通用分类网络,模型可能只学到“心率”这种粗粒度信息,忽略更细微的血压相关信息,所以需要做针对性的特征工程或模型结构设计。

1.3 无接触采集的物理前提和实用边界

无接触不代表没有任何机械耦合。真正完全不接触、不穿戴,一般靠高灵敏度传感器通过空气或固体结构耦合身体振动。比如把加速度计贴在床垫下方,人在床上平躺时,心跳引起的体表振动会传递到床垫和传感器;或者用低频雷达照射身体表面,通过微多普勒效应反演振动。

这里要特别注意一个边界:无接触采集到的信号信噪比远低于接触式传感器。人在呼吸时,躯干运动会叠加一个低频大振幅信号,而心跳引起的振动可能只有几十微米甚至更小。因此,信号处理的第一步不是训练模型,而是先确认信号里能不能稳定检测到心搏事件。如果一段三轴信号里连稳定的心搏峰值都找不到,后面所有深度学习都等于在噪声里强行拟合。

我一般会先用 5 到 10 秒信号做可视化,观察三个轴是否存在周期性的心搏脉冲。如果波形杂乱、无法稳定检测到每搏峰值,先不要急着调模型,而是先解决传感器安装位置、采样率、滤波参数和去噪方案。

2. 物理约束深度学习模型到底在约束什么

2.1 纯数据驱动的血压估计有什么问题

如果不加物理约束,模型就是一个从三轴体震信号到血压数值的回归器。只要训练集足够大,它确实能学出一些统计规律。问题在于,真实医疗场景里很难收集到覆盖全人群、全血压区间的连续标注数据。

另一个问题是个体差异。不同人的血管弹性、体型、皮肤厚度、组织密度都不一样,同样的血压值可能对应完全不同的体震波形。纯数据模型容易学会数据集的“分布中心”,一旦换一个人,预测就出现系统性偏移。这不是过拟合训练集这么简单,而是模型缺少“为什么”的支撑。

再说运动伪影。无接触信号里,翻身、咳嗽、说话、手脚移动都会产生远大于心跳振动的干扰。纯数据模型很容易把这些非生理事件误读成血压变化。如果模型内部没有一条“血压不会瞬间跳变”或“心搏间生理特征必须连续”的规则,哪怕训练集里加入很多运动样本,也无法保证处理所有未知动作。

2.2 软约束:把物理规律写进损失函数

最常见做法是把物理规律变成一组额外损失项。模型还是输出收缩压(SBP)、舒张压(DBP)、平均动脉压(MAP),但训练时不仅计算预测值和标签之间的误差,还要计算预测值之间是否满足已知关系。

最典型的一个关系是:

MAP 约等于 DBP + (SBP - DBP) / 3 这个公式在生理学里经常用来估算平均动脉压。如果模型同时预测三个值,那就可以在损失函数里加一项:

# 示例:平均动脉压一致性约束,不是原始论文代码 phys_loss = torch.mean(torch.abs((dbp_pred + (sbp_pred - dbp_pred) / 3.0) - map_pred))

这种约束的作用是,如果模型预测 SBP=120、DBP=100、MAP=70,直接误差可能不大,但物理上一看就有问题,因为脉压差只有 20,MAP 不可能低于 DBP。加入这个损失后,模型会避免输出这类不一致结果。

另一个可以约束的方向是时间平滑性。连续多拍的血压不会在几十毫秒内大幅跳变。可以用相邻心搏输出之间的差分来限制突变。

还有心率一致性约束。三轴体震信号可以独立计算出心率,模型输出的血压是否支持当前心率状态?虽然不是严格对应关系,但可以作为弱先验。

软约束的优点是灵活、容易实现,不改变模型结构。缺点是约束强度不好设置,太弱等于没有约束,太强会让模型牺牲真实预测精度。工程上一般会先训练一个不加约束的版本,观察预测值违反物理规则的频率,再逐步加大约束权重。

2.3 硬约束:直接在网络结构里嵌入物理关系

硬约束比软约束更彻底,通常有三种做法。

第一种是输出编码约束。比如设计网络时,不让它直接输出 SBP、DBP 和 MAP,而是输出 DBP 和脉压差 PP,再通过 DBP 加 PP 得到 SBP。同时通过一个可学习的映射从 DBP 和 PP 计算 MAP。这样输出结构天然满足 SBP > DBP,不会出现舒张压高于收缩压的荒谬结果。

第二种是中间物理量约束。网络先输出脉搏波传导时间、心搏间期、波形特征等容易验证的物理量,再由一个固定公式或浅层网络将这些中间量映射到血压。这个做法的好处是,中间结果可以用标注或先验知识验证,模型不是完全黑盒。

第三种是循环一致性。用模型估计血压后,再通过一个正向物理模型,从血压和血管参数反推出应该观测到的体震波形,和真实波形对比。如果反推出来的波形和观测波形差很多,说明血压估计可能不合理。这种方式实现成本高,但能约束整个输入输出链条。

我给的建议是,刚开始做不需要追求复杂的硬约束。先用 MAP 一致性损失、SBP > DBP 的输出编码,再把心率或脉搏波传导时间作为辅助监督信息,已经足够建立第一版模型。硬约束更多用于精度接近上限、准备做细化或临床验证时。

3. 从传感器信号到监督标签,完整数据链路怎么搭

3.1 数据采集:三轴体震信号和血压标签如何同步

训练阶段必须有参考血压标签。常见做法是使用标准电子血压计或者动脉血压监测设备。连续血压参考可以用指套式连续血压计,但价格高、佩戴位置受限;非连续参考则只能得到左臂或右臂每隔一定时间的单次读数值。

这里有个非常关键的点:体震信号是连续采集的,血压标签是间断的。如果每 5 分钟才测一次血压,中间的心搏到底对应什么血压值,只能做插值或近似。训练时要明确标签的对应窗口,比如只取“袖带充气前稳定 10 秒窗口内的平均信号特征”作为该次血压对应的输入。

传感器和数据采集设备之间还要考虑同步问题。体震信号由采集卡记录,血压计由另一套系统控制,两个设备时间轴不一致会导致标签偏移。我会在采集流程里加入同步事件标志,比如血压计充气开始时在体震采集软件里打一个标记,或者用同一颗单片机同时控制血压计触发和数据采集。

如果数据来自公开数据集,也要先确认采样率、量化位数、通道数、传感器放置位置和参考血压设备型号。很多公开数据不是专门为三轴体震设计的,可能存在通道间的相位偏差或低通滤波设置不同。

3.2 预处理:滤波、分段、质量评估

三轴体震信号的处理一般分几步。

第一步是去趋势和去直流。把传感器静置时存在的偏移量去掉,避免长时间基线漂移影响后续特征提取。

第二步是带通滤波。心跳相关的机械振动主要分布在低频段,常见的有效范围在 0.5 到 30 Hz 之间。下限不能设得太高,否则呼吸和体温调节引起的慢波也被去掉,但会导致基线漂移;上限一般 20 Hz 或 30 Hz 足够,超过这个范围主要是环境振动和肌肉噪声。具体数值需要根据传感器频率响应和实验环境调整。

第三步是心搏检测。从滤波后的三轴信号中找到一个最能体现心跳周期的轴,或把三轴合成一个综合信号,再通过峰值检测或模板匹配定位每次心搏位置。如果信号质量差,峰值检测会有很多漏检和误检,需要用 RR 间期范围做合理性过滤。

第四步是分段。以每个心搏或每个呼吸周期为窗口,截取固定长度片段。如果标签是每次测量的血压值,可以把该次测量前 30 秒到 60 秒内的所有心搏片段作为候选输入,再用质量分数筛选。

信号质量评估通常包括:峰值幅度稳定性、相邻心搏间期变异性、频谱中是否存在明显的心率峰、是否存在突然的大幅值跳变。可以用一个简单规则打质量分,低于阈值的样本不进训练集。

3.3 训练样本和标签设计

三轴体震信号作为输入,维度一般是(batch, 3, time_steps)或(batch, time_steps, 3)。如果按心搏分段,一段建议包含 1 到 2 个完整心跳,时间步数取决于采样率。采样率 500 Hz 时,一个心跳约 1 秒,对应 500 个点;如果网络用 Transformer,可能还需要降采样到 100 Hz 到 250 Hz 来降低计算量。

标签设计有两种思路。

一种是单拍级输出,模型对每个心搏输入输出一个血压估计值,然后取一段时间内的均值或中位数作为最终结果。这种做法能利用逐拍信息,但容易受异常心搏影响。

另一种是窗口级输出,模型输入一段包含多个心搏的信号,输出一个血压估计值。这种更稳定,抗噪声能力更强,但模型不容易定位到具体哪一拍的特征。

我建议先做窗口级,因为无接触信号质量不稳定,单拍估计方差太大。后期再逐步细化到单拍级,考察模型是否真的学到了逐拍特征。

3.4 数据划分和模型选择

数据划分不能直接随机打乱,因为同一个人的连续信号高度相关。如果训练集和测试集来自同一段信号的不同窗口,模型很容易靠记忆位置而不是学习生理特征。更合理的方式是按受试者划分:一个人的数据要么在训练集,要么在验证集,要么在测试集。

模型结构方面,不需要一开始就上很重的大模型。常见做法是先用 1D CNN 提取局部波形特征,再用双向 LSTM 或 Transformer 捕捉时间上下文,最后通过全连接层输出血压值。三轴信号可以在输入时合并成多通道,也可以先三个轴分别编码再融合。分轴编码的好处是能观察每个轴的贡献,但参数更多;合并输入更简单,适合第一版验证。

如果样本量不大,建议考虑轻量级 CNN 加少量循环单元,避免过拟合。也可以加一个辅助分支来输出心率、脉搏波传导时间等中间量,这部分输出用已知标签监督,相当于给模型提供更丰富的学习信号。

注意:第一版模型不要追求复杂结构。先确认三轴信号能被网络稳定提取出心搏特征,再看血压估计误差是否正常。模型结构问题通常在数据质量稳定之后才需要重点处理。

4. 实际训练模型时的操作顺序和参数取舍

4.1 环境准备

这个方向主要涉及深度学习框架和信号处理库。框架选择 PyTorch 或 TensorFlow 都可以,我更建议 PyTorch,因为在训练循环里写自定义物理损失函数更顺手。信号处理用 NumPy、SciPy 和常见滤波工具可以完成。

硬件方面,训练这类模型对算力要求不算极端。如果是按心搏分段,输入长度通常几百到几千个采样点,一个 batch 的显存需求不大。普通办公级 GPU 就能训练一个中等规模的 1D CNN 模型。如果输入变成几十秒的原始波形,或者用大规模 Transformer,则显存和训练时间会明显上升。

低配置环境下可以先把采样率降到 100 Hz 左右,再把输入窗口缩短到包含 1 到 2 个心搏。这样复杂度显著下降,但要注意频率上限不要低于 30 Hz,否则会丢掉一部分瓣膜振动信息。

4.2 最小可运行验证

训练前先做一次小规模冒烟测试。取 50 到 100 条样本,不加入物理约束,只训练 2 到 5 个 epoch,看模型能不能启动、loss 是否下降、输出是否在合理数值范围内。

这一步最常见的坑是输入维度和标签维度对不上。比如三轴信号形状写成(seq_len, 3),但网络期望(3, seq_len);或者标签缺了维度,导致 loss 计算报错。先用一组固定形状数据跑通整个链路,再用真实数据训练,能省很多排查时间。

验证合理范围可以用一个简单规则:模型输出均值是否接近训练集血压均值,输出标准差是否合理,有没有出现负数或超过 300 mmHg 的离谱值。如果输出偏离明显,先检查输入归一化和权重初始化,不要急着调物理约束。

4.3 批量训练、早停和评估

稳定跑通后,再开始正式训练。建议按以下顺序:

第一步,用基础回归损失训练一个不加物理约束的基准模型。第二步,加入物理一致性损失或输出编码约束,再和基准模型比较。第三步,如果效果仍不理想,加入中间物理量监督或调整数据划分。

早停不能只看训练集和验证集的整体误差,还要看每个受试者的误差分布。如果整体 MAE 不错,但某几个受试者误差特别大,说明模型泛化能力有问题。此时优先检查这些受试者的信号质量,是不是运动伪影太多,或者血压范围没有被训练集覆盖。

批量训练时还要记录每个 epoch 的物理约束损失值。如果物理约束损失降不下去,说明模型输出很可能持续违反物理规则,这时要检查约束权重和目标值是否正确。比如 MAP 约束里,标签计算方式是否和公式一致,输出是否经过了 sigmoid 或归一化导致取值范围变化。

5. 血压估计结果怎么验证,哪些指标更能说明问题

5.1 常用指标:MAE、RMSE、标准差、误差分布

血压估计模型通常用平均绝对误差 MAE、均方根误差 RMSE 以及预测误差的标准差来评估。MAE 直观,RMSE 对异常样本更敏感。除了整体指标,还要分别计算 SBP、DBP、MAP 的误差,不能只看一个血压值。

单个受试者层面的指标同样重要。先计算每个受试者在多段数据上的平均误差,再统计所有受试者的平均误差和标准差。这样可以区分“模型整体误差很大”和“模型只在少数人身上误差很大”两种不同问题。

还要画误差分布直方图或散点图。如果散点图显示误差随真实血压值变大而增大,说明模型存在系统性低估或高估。很多黑盒模型整体误差不高,但在高血压范围内表现很差,这对医学应用是不可接受的。

5.2 怎么看待临床标准和文献口径

领域里经常提到 AAMI 标准和 BHS 标准。AAMI 对血压监测设备的要求通常包括平均误差不超过一定范围、标准差不超过一定范围;BHS 则按误差落在不同范围内的比例进行分级。不同文献采用的具体标准可能略有差异,引用时需要核对原始版本。

这里要特别提醒:这些标准是为临床测量设备制定的评估框架,不能简单等同于研究论文里的一个小测试集结果。如果你只在一个 20 人内部数据集上测试,即使指标满足标准,也无法说明模型达到临床可用水平。写论文或做产品预研时,要明确样本量、年龄范围、血压范围、测量环境和参考设备,避免过度解读指标。

5.3 低资源条件下的可复现评估策略

如果手头数据有限,可以做分层留一受试者交叉验证。也就是每次拿一个受试者的数据做测试,用其他受试者数据训练,轮流做完所有人。这种评估方式更接近真实部署场景:模型要面对没见过的个体。

样本量很少时,先把问题降维。可以不做逐拍估计,而是输出 30 秒窗口内的平均血压;也可以先做“高血压与正常血压的二分类”或“血压变化趋势监测”,而不是直接预测具体数值。从连续值回归退化成趋势判断,能显著降低任务难度,让前期验证更可靠。

5.4 伪影导致的“假阳性”和“假阴性”

体震信号最大的问题不是模型不够强,而是输入里混入非心跳振动。坐姿时腿部移动、深呼吸、咳嗽、说话都会产生大幅度低频振动,这些振动可能被模型错误解释为血压波动。评估时除了看整体误差,还要专门看运动片段和静止片段的误差差异。如果运动片段误差明显增大,说明模型对伪影的鲁棒性不够,不能只靠数据增强,还要考虑用信号质量分数做门槛过滤。

建议用一段 5 分钟连续记录做可视化测试:前 1 分钟静卧,中间加入一次咳嗽或翻身,后 3 分钟恢复。看模型输出的血压曲线在运动时段是否出现不合理的剧烈跳变。如果跳变幅度超过几十毫米汞柱,说明预处理或模型对伪影的抑制不足。

6. 实战踩坑记录与排查顺序

6.1 信号里找不到稳定心搏

现象:输入波形看起来有周期性,但峰值检测总是漏检或误检。排查顺序是先看原始波形,再看滤波后波形。如果原始波形有强烈基线漂移,先提高高通滤波下限;如果高频噪声严重,先降低低通滤波上限。

还有一种情况是传感器安装位置不合适。同样是三轴加速度计,贴在胸骨表面和贴在床垫下方,采集到的信号形态完全不同。床垫传感器信号更弱,普通峰值检测很难直接识别心搏。可以考虑用多轴信号合成,把三个轴的能量加在一起,提高信噪比。

6.2 模型不收敛或训练后期 loss 震荡

首先检查输入输出有没有归一化。血压值范围通常在 60 到 180 mmHg,如果直接用原始数值作为回归目标,数值尺度过大容易导致梯度不稳定。建议先标准化到 0 到 1 或均值方差归一化,训练后再反标准化。

其次检查物理约束权重。如果加了一个权重很大的物理损失,主损失被挤到次要位置,模型可能在物理上“合理”但精度很低。正确做法是先不加物理约束跑到基本收敛,再缓慢增大约束权重。

如果 loss 在后期震荡,常见原因是学习率过大或 batch 大小过小。血压数据通常受试者间差异大,batch 里如果随机混入不同人的数据,梯度方向可能不稳定。可以尝试按受试者分组采样,或使用较大 batch 做梯度归一化。

6.3 标签偏移和个体漂移

现象:训练误差很低,测试误差很高。优先检查数据划分是否严格按受试者隔离。如果同一个人的连续数据片段同时出现在训练集和测试集,会严重高估泛化能力。

再查标签时间对齐。如果体震信号和血压标签存在几秒或几十秒的偏移,模型学到的对应关系就是错位的。可以用心跳计数的方式做粗校验,比如从体震信号中数出 5 分钟内心搏次数,和血压计记录时段的平均心率对比,看是否一致。

个体漂移问题更隐蔽。同一受试者在不同时间采集的数据,血管弹性、交感神经状态可能变化。即使划分时分开不同人次,也可能出现同一个人的多次访问数据没有完全隔离。数据清单里要记录受试者 ID、采集日期、血压计测量时机,做严格分组。

6.4 输出合理但临床语义不对

有时 MAE 不高,但模型输出曲线看起来和真实血压变化趋势不一致。比如真实血压在某个时段缓慢上升,模型却先降后升,或者对每次呼吸都产生轻微波动。

这种情况说明模型学到了某些和血压相关的统计特征,但没有学到真正的因果关系。可以尝试的可解释手段是:对模型输入做梯度加权可视化,看它关注的波形时段是否落在收缩射血期。如果模型主要关注呼吸波或噪声峰,说明特征选择有问题,需要增加物理约束或改用更精细的心门控分段。

7. 这个方向要落地,还差哪些环节

7.1 从离线模型到产品原型的差距

离线模型跑通只是第一步。无接触血压监测要落地到床垫、座椅或卫生间设备,还要解决实时推理、模型压缩、边缘部署和连续运行稳定性。体震模型如果在服务器上跑,会有数据上传延迟和隐私问题;如果跑在单片机或边缘盒子上,需要考虑模型参数量和推理速度。

另外,离线测试用的是经过预处理的离线数据,在线系统是流式输入,无法预知未来信号。这意味着很多需要全序列归一化或全局统计量的预处理方法不能直接迁移。在线系统通常采用滑动窗口,每个窗口独立处理,窗口长度要足够长,保证有稳定的心搏信息。

7.2 个性化校准和多模态融合

从我的实测经验看,单一模型的跨个体表现有限。比较实用的路线是先做群体模型,再针对个体做少量校准。校准方法可以很简单,比如用户用袖带血压计测量一次或两次,模型根据该次测量调整输出偏移量或缩放系数。这个方案在产品上更容易实现,也符合用户对“设备需要初始标定”的心理预期。

多模态融合也更现实。三轴体震信号可以和低频雷达呼吸信号、压电脉搏波、红外热成像等结合。多模态的价值不只在精度提升,还能互相验证信号质量。比如体震信号因为翻身失效时,雷达信号可能仍能提供心跳信息。

7.3 值得关注的技术趋势

物理约束会越来越细。当前很多工作还是用简单的一致性损失,后面可能会出现更完整的血流动力学正向模型,和神经网络形成更紧密的“物理感知架构”,比如把血管弹性、外周阻力作为可解释隐变量。

自监督学习也会缓解标签稀缺。既然三轴体震信号可以在无标签情况下通过重构任务学习心搏结构和周期特征,那就可以先用大量无标签信号做预训练,再用少量配对数据做血压回归微调。这样能降低对连续血压标签的依赖,但需要先验证预训练特征是否真的保留血压相关信息,而不只是学会了重构波形。

最后一点是个性化时序建模。同一个人的血压在不同时段呈节律性变化,模型如果能把长时生理节律和短时心搏特征结合起来,比单纯依赖一个窗口内的信息更接近临床实际。不过这也会带来训练数据和实时推理复杂度的上升,建议在基础模型稳定后再扩展。

我个人更建议先把单窗体的基础模型做稳,加入 MAP 一致性约束和按受试者隔离的评估,再逐步往流式处理、多模态和个性化校准方向推进。无接触血压监测真正的瓶颈不在网络参数量,而在信号质量、个体差异和标签标准。把这三大块处理干净,物理约束深度学习模型才真正有机会从论文走向实际场景。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询