WiFi感知3D人体姿态:物理信息驱动的跨环境鲁棒性方案

论文信息

  • 标题: Physics-Informed WiFi Sensing for Robust 3D Human Pose Estimation in Mobile and Cross-Environment Settings
  • arXiv: 2608.23995
  • 作者: Kaixuan Huang 等
  • 链接: https://arxiv.org/abs/2608.23995
  • 数据集: Person-in-WiFi-3D, MM-Fi
  • 核心方法: 多径感知注意力 + 解耦表示学习 + 物理建模信号传播

核心创新

首次将物理信号传播模型嵌入WiFi人体姿态估计,解决跨环境泛化问题。 现有WiFi姿态估计在训练环境表现良好,但换到新环境时性能严重退化——因为多径传播特性随环境变化。

三大创新:

  1. 物理建模WiFi信号传播——显式建模多径效应
  2. 多径感知注意力机制——捕获环境依赖的信号变化
  3. 解耦表示学习——分离姿态特征和环境特征

方法详解

1. 整体架构

2. WiFi CSI信号基础

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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
import numpy as np
import torch
import torch.nn as nn

class PhysicsInformedWiFiPose(nn.Module):
"""
物理信息WiFi感知3D人体姿态估计

论文: arXiv 2608.23995
核心: 多径感知注意力 + 解耦表示学习

输入: WiFi CSI (Channel State Information)
输出: 3D人体关节坐标

优势: 跨环境泛化, 无需摄像头, 隐私保护
"""

def __init__(self,
num_joints=17,
csi_shape=(3, 30, 114), # (antennas, subcarriers, time)
hidden_dim=256):
super().__init__()

# 物理传播建模模块
self.phys_module = MultipathModeling(
num_antennas=csi_shape[0],
num_subcarriers=csi_shape[1]
)

# 多径感知注意力
self.multipath_attention = MultipathAttention(
input_dim=csi_shape[0] * csi_shape[1],
hidden_dim=hidden_dim
)

# 解耦表示学习
self.pose_encoder = nn.Sequential(
nn.Linear(hidden_dim, hidden_dim),
nn.ReLU(),
nn.Linear(hidden_dim, hidden_dim)
)

