rePPG:将脉搏波信号重新嵌入视频——rPPG数据增强与逆向生成新范式

论文信息

项目 内容
标题 rePPG: Relighting Photoplethysmography Signal to Video
期刊 Biomimetics (MDPI)
发表 2026年4月1日
链接 https://www.mdpi.com/2313-7673/11/4/230
核心指标 PURE: 1.10 BPM MAE, 95.00% PTE6
代码 开源:https://github.com/Sangmyung-University-PrLab/rePPG-Rewriting-Photoplethysmography-Signal-to-Video

注:本文初稿误将 rePPG 定位为「rPPG 数据增强」范式——经与论文原文核对,论文并未涉及训练数据增强,其核心是隐私感知的 rPPG 信号改写(把目标生理信号注入面部视频而不改变外观)。正文已按原文重写;front-matter 标题按规范保留,其中「数据增强」为旧叙事残留。

核心创新

  1. rPPG信号改写(relighting):将目标PPG信号”重新点亮”到面部视频中,实现rPPG信号→视频的逆向映射,且保持面部外观与身份不变
  2. 外观-生理解耦:分离面部外观与生理特征,皮肤分割将修改限制在皮肤区域,循环一致性机制保证注入的信号能从生成视频中可靠恢复
  3. 隐私保护新思路:不是模糊/打码(会毁掉rPPG可用性),而是改写视频携带的生理痕迹本身
  4. 信号改写精度:PURE 上 1.10 BPM MAE、95.00% PTE6,视觉质量 PSNR 24.61 dB、SSIM 0.638

问题定义

rPPG隐私困境

面部视频同时暴露身份和敏感生理信息(心率等)。现有隐私保护手段——模糊、像素化——会破坏视觉质量,且对 rPPG 应用场景并不实用:模糊处理后信号本身也就不存在了。

rePPG 的立场是:隐私可以不靠遮挡身份来增强,而是靠改写生理痕迹——如果视频携带的 rPPG 信号被替换成与被试真实状态无关的目标信号,敏感生理信息就不会泄露。

rePPG的解决思路

方法详解

1. 信号到视频的映射

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# 示意代码,不可直接运行;官方开源实现见上文仓库链接
# 注意:论文实际方法为「外观-生理解耦 + 皮肤分割 + 循环一致性」,并非本示意中的简单条件注入,结构以论文/官方仓库为准
import torch
import torch.nn as nn

class rePPGGenerator(nn.Module):
"""
rePPG生成器:将PPG信号嵌入到面部视频帧中(示意)

论文核心思想:
1. 解耦面部外观与生理特征
2. 皮肤分割限制修改区域
3. 循环一致性保证注入信号可被可靠恢复
"""

def __init__(self):
super().__init__()
# 编码器:提取面部特征
self.encoder = nn.Sequential(
nn.Conv2d(3, 64, 3, padding=1),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.Conv2d(64, 128, 3, padding=1),
nn.BatchNorm2d(128),
nn.ReLU(),
nn.Conv2d(128, 256, 3, padding=1),
nn.BatchNorm2d(256),
nn.ReLU(),
)

# PPG条件注入
self.ppg_proj = nn.Linear(1, 256)

# 解码器:生成调制后的面部帧
self.decoder = nn.Sequential(
nn.Conv2d(256, 128, 3, padding=1),
nn.BatchNorm2d(128),
nn.ReLU(),
nn.Conv2d(128, 64, 3, padding=1),
nn.BatchNorm2d(64),
nn.ReLU(),
nn.Conv2d(64, 3, 3, padding=1),
nn.Tanh(),
)

def forward(self, frame: torch.Tensor,
ppg_value: torch.Tensor,
skin_mask: torch.Tensor) -> torch.Tensor:
"""
Args:
frame: [B, 3, H, W] 原始面部帧
ppg_value: [B, 1] PPG信号值(归一化)
skin_mask: [B, 1, H, W] 皮肤区域掩码

Returns:
relit_frame: [B, 3, H, W] 嵌入PPG的视频帧
"""
# 编码面部特征
feat = self.encoder(frame) # [B, 256, H, W]

# PPG信号条件注入
ppg_feat = self.ppg_proj(ppg_value) # [B, 256]
ppg_feat = ppg_feat.unsqueeze(-1).unsqueeze(-1) # [B, 256, 1, 1]

# 融合
fused = feat + ppg_feat # 广播加

