Everybody Tracking Every Body:多视角自我中心 3D 姿态融合——OOP 多人检测新思路

论文来源:arXiv 2608.29927,2026年8月30日
核心创新:多人体各佩戴摄像头 + VIO SLAM + 扩散模型融合
关键指标:多人交互场景,绝对和相对姿态精度均优于基线
IMS 相关性:⭐⭐⭐(OOP 多乘员检测的远期参考方案)


论文信息

项目 内容
标题 Everybody Tracking Every Body
arXiv 2608.29927
发表日期 2026年8月30日
作者 Charless Fowlkes 等
领域 cs.CV
链接 https://arxiv.org/abs/2608.29927

核心创新

问题定义

多人交互场景中,从**多个自我中心视角(egocentric views)**进行 3D 姿态估计:

  • 每个人佩戴一个摄像头 + IMU
  • VIO SLAM 追踪每个摄像头在空间中的运动
  • 每个摄像头同时看到自己的身体(第一人称)和他人身体(第三人称)
  • 需要融合这些稀疏、间歇、可靠性变化大的观测

方法核心

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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
"""
Everybody Tracking Every Body - 多视角自我中心 3D 姿态融合

核心思路:
1. 每人佩戴摄像头 → VIO SLAM 获得头部运动轨迹
2. 第一人称视角 → 推断自身身体姿态
3. 第三人称视角(看到他人)→ 推断他人姿态
4. 扩散模型融合 → 基于头运动+外向观测

关键挑战:
- 外向观测稀疏、间歇、可靠性变化大
- 需要同时处理内容和可靠性
"""

import torch
import torch.nn as nn
import torch.nn.functional as F

class EgocentricPoseEncoder(nn.Module):
"""
自我中心视角姿态编码器

从第一人称视频提取自身身体姿态估计
"""

def __init__(self, feat_dim: int = 256):
super().__init__()
# CNN 提取视觉特征
self.visual_encoder = nn.Sequential(
nn.Conv2d(3, 32, 3, stride=2, padding=1),
nn.ReLU(),
nn.Conv2d(32, 64, 3, stride=2, padding=1),
nn.ReLU(),
nn.Conv2d(64, 128, 3, stride=2, padding=1),
nn.ReLU(),
nn.AdaptiveAvgPool2d((4, 4)),
nn.Flatten(),
nn.Linear(128 * 16, feat_dim)
)

def forward(self, ego_frame: torch.Tensor) -> torch.Tensor:
return self.visual_encoder(ego_frame)


class ExocentricPoseEncoder(nn.Module):
"""
外向视角(看到他人)姿态编码器

从第三人称视角提取他人姿态估计
包含可靠性估计
"""

def __init__(self, feat_dim: int = 256):
super().__init__()
# 视觉特征
self.visual_encoder = nn.Sequential(
nn.Conv2d(3, 32, 3, stride=2, padding=1),
nn.ReLU(),
nn.Conv2d(32, 64, 3, stride=2, padding=1),
nn.ReLU(),
nn.Conv2d(64, 128, 3, stride=2, padding=1),
nn.ReLU(),
nn.AdaptiveAvgPool2d((4, 4)),
nn.Flatten(),
nn.Linear(128 * 16, feat_dim)
)
# 可靠性估计
self.reliability_head = nn.Sequential(
nn.Linear(feat_dim, 64),
nn.ReLU(),
nn.Linear(64, 1),
nn.Sigmoid()
)

def forward(self, exo_frame: torch.Tensor) -> tuple:
feat = self.visual_encoder(exo_frame)
reliability = self.reliability_head(feat)
return feat, reliability


class DiffusionFusionModel(nn.Module):
"""
扩散模型融合

将头部运动先验 + 第一人称 + 第三人称观测
通过扩散过程融合为最终姿态

论文核心:条件于观测内容和可靠性
"""

def __init__(self, pose_dim: int = 17 * 3, feat_dim: int = 256):
super().__init__()
self.pose_dim = pose_dim

# 条件编码
self.ego_encoder = nn.Linear(feat_dim, 128)
self.exo_encoder = nn.Linear(feat_dim, 128)
self.head_motion_encoder = nn.Linear(6, 128) # 6DoF 头部位姿

# 扩散网络(简化版 U-Net)
self.denoise_net = nn.Sequential(
nn.Linear(pose_dim + 128 * 3, 512),
nn.ReLU(),
nn.Linear(512, 512),
nn.ReLU(),
nn.Linear(512, 512),
nn.ReLU(),
nn.Linear(512, pose_dim)
)