self.env_encoder = nn.Sequential(
nn.Linear(hidden_dim, hidden_dim // 2),
nn.ReLU(),
nn.Linear(hidden_dim // 2, hidden_dim // 4) # 环境编码更紧凑
)

# 姿态解码器
self.pose_decoder = nn.Sequential(
nn.Linear(hidden_dim, hidden_dim),
nn.ReLU(),
nn.Linear(hidden_dim, num_joints * 3) # 3D坐标
)

# 环境判别器(对抗训练)
self.env_discriminator = nn.Sequential(
nn.Linear(hidden_dim, hidden_dim // 2),
nn.ReLU(),
nn.Linear(hidden_dim // 2, 1),
nn.Sigmoid()
)

def forward(self, csi: torch.Tensor) -> dict:
"""
前向传播

Args:
csi: (B, 3, 30, T) CSI信号

Returns:
dict: {
'pose_3d': (B, 17, 3) 3D关节坐标,
'pose_feat': (B, hidden_dim) 姿态特征,
'env_feat': (B, hidden_dim//4) 环境特征
}
"""
B = csi.shape[0]

# 1. 物理传播建模
phys_features = self.phys_module(csi)

# 2. 多径感知注意力
attended = self.multipath_attention(phys_features)

# 3. 解耦: 姿态 vs 环境
pose_feat = self.pose_encoder(attended)
env_feat = self.env_encoder(attended)

# 4. 解码3D姿态
pose_3d = self.pose_decoder(pose_feat).view(B, -1, 3)

return {
'pose_3d': pose_3d,
'pose_feat': pose_feat,
'env_feat': env_feat
}


class MultipathModeling(nn.Module):
"""多径传播物理建模"""

def __init__(self, num_antennas, num_subcarriers):
super().__init__()
self.num_antennas = num_antennas
self.num_subcarriers = num_subcarriers

# 可学习的多径参数
self.num_paths = 5 # 假设5条主要多径
self.path_gains = nn.Parameter(torch.randn(self.num_paths))
self.path_delays = nn.Parameter(torch.randn(self.num_paths))
self.path_angles = nn.Parameter(torch.randn(self.num_paths, num_antennas))

# CSI到特征的CNN
self.cnn = nn.Sequential(
nn.Conv2d(num_antennas, 32, 3, padding=1),
nn.ReLU(),
nn.Conv2d(32, 64, 3, padding=1),
nn.ReLU(),
nn.AdaptiveAvgPool2d((1, None)) # 时间维度保留
)

def forward(self, csi: torch.Tensor) -> torch.Tensor:
"""
物理建模的前向传播

CSI模型: H(f,t) = Σ_k α_k * exp(-j2πf*τ_k) * a(θ_k)
其中: α_k=路径增益, τ_k=延迟, θ_k=到达角
"""
B = csi.shape[0]

# 物理模型: 多径叠加
# 在实际实现中会显式计算多径模型
# 这里用CNN近似提取物理相关特征
features = self.cnn(csi) # (B, 64, 1, T)
T = features.shape[-1]

# 展平
return features.view(B, -1, T).permute(0, 2, 1) # (B, T, 64)


class MultipathAttention(nn.Module):
"""多径感知注意力"""

def __init__(self, input_dim, hidden_dim, num_heads=4):
super().__init__()
self.input_proj = nn.Linear(input_dim, hidden_dim)
self.attention = nn.MultiheadAttention(
embed_dim=hidden_dim,
num_heads=num_heads,
batch_first=True
)
self.norm = nn.LayerNorm(hidden_dim)

def forward(self, x):
x = self.input_proj(x)
attended, _ = self.attention(x, x, x)
# 残差连接
x = self.norm(x + attended)
# 全局平均池化
return x.mean(dim=1) # (B, hidden_dim)


# 测试
if __name__ == "__main__":
model = PhysicsInformedWiFiPose()

# 模拟WiFi CSI
csi = torch.randn(4, 3, 30, 114) # (B, antennas, subcarriers, time)

output = model(csi)

print("=== Physics-Informed WiFi Pose 测试 ===")
print(f"输入CSI: {csi.shape}")
print(f"3D姿态: {output['pose_3d'].shape} (B, 17关节, 3D坐标)")
print(f"姿态特征: {output['pose_feat'].shape}")
print(f"环境特征: {output['env_feat'].shape}")
print()
print("论文核心价值:")
print("1. 物理建模WiFi多径传播 → 跨环境泛化")
print("2. 解耦姿态和环境特征 → 新环境无需重训练")
print("3. 无需摄像头 → 隐私保护")

3. 跨环境评估结果

数据集 训练环境 测试环境 MPJPE(mm) 对比基线
Person-in-WiFi-3D 同环境 同环境 45.2 48.1
Person-in-WiFi-3D 实验室 办公室 52.8 68.3
Person-in-WiFi-3D 实验室 会议室 55.1 72.5
MM-Fi 实验室A 实验室B 48.3 65.7

核心发现: 跨环境时MPJPE增加仅7-8mm,基线增加20-25mm。解耦学习有效。

IMS开发启示

1. WiFi感知在座舱中的潜在应用

应用 可行性 说明 优先级
OOP异常姿态 ⚠️ 中 精度不如摄像头,但可作补充 🟡 P1
CPD儿童检测 ⚠️ 中 呼吸检测可行,姿态精度不足 🟡 P1
乘员计数 ✅ 高 人体存在/不存在检测准确 🔴 P0
座椅占用 ✅ 高 比压力传感器更灵活 🔴 P0
隔排检测 ✅ 高 WiFi穿透座椅无遮挡 🟡 P1

2. WiFi vs mmWave vs 摄像头对比

维度 WiFi mmWave 摄像头
隐私 ✅ 最高 ✅ 高 ❌ 低
穿透遮挡 ✅ 最强 ⚠️ 中 ❌ 无
姿态精度 ⚠️ 中(48-55mm) ⚠️ 中 ✅ 高
成本 ✅ 最低(已有WiFi) 中 低
部署改动 ✅ 软件升级 需加雷达 需加摄像头
多人场景 ⚠️ 中 ✅ 好 ✅ 好
车规可行性 ⚠️ 需验证 ✅ 车规雷达 ✅ 车规摄像头

3. 座舱WiFi感知方案建议

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
class CabinWiFiSensing:
"""
座舱WiFi感知方案

利用现有车载WiFi/蓝牙硬件
通过CSI信号变化检测乘员状态

无需额外传感器,软件升级即可
"""

def __init__(self):
# 使用车载WiFi的CSI
self.num_antennas = 4 # 车载MIMO
self.num_subcarriers = 56 # 802.11n/ac
self.sample_rate = 100 # Hz

def detect_occupancy(self, csi_buffer):
"""检测座椅占用"""
# CSI方差 > 阈值 → 有人
variance = np.var(csi_buffer, axis=-1)
occupied = np.any(variance > 0.5, axis=0)
return occupied

def detect_breathing(self, csi_buffer):
"""检测呼吸率(CPD核心)"""
# 呼吸频率0.1-0.5Hz
from scipy import signal as sig
fft = np.fft.fft(np.mean(csi_buffer, axis=(0,1)))
freqs = np.fft.fftfreq(len(fft), 1/self.sample_rate)

# 0.1-0.5Hz范围峰值
mask = (freqs >= 0.1) & (freqs <= 0.5)
breathing_rate = freqs[mask][np.argmax(np.abs(fft[mask]))] * 60

return breathing_rate # breaths/min

4. 技术迁移优先级

优先级 功能 方案 周期
P0 乘员占用检测 WiFi CSI方差 2个月
P1 CPD呼吸检测 WiFi CSI频域分析 4个月
P1 座椅人数计数 多天线CSI 3个月
P2 OOP姿态粗估 WiFi 3D姿态模型 8个月
P3 多模态融合 WiFi+mmWave+摄像头 12个月

总结

WiFi姿态估计不会替代摄像头,但提供了零成本、零安装、隐私友好的补充感知通道。

对IMS的4条可执行建议:

  1. 乘员占用检测是最佳切入点——利用现有车载WiFi,软件升级即可
  2. CPD呼吸检测可行——CSI频域0.1-0.5Hz峰值对应呼吸
  3. 姿态精度不足做OOP——48-55mm误差太大,仅做粗检测
  4. 跨环境泛化是核心挑战——解耦表示学习是论文核心贡献

论文链接: https://arxiv.org/abs/2608.23995
数据集: Person-in-WiFi-3D, MM-Fi