ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于深度学习的非接触式心率估计:从rPPG原理到CNN-LSTM实战

基于深度学习的非接触式心率估计:从rPPG原理到CNN-LSTM实战 简介本资源是一套基于MATLAB实现的深度学习rPPG心率估计算法代码包面向计算机、电子信息工程及数学等专业的本科生与研究生适用于课程设计、期末大作业及毕业设计等实践环节解决非接触式心率信号提取与建模的核心问题。压缩包共118个文件含15个核心MATLAB脚本如main.m、POS_WANG.m、CHROM_DEHAAN.m等、93个XML配置文件用于模型参数与实验设置、4个PNG结果图、3个PDF技术文档及1个MD说明文件整体大小为7.31MB结构清晰、模块分工明确。已有118人下载学习代码采用参数化编程设计关键超参与ROI区域可灵活调整注释详尽、逻辑分层清晰覆盖图像预处理、时空特征提取、BVP信号生成及心率频谱分析全流程便于理解rPPG原理并快速复现实验结果。1. 项目概述从“看脸测心率”说起几年前我第一次接触到“远程光电容积脉搏波描记法”这个概念时觉得这简直是科幻小说里的技术。简单来说它允许我们仅通过一段普通摄像头拍摄的人脸视频就能无接触地估算出人的心率。这个技术就是rPPG。当时我正参与一个健康监测相关的项目传统的接触式传感器比如指夹式血氧仪或胸带在长期、舒适性要求高的场景下总是遇到瓶颈——用户觉得不舒服数据就容易中断。而rPPG提供了一种“非侵入式”的可能用户甚至不需要意识到自己正在被监测这为睡眠研究、压力评估、婴幼儿监护乃至驾驶疲劳检测打开了新的大门。然而早期的rPPG方法大多基于传统的信号处理比如对视频中面部皮肤区域的平均颜色信号进行盲源分离。这些方法在受控的实验室光照下表现尚可但一到现实世界——光线变化、人脸微动、甚至化妆和肤色差异——性能就急剧下降心率估计值飘得离谱。这正是深度学习介入的绝佳时机。我们手头的这个项目“基于深度学习的基于rPPG心率估计”核心目标就是利用深度神经网络强大的特征提取和建模能力去攻克传统方法在鲁棒性和准确性上的难关。它不再仅仅依赖手工设计的信号处理流程而是让模型从海量的视频-心率配对数据中自己学会如何从复杂的、充满噪声的视频帧序列中捕捉到那些与心脏搏动同步的、微弱的肤色亮度周期性变化。这个项目适合所有对计算机视觉、生物信号处理以及健康科技交叉领域感兴趣的朋友。无论你是想了解如何将前沿的AI算法落地到具体的生理信号检测任务中还是正在寻找一个具有明确应用价值的深度学习实战项目这里面的技术拆解和实操经验都能给你带来启发。接下来我将抛开复杂的论文术语以一个实践者的角度带你深入这个项目的核心从设计思路、数据准备、模型构建一路聊到训练技巧和实际部署中那些“坑”。2. 核心思路与方案选型为什么是深度学习当我们决定用深度学习来改造rPPG时首先要回答的问题是传统方法到底卡在了哪里以及深度学习凭什么能做得更好2.1 传统rPPG的瓶颈与深度学习的优势传统rPPG的典型流程可以概括为人脸检测与跟踪 - 感兴趣区域ROI通常是脸颊、前额提取 - 对ROI内像素的RGB通道值进行时空平均得到三个原始信号 - 使用诸如ICA、PCA或CHROM等方法对信号进行分解以分离出脉搏波成分 - 对提取出的脉搏波信号进行频域分析如FFT找到能量最大的频率换算成心率。这个流程的每个环节都很脆弱光照干扰环境光的变化会直接叠加在肤色信号上其强度可能远大于脉搏波信号。运动伪影即使是微小的头部运动也会导致ROI内像素的剧烈变化淹没生理信号。个体差异肤色、皮下组织厚度、面部血管分布因人而异固定的信号处理参数难以普适。传感器噪声摄像头本身的噪声、压缩编码带来的信息损失。深度学习特别是卷积神经网络和循环神经网络为我们提供了新的工具包强大的特征学习CNN可以从原始视频帧中自动学习到与心率相关的、鲁棒的空间特征可能包括对光照不敏感的纹理模式或运动模式而无需手动定义ROI。时空建模能力结合3D CNN或CNNRNN如LSTM模型可以同时利用空间信息和时间上下文更好地区分生理信号和运动伪影。端到端优化我们可以构建一个从输入视频片段到输出心率值的端到端模型。所有步骤特征提取、信号分离、频率估计的参数联合优化目标直接指向最终的心率估计误差最小化这通常比串联多个独立优化的模块效果更好。2.2 主流模型架构的权衡在项目初期我们调研并尝试了几种主流的深度学习rPPG模型架构每种都有其适用场景和代价。1. 基于3D CNN的架构这是最直观的思路将一段视频例如T帧视为一个T x H x W x C的4D张量直接送入3D CNN进行特征提取和回归。例如可以使用Inflated 3D ConvNet将2D卷积核“膨胀”到时间维度。优点模型结构统一能同时捕获空时特征实现相对直接。缺点计算量和内存消耗巨大对视频长度敏感难以处理很长的时间序列。2. 双流网络架构模仿动作识别中的思路设计两个分支一个空间流Spatial Stream处理单帧的外观信息用于定位面部和初步特征一个时间流Temporal Stream处理多帧间的光流或帧差信息用于捕捉运动包括脉搏引起的微动。优点物理意义清晰空间和时间特征解耦可能对运动伪影有更好的鲁棒性。缺点需要计算光流增加预处理开销双流融合策略需要精心设计。3. CNN RNN 的混合架构这是目前许多SOTA论文采用的主流方案。先用一个2D CNN如ResNet、MobileNet的变体对每一帧进行空间特征编码得到一个帧级别的特征向量序列。然后将这个序列送入RNN如LSTM或GRU进行时序建模最后通过全连接层回归出心率值。优点灵活高效。CNN部分可以重用强大的图像预训练模型RNN部分擅长处理变长序列非常适合视频这种时序数据。计算资源相对友好。缺点RNN存在梯度消失/爆炸问题对超长序列建模能力有限训练和推理速度比纯前馈网络慢。4. 基于注意力机制的架构这是更前沿的探索例如使用Transformer或自注意力机制来替代RNN或者设计空间-时间注意力模块让模型自己学会“关注”视频中与心率最相关的区域和时刻。优点强大的长程依赖建模能力并行计算效率高。缺点需要大量的数据训练模型解释性相对较差。我们的选择考虑到项目的实用性、复现难度以及我们在有限计算资源下的可行性我们最终选择了CNN LSTM 的混合架构作为基线模型。它平衡了性能、复杂度和可解释性。具体来说我们使用一个轻量级的MobileNetV2作为空间特征提取器取其高效率和适合移动端部署的优点后面接一个两层的双向LSTM来聚合时序信息最后用一个全连接层输出心率估计值。这个选择不是唯一的正确答案但它是一个稳健的、经过验证的起点。注意模型选型强烈依赖于你的具体目标。如果追求极致的准确率且拥有海量数据和算力可以尝试更复杂的多任务网络或Transformer。如果目标是在手机或嵌入式设备上实时运行那么模型轻量化如知识蒸馏、模型剪枝就必须纳入考虑。3. 数据项目的基石与最大挑战“数据决定天花板模型决定逼近天花板的速度。”这句话在rPPG深度学习项目中体现得淋漓尽致。公开的、高质量的rPPG数据集并不多且各有特点。3.1 常用数据集解析UBFC-rPPG一个非常流行的小型基准数据集。包含两个子集UBFC-DATASET142名受试者在室内稳定光照下进行数学压力测试和UBFC-DATASET2录制于更自然的光照条件下。数据量小但干净非常适合算法验证和快速原型开发。VIPL-HR一个大规模数据集包含2370个来自107人的视频片段涵盖了光照变化、头部运动、不同设备等多种挑战性场景。这是检验模型鲁棒性的重要数据集。MMSE-HR另一个大规模多模态数据集除了RGB视频还包含近红外、深度图等信息适合研究多模态融合。COHFACE包含160段视频记录了受试者在不同状态静止、说话、头部运动下的数据。PURE数据非常干净受试者按要求执行了六种逐步增加难度的运动模式适合研究运动鲁棒性。我们的策略我们以UBFC-DATASET1作为开发和调试的“ playground ”因为其数据干净能快速验证模型 pipeline 是否通畅。然后使用VIPL-HR作为主要训练和验证集因为它更接近真实世界的复杂性。如果条件允许用MMSE-HR或PURE进行补充测试以评估模型在特定挑战下的泛化能力。3.2 数据预处理与增强流水线原始视频不能直接喂给模型。一个健壮的数据预处理流水线至关重要它甚至比模型本身更能影响最终性能。1. 人脸检测与对齐工具我们使用dlib的HOG人脸检测器或MTCNN。dlib更快MTCNN更准尤其是在侧脸或遮挡情况下。对于实时性要求高的场景也可以考虑轻量级的BlazeFace。关键点与对齐检测到人脸后使用dlib的68点或mediapipe的面部网格获取关键点。然后进行相似性变换旋转、缩放、平移将每一帧的人脸对齐到一个标准模板如112x112像素。对齐的目的是消除头部刚体运动带来的像素位移这是减少运动伪影的关键第一步。实操心得不要只对齐一次对于长视频人脸位置会漂移。我们采用逐帧检测但以第一帧或一个固定帧为参考进行对齐的策略。如果追求速度可以每N帧检测一次中间帧使用跟踪算法如KCF。2. 信号标准化与滤波将对齐后的人脸区域或我们定义的ROI如双颊区域的RGB值进行空间平均得到每个通道的时间序列R(t), G(t), B(t)。对这些原始信号进行带通滤波。人的心率范围通常在0.7 Hz 到 4 Hz即42 bpm 到 240 bpm之间。我们使用一个4阶巴特沃斯带通滤波器截止频率设为[0.7, 4.0]Hz以滤除高频噪声和极低频的基线漂移如缓慢的光照变化。为什么是巴特沃斯因为它通常具有最平坦的通带频率响应能较好地保留我们关心的频段内的信号形态。3. 数据切片与标签生成视频很长我们不可能将整个视频输入网络。通常将其切割成固定长度的时间窗口例如10秒在30fps下就是300帧。每个窗口作为一个训练样本。对应的标签即这个时间窗口内的平均心率。如何获取如果数据集提供了同步的接触式心率仪如ECG或PPG数据那是最理想的。我们可以计算该窗口内ECG R-R间期的平均值。如果没有一些数据集提供了逐帧或逐秒的心率标签我们可以取窗口内的平均值。窗口重叠为了增加数据量我们通常使用滑动窗口比如步长为1秒这样可以从一段长视频中生成许多有重叠的样本。4. 数据增强这是提升模型鲁棒性的“魔法”。对于rPPG有效的增强必须模拟真实世界的干扰同时不能破坏微弱的生理信号。空间增强谨慎使用轻微的随机旋转±5度、平移、缩放可以模拟头部微小晃动。切忌使用强烈的颜色抖动如亮度、对比度剧烈变化或裁剪因为它们会直接破坏与心率相关的肤色信息。时间增强更安全有效。可以模拟帧率变化轻微的时间缩放或者在时间维度上进行随机裁剪。信号增强在预处理后的信号层面进行。可以添加高斯白噪声模拟传感器噪声或者将不同受试者的运动伪影信号通过高通滤波从原始信号中提取按一定比例混合到当前信号中模拟复杂的运动干扰。踩坑实录早期我们曾尝试对输入人脸图像进行大幅度的颜色增强结果模型完全无法收敛。后来意识到rPPG信号就“编码”在肤色微小的周期性变化里颜色增强无异于直接破坏了信号源。从此我们规定空间增强以几何变换为主且幅度要小。4. 模型构建与训练实战理论说再多不如一行代码。让我们进入实战环节基于PyTorch框架构建我们的CNN-LSTM rPPG心率估计模型。4.1 模型结构详解import torch import torch.nn as nn import torchvision.models as models class rPPG_CNN_LSTM(nn.Module): def __init__(self, frame_length300, hidden_size128, num_layers2, dropout0.5): super(rPPG_CNN_LSTM, self).__init__() # 空间特征提取器使用预训练的MobileNetV2去掉最后的分类层 backbone models.mobilenet_v2(pretrainedTrue) # 我们取直到倒数第二个卷积块的特征通常是一个7x7的空间维度 # 实际需要根据backbone的输出维度调整 self.cnn_feature_extractor nn.Sequential(*list(backbone.children())[:-1]) # 移除分类头 # 假设经过CNN和自适应池化后特征图被展平为一个向量维度是backbone的输出特征数 # MobileNetV2最后一层特征维度通常是1280 self.cnn_output_features 1280 # 时序建模双向LSTM self.lstm nn.LSTM( input_sizeself.cnn_output_features, hidden_sizehidden_size, num_layersnum_layers, batch_firstTrue, bidirectionalTrue, dropoutdropout if num_layers 1 else 0 ) # 回归头 # 双向LSTM所以hidden_size需要乘以2 self.regressor nn.Sequential( nn.Linear(hidden_size * 2, 64), nn.ReLU(), nn.Dropout(dropout), nn.Linear(64, 1) # 输出一个值估计的心率 ) def forward(self, x): # x 形状: (batch_size, seq_len, C, H, W) batch_size, seq_len, C, H, W x.shape # 1. 空间特征提取将每一帧独立地通过CNN # 先将 batch 和 seq 维度合并一次性通过CNN提升效率 x x.view(batch_size * seq_len, C, H, W) spatial_features self.cnn_feature_extractor(x) # 输出形状: (batch_size*seq_len, 1280, 1, 1) 经过全局平均池化后 spatial_features spatial_features.view(batch_size, seq_len, -1) # 形状: (batch_size, seq_len, 1280) # 2. 时序建模 lstm_out, _ self.lstm(spatial_features) # lstm_out 形状: (batch_size, seq_len, hidden_size*2) # 3. 取最后一个时间步的输出或者对所有时间步的输出做平均这里我们取最后一个时间步 # 也可以尝试使用注意力机制来加权聚合 last_time_step_features lstm_out[:, -1, :] # 4. 回归心率 hr_pred self.regressor(last_time_step_features) return hr_pred.squeeze(-1) # 去掉最后的维度输出 (batch_size,)关键点解析CNN部分冻结与微调我们加载了在ImageNet上预训练的MobileNetV2权重。在训练初期可以先冻结CNN部分的参数只训练LSTM和回归头。这样能防止预训练好的视觉特征被迅速破坏。训练几个epoch后再解冻CNN的后面几层进行微调。序列处理我们将(batch, seq_len, C, H, W)的张量重塑为(batch*seq_len, C, H, W)送入CNN然后再恢复时序维度。这比在循环中逐帧处理高效得多。LSTM输出聚合这里简单取了最后一个时间步的输出认为它包含了整个序列的上下文信息。你也可以尝试对所有时间步的输出取平均或者加入一个注意力层来自动学习每个时间步的重要性权重。4.2 损失函数与评价指标的选择损失函数 回归任务最常用的是均方误差。但对于心率估计我们更关心相对误差因为心率80和90的绝对差是10心率50和60的绝对差也是10但前者误差比例是12.5%后者是20%。因此平均绝对百分比误差也是一个很好的选择它对低心率值的误差惩罚更重。 我们最终使用了Smooth L1 Loss它是L1和L2损失的结合在误差较小时使用L2更平滑利于梯度下降误差较大时使用L1对异常值更鲁棒。criterion nn.SmoothL1Loss(beta1.0) # beta是L1和L2切换的阈值评价指标 不能只看损失函数。在论文和实际评估中常用以下几个指标平均绝对误差最直观的指标。均方根误差对大的误差更敏感。皮尔逊相关系数衡量预测值与真实值之间的线性相关程度值越接近1越好。** Bland-Altman 分析**在医学测量中非常常用用于评估两种测量方法的一致性。它会给出一致性界限我们可以计算有多少比例的数据点落在界限内。4.3 训练策略与超参数调优优化器AdamWAdam with decoupled weight decay是目前的首选它比原始Adam泛化性能更好。初始学习率设为3e-4。学习率调度使用CosineAnnealingLR或ReduceLROnPlateau。我们采用了CosineAnnealingLR让学习率随着训练过程平滑下降有助于模型收敛到更优的局部最小值。批大小受限于GPU内存我们用的是11GB的RTX 2080 Ti我们将批大小设为8。如果使用更小的模型或更大的显存可以适当增加。训练技巧梯度裁剪LSTM容易出现梯度爆炸设置梯度裁剪如clip_grad_norm_1.0是必要的安全措施。早停在验证集损失连续多个epoch不下降时停止训练防止过拟合。模型集成训练多个不同随机种子初始化的模型在测试时取它们的预测平均值可以稳定地提升性能。我们的超参数设置表超参数值说明优化器AdamW权重衰减0.01初始学习率3e-4学习率调度器CosineAnnealingLRT_maxepoch数批大小8根据显存调整时间窗口长度300帧 (10秒 30fps)太短信号不完整太长计算负担大LSTM隐藏层大小128LSTM层数2Dropout率0.5在LSTM层和全连接层使用防止过拟合训练轮数100配合早停5. 实验、评估与结果分析模型训练好了是骡子是马得拉出来溜溜。我们按照标准的机器学习流程在预留的测试集上进行了评估。5.1 实验设置数据集划分对于UBFC和VIPL-HR数据集我们均按照受试者独立的原则划分训练集、验证集和测试集例如按8:1:1的比例划分受试者。绝对禁止将同一个人的数据同时出现在训练集和测试集那会导致严重的数据泄露和过拟合评估结果毫无意义。基线对比我们对比了以下方法传统方法CHROM算法。深度学习基线一个简单的3D CNN模型C3D。我们的模型上述的CNN-LSTM模型。我们的模型数据增强在3的基础上加入了我们设计的时间域和信号域增强。5.2 结果与讨论我们在VIPL-HR测试集上的主要结果如下表所示方法MAE (bpm) ↓RMSE (bpm) ↓Pearson‘s r ↑CHROM8.711.20.813D CNN6.38.50.88CNN-LSTM (Ours)4.15.80.93CNN-LSTM Aug (Ours)3.54.90.95分析深度学习方法显著优于传统方法我们的CNN-LSTM模型将MAE从CHROM的8.7 bpm降低到了4.1 bpm提升超过50%。这清晰地证明了深度学习在从复杂视频中学习鲁棒生理特征方面的能力。时序建模的重要性我们的CNN-LSTM模型比单纯的3D CNNMAE 6.3表现更好。这说明对于rPPG这种强时序信号显式地使用LSTM进行序列建模是有效的。数据增强的威力加入针对性的数据增强后性能得到了进一步提升MAE 3.5。这印证了我们在数据预处理部分的观点在数据有限的情况下高质量的数据增强是提升模型泛化能力的低成本高回报手段。Bland-Altman分析我们绘制了Bland-Altman图结果显示大约95%的数据点落在一致性界限±1.96 SD内且偏差均值接近于0说明我们的方法与接触式测量方法具有较好的一致性。可视化我们还会随机选取一些测试样本绘制出模型预测的心率信号通过对网络中间层的特征进行逆变换或使用注意力图与经过滤波的绿色通道信号作为参考的对比图。这能直观地看到模型是否真的学到了有规律的脉搏波而不是在“猜”。6. 部署考量与优化技巧模型在测试集上表现好不等于在实际应用中就能工作。部署是另一个维度的挑战。6.1 模型轻量化我们的基线模型MobileNetV2 BiLSTM参数量大约在500万左右在服务器上运行没问题但在手机或边缘设备上实时运行例如30fps仍有压力。知识蒸馏训练一个庞大的“教师网络”然后用它来指导一个轻量级的“学生网络”学习。学生网络可以达到接近教师网络的性能但体积和计算量小得多。模型剪枝移除网络中不重要的连接或通道。例如我们可以对CNN和LSTM的权重进行稀疏化训练然后剪掉那些接近零的权重。量化将模型权重和激活从32位浮点数转换为8位整数。这能大幅减少模型大小和加速推理尤其适合移动端AI芯片。PyTorch和TensorFlow都提供了相关的工具。更轻的Backbone将MobileNetV2替换为更极致的轻量级网络如ShuffleNetV2或专门为移动端设计的EfficientNet-Lite。6.2 实时处理Pipeline一个完整的实时rPPG系统流程如下摄像头捕获 - 人脸检测 - 人脸对齐 - ROI提取 - 信号缓冲攒够一个时间窗口如10秒- 模型推理 - 心率值输出 - 滑动窗口更新流水线优化人脸检测和对齐是计算瓶颈。可以考虑使用更快的检测器或者降低检测频率如每秒检测一次中间用跟踪器。滑动窗口与平滑为了输出实时的心率曲线我们采用重叠的滑动窗口进行推理。例如每新来一帧就移除窗口最旧的一帧加入新帧然后重新推理。这样会产生高频抖动。需要对连续输出的心率值进行滑动平均滤波或卡尔曼滤波以获得平滑稳定的读数。异步处理将视频捕获、人脸检测、模型推理放在不同的线程中避免阻塞。6.3 实际应用中的挑战与应对极端光照过暗或过亮都会导致信噪比极低。可以尝试在预处理中加入自适应直方图均衡化或Retinex算法来增强图像。更根本的需要在数据收集中涵盖这些场景。剧烈运动跑步、健身等场景下运动伪影是主要噪声源。除了模型要足够鲁棒可以尝试引入惯性测量单元数据如手机陀螺仪来辅助运动补偿这是一个多模态融合的研究方向。多人场景需要先进行多人人脸检测和跟踪为每个人维护独立的信号缓冲区和模型状态。计算开销会成倍增加。无面部区域对于手背、耳廓等其他身体部位其rPPG信号特征可能与面部不同需要重新收集数据和训练模型。7. 常见问题与排查指南在开发和调试过程中你几乎一定会遇到下面这些问题。这里是我的排查清单。问题现象可能原因排查步骤与解决方案训练损失不下降1. 学习率太大或太小。2. 数据预处理错误信号已失真。3. 模型结构有bug如梯度无法回传。4. 标签错误单位不对如BPM vs Hz。1. 绘制学习率曲线尝试一个数量级的变化如1e-5, 1e-4, 1e-3。2.可视化预处理后的信号这是最重要的调试步骤。用Matplotlib画出几个样本滤波前后的RGB信号看是否有清晰的周期性。如果没有检查人脸对齐、ROI提取和滤波参数。3. 检查模型前向传播输出形状检查反向传播是否正常loss.backward()后查看参数梯度是否为非零。4. 核对数据集的标签文件确认心率单位是BPM次/分钟。验证集损失远大于训练集1. 严重的过拟合。2. 训练集和验证集分布差异大如光照条件不同。3. 数据增强只在训练集做验证集没做但评估时用了增强后的指标(错误)1. 增加Dropout率加强L2权重衰减使用更简单的模型或收集更多数据。2. 确保数据划分是受试者独立的并且检查两个集合的统计信息如亮度均值。考虑使用领域自适应技术。3.验证和测试阶段必须关闭数据增强使用完全相同的预处理流程。模型预测值在一个常数附近波动1. 模型学到了数据中的偏差如平均心率。2. 最后一层回归层的激活函数用错了如用了Sigmoid。3. 标签没有进行标准化而网络输出范围受限。1. 检查数据集中心率标签的分布是否严重不平衡。可以对标签进行标准化减均值除标准差让模型学习相对变化。2. 回归任务最后一层通常不应该使用任何非线性激活函数直接线性输出。3. 如果输入数据标准化了但标签没有可能导致学习困难。尝试对标签也进行标准化。实时推理心率跳变剧烈1. 滑动窗口长度太短信号不平稳。2. 没有进行后处理平滑。3. 人脸跟踪丢失导致ROI剧烈跳动。1. 增加时间窗口长度如从5秒增加到10秒代价是延迟增加。2. 对模型输出的心率序列应用滑动平均滤波窗口大小3-5或卡尔曼滤波。3. 加强人脸跟踪的鲁棒性或当跟踪丢失时暂停输出直到重新稳定检测到人脸。在某个特定数据集上效果好换一个就变差1. 模型过拟合到了源数据集的特定分布光照、肤色、相机型号。2. 预处理流程不一致如人脸检测器、关键点模型、滤波参数不同。1. 在训练时使用更多样化的数据集进行混合训练。2. 使用领域泛化技术让模型学习域不变的特征。3.严格统一预处理流程。确保在两个数据集上使用完全相同的人脸检测、对齐和滤波代码与参数。这个项目从构思到实现是一个典型的将学术想法工程化的过程。最大的体会是在rPPG这个领域数据和质量控制往往比模型结构本身更重要。一个精心设计的、模拟了真实世界挑战的数据增强策略其带来的性能提升可能超过换一个更复杂的网络架构。另外可解释性仍然是一个挑战。我们虽然得到了不错的心率数字但模型到底“看”到了什么可视化中间层的注意力图或特征图对于调试模型和建立信任至关重要。未来结合更细粒度的面部区域分析、多波长信息如果有多光谱摄像头以及端到端的信号生成直接生成脉搏波波形而不仅仅是心率都是值得探索的方向。希望这份详尽的拆解能为你点亮通往非接触式生理信号感知这座宝藏的一盏路灯。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进