def forward(self, noisy_pose: torch.Tensor, t: torch.Tensor,
ego_feat: torch.Tensor, exo_feat: torch.Tensor,
head_motion: torch.Tensor) -> torch.Tensor:
"""
去噪一步

Args:
noisy_pose: (B, pose_dim) 加噪的姿态
t: (B,) 时间步
ego_feat: (B, 128) 自我中心特征
exo_feat: (B, 128) 外向观测特征
head_motion: (B, 6) 头部运动
"""
# 编码条件
ego_cond = self.ego_encoder(ego_feat)
exo_cond = self.exo_encoder(exo_feat)
head_cond = self.head_motion_encoder(head_motion)

# 拼接
x = torch.cat([noisy_pose, ego_cond, exo_cond, head_cond], dim=-1)

# 预测噪声
return self.denoise_net(x)


class MultiPersonPoseTracker:
"""
多人姿态追踪系统

IMS 远期应用:座舱内多乘员姿态追踪
(不是每人佩戴摄像头,而是车内多个摄像头角度)
"""

def __init__(self, num_persons: int = 4, num_cameras: int = 3):
self.num_persons = num_persons # 座舱乘员数
self.num_cameras = num_cameras # 座舱摄像头数

# 每个摄像头一个外向编码器
self.exo_encoders = nn.ModuleList([
ExocentricPoseEncoder() for _ in range(num_cameras)
])

# 扩散融合
self.fusion = DiffusionFusionModel()

def estimate_pose(self, camera_frames: list, head_motion: torch.Tensor):
"""
从多个摄像头角度估计所有乘员姿态

Args:
camera_frames: 每个摄像头的图像
head_motion: 驾驶员头部运动(从 IMU/SLAM)
"""
# 编码每个摄像头视角
all_feats = []
for i, frame in enumerate(camera_frames):
feat, reliability = self.exo_encoders[i](frame)
all_feats.append((feat, reliability))

# 使用可靠性加权的特征融合
total_feat = sum(f * r for f, r in all_feats) / len(all_feats)

# 扩散去噪
noisy_pose = torch.randn(1, 51) # 17 joints × 3
for t in range(10, 0, -1): # 10步去噪
with torch.no_grad():
noise = self.fusion(
noisy_pose, torch.tensor([t]),
total_feat, total_feat, head_motion
)
noisy_pose = noisy_pose - noise * 0.1

return noisy_pose


# 测试
if __name__ == "__main__":
tracker = MultiPersonPoseTracker(num_persons=4, num_cameras=3)

# 模拟 3 个摄像头输入
frames = [torch.randn(1, 3, 224, 224) for _ in range(3)]
head_motion = torch.randn(1, 6)

pose = tracker.estimate_pose(frames, head_motion)

print(f"输出姿态: {pose.shape} (17 joints × 3D)")
print(f"参数量: {sum(p.numel() for p in tracker.parameters()):,}")

IMS 远期应用

座舱多摄像头 OOP 方案

摄像头位置 视角 可见乘员 可靠性
方向盘后方 正面 驾驶员 ⭐⭐⭐⭐⭐
车顶控制台 俯视 全部乘员 ⭐⭐⭐⭐
后排中央 后排 后排乘客 ⭐⭐⭐
B 柱左右 侧面 侧向乘员 ⭐⭐⭐

与论文的差异

论文设置 IMS 座舱 差异
每人佩戴摄像头 固定摄像头 无需穿戴
自我+外向视角 纯外向视角 无自我视角
多人交互 驾驶员+乘客 姿态相对固定
SLAM 追踪头部 DMS 追踪头部 已有技术

可借鉴的技术

  1. 可靠性估计:不同摄像头对不同乘员的可靠性不同
  2. 扩散模型融合:多视角噪声去除
  3. 运动先验:头运动 → 身体姿态预测

总结

论文的多人多视角 3D 姿态融合对 IMS 座舱的启示:

  1. 多摄像头融合优于单摄像头:不同角度互补
  2. 可靠性加权融合:不同角度对不同乘员可靠性不同
  3. 运动先验:头部运动信息可辅助身体姿态预测
  4. 扩散模型:适合多源噪声去除

远期参考价值:当 IMS 需要全座舱多乘员 OOP 检测时,可参考此方法的多视角融合+扩散去噪框架。


论文链接:https://arxiv.org/abs/2608.29927