0.14.0:随着每一次心跳,你的肌肤都会微微颤动

约 5 分钟阅读
0.14.0:随着每一次心跳,你的肌肤都会微微颤动

我们在 @elata-biosciences/rppg-web 中进行了哪些改动,以打造一个可供您在此基础上构建的网络摄像头心率监测功能。

通过网络摄像头读取心率虽然演示起来很简单,但很难让人信服。

演示版的工作原理如下:观察某人面部的绿色通道,找出周期性特征,然后输出一个数字。在光线充足且被摄对象保持静止的情况下,效果看起来相当逼真。但当被摄对象转向窗户、向后靠,或者笔记本电脑出现几帧卡顿时,这个数字仍会自信满满地不断更新,尽管它实际上毫无意义。

这个差距正是问题的症结所在。一个大多数时候是正确的、其余时候却默默出错的数值,比根本没有数值还要糟糕,因为基于该数值构建的应用程序根本无法分辨其中的差异。

6月1日至6月5日期间,我们发布了十一份版本更新,内容包括: @elata-biosciences/rppg-web,版本号从 0.4.0 降至 0.14.0。此次更新几乎全部致力于弥合这一差距。

HRV 需要子帧定时

我们首先修复了心率变异性功能,该功能此前因算术运算问题而悄然失效。

在每秒 30 帧的情况下,一帧为 33 毫秒。 如果你通过从滤波后的信号中挑选峰值采样点来检测心跳,那么你测得的每个心跳间隔都是33毫秒的倍数。但你试图测量的心率变异性(HRV)的波动范围大致也在这个范围内。量化步长与信号幅度相当。

通过两项调整解决了这个问题。首先,采用子采样峰值插值:不再直接取峰值帧,而是对峰值周围进行拟合,从而估算真实峰值在采样点之间的位置。 其次,也是更实用的一点,我们将搏动计时转移到了希尔伯特相位上。我们不再询问“哪个帧是峰值”,而是追踪脉搏波形的瞬时相位,并根据相位交叉点来确定搏动边界。这样就得到了连续的计时,而不是与帧网格对齐的计时。

我们还添加了神经网络(NN)间隔清理功能,因为单次漏拍或双拍对心率变异性(HRV)窗口的干扰,远比您担心的噪声要大得多。

仅关注一个区域是不够的

面部各处的皮肤灌注情况并不均匀,光照条件也是如此。额头可能因光线过强而曝光过度,而脸颊却清晰可见,反之亦然。

因此,我们现在对多个区域进行采样并融合,融合权重基于信噪比,从而使实际携带脉搏信号的区域在结果中占据主导地位。在 0.12.0 版本中,该功能在实时处理管道中已从“需手动启用”改为默认开启,同时采用了统一的几何结构,确保融合区域与引导叠加层所指对象一致。

我们还发货了底下的部件。 CHROM增益和信噪比(SNR)基本运算直接导出,因此如果您想在相同的前端上构建不同的估计器,则无需强制采用我们的方案。

不输出任何内容也是有效的输出

冲刺期的剩余时间,我们致力于拒绝发布那些我们无法负责的数据。

无参考 BPM 保护机制可捕获管道正在追踪非脉搏周期性信号的情况。捕获置信度门控会对传入的帧本身进行评分,因此光线不足或剧烈运动会被判定为捕获质量差,而非合理的心率。无头部 BaselineCalibrator 该平台允许应用程序在无需任何用户界面的情况下,为每位用户建立基线数据。

这些内容虽然并不光鲜亮丽,但这正是“派对花招”与“真正能呈现给用户的产品”之间的区别。

面部特征点和谨慎的情绪信号

我们将 FaceMesh 替换为 FaceLandmarker,后者提供了更精准的追踪效果和更丰富的特征点集,随后将其应用于两个方面。

第一项功能非常实用:实时面部构图引导和区域叠加功能,这样用户就能清楚地看到自己何时偏离了有效位置,而不必困惑于为何测量结果出现异常。

第二项是基于面部特征点和脉搏信号融合而成的多维度情绪评估,包括情绪极性和唤醒度。 我们希望准确说明这是什么。这是一种具有真实不确定性的双轴估计值,并非情绪识别,我们也不会根据网络摄像头来给任何人的情绪贴标签。我们将它以附带置信度的坐标形式呈现,与其粉饰太平,我们更愿意如实呈现。

此外,我们还增加了多线索呼吸监测功能,该功能从多个信号路径中提取呼吸频率,而不是将所有数据都依赖于单一信号路径。

该窗口中还包含

  • 所有演示和框架均采用白色及浅色主题,因为仅支持深色模式的默认设置导致演示内容在光线明亮的房间内难以阅读。
  • 重新进行基准测试,以便能够根据录制的视频来衡量估计器的变化,而不是根据当时恰好坐在摄像头前的人来进行比较。
  • run.sh 拆分为 run-lib.sh 以及一个 justfile,其中 link 以及 unlink 针对 SDK 本地构建版本的开发指南。

立即体验

bash
npm create @elata-biosciences/elata-demo my-app -- --template rppg

无需头戴设备,无需硬件,无需账户。只需一台网络摄像头和一个浏览器。

以上内容均采用 @elata-biosciences/rppg-web 0.14.0,源代码位于 github.com/Elata-Biosciences/elata-bio-sdk. 如果您发现管道输出了一个本应被隐藏的数字,这正是我们最希望收到的错误报告。

继续阅读