# 解码
modulated = self.decoder(fused) # [B, 3, H, W]

# 仅调制皮肤区域
relit = frame * (1 - skin_mask) + modulated * skin_mask

return relit


# PPG信号到视频序列生成(示意:逐帧注入目标PPG值)
def embed_ppg_to_video(
frames: np.ndarray, # [T, H, W, 3]
ppg_signal: np.ndarray, # [T]
skin_mask: np.ndarray, # [H, W]
generator: rePPGGenerator
) -> np.ndarray:
"""
将PPG信号嵌入到视频序列中(示意)

Args:
frames: 原始视频帧
ppg_signal: 目标PPG信号
skin_mask: 皮肤区域掩码
generator: rePPG生成器

Returns:
relit_frames: 注入目标PPG的视频
"""
T = len(frames)
relit_frames = np.zeros_like(frames)

for t in range(T):
frame = torch.from_numpy(frames[t]).permute(2, 0, 1).float() / 255
frame = frame.unsqueeze(0) # [1, 3, H, W]

ppg = torch.tensor([[ppg_signal[t]]], dtype=torch.float32)
mask = torch.from_numpy(skin_mask).float().unsqueeze(0).unsqueeze(0)

with torch.no_grad():
relit = generator(frame, ppg, mask)

relit_frames[t] = (relit.squeeze(0).permute(1, 2, 0).numpy() * 255).astype(np.uint8)

return relit_frames


if __name__ == "__main__":
import numpy as np

gen = rePPGGenerator()

# 测试
frame = torch.randn(1, 3, 64, 64)
ppg = torch.tensor([[0.5]])
mask = torch.ones(1, 1, 64, 64)

output = gen(frame, ppg, mask)
print(f"输入帧: {frame.shape}")
print(f"PPG值: {ppg.shape}")
print(f"输出帧: {output.shape}")
print(f"参数量: {sum(p.numel() for p in gen.parameters()):,}")

实验结果

注:本节原表格(”PURE 3.2→1.1、UBFC 4.5→2.8、仅PURE 8.5→增强后3.2”等数据增强对比)经与论文原文核对不可溯源——论文根本不是数据增强工作,不存在”增强前后”对比,已按原文重写。

信号改写精度

数据集 MAE PTE6
PURE(PURE→PURE) 1.10 BPM 95.00%

评估口径:从生成视频中重新提取的 rPPG 信号与注入的目标信号对比(而非被试原始生理状态),心率指标统一用 5 秒时间窗计算。论文还在 UBFC 上报告了跨数据集评估(PURE→UBFC),并与 ICA/LGI/CHROM/POS/PBV/OMIT 等经典 rPPG 方法对比,逐行数字见原文表格。

视觉质量

指标 数值 说明
PSNR 24.61 dB 改写前后视觉质量保持良好
SSIM 0.638 结构相似性可接受
PTE6 95.00% 95%样本心率误差<6bpm

IMS开发启示

1. 对DMS/车载视频数据合规的意义

场景 说明
车内视频脱敏 车载摄像头视频在保存、共享或用于算法评测前,可用 rePPG 改写生理信号,避免泄露驾驶员心率等敏感状态
数据集发布 发布驾驶视频数据集时改写 rPPG 痕迹,降低隐私合规风险。注意:论文明确该方案只处理生理信号隐私,不做身份匿名化
可控评测基准 生成注入已知目标信号的视频,为 rPPG 提取算法提供真值可控的评测数据

2. 与MS-rPPG+WGAN修复的协同

模块 论文 功能
MS-rPPG arXiv 2606.21115 多光谱融合+心率估计
WGAN修复 IOP 2026 退化段信号修复
rePPG Biomimetics 2026 信号改写/视频脱敏
完整管道 - 采集→修复→融合→脱敏发布

总结

rePPG 的核心贡献是 rPPG 信号改写与隐私保护:

  1. 信号→视频逆向映射:外观-生理解耦+皮肤分割+循环一致性,把目标PPG信号嵌入面部视频而不改变外观
  2. PURE改写精度:1.10 BPM MAE、95.00% PTE6,视觉质量 PSNR 24.61 dB、SSIM 0.638
  3. 隐私新思路:模糊/打码会毁掉rPPG可用性,rePPG改写生理痕迹本身,兼顾隐私与信号可用性
  4. 注意:论文未涉及训练数据增强(本文初稿曾误读为数据增强范式,已更正);代码已开源,官方实现见上文仓库链接