行人分心检测融合Transformer: 从道路到座舱的分心检测迁移

论文信息

  • 标题: Detecting Phone-Induced Pedestrian Distraction via a Multimodal Fusion Transformer
  • arXiv: 2609.23507 (2026年9月20日)
  • 会议: ICEICT 2026 (IEEE 9th International Conference on Electronic Information and Communication Technology)
  • 作者: Yuanzhe Li 等
  • 数据集: 287行人 × 20,741图像
  • 准确率: 95% (+6% vs 6个基线)

核心创新

MFT (Multimodal Fusion Transformer) 融合人体姿态关键点和视觉外观特征,通过跨模态注意力机制捕获模态间依赖关系,实现行人手机使用分心检测。

从行人分心到驾驶员分心

维度 行人分心检测 驾驶员分心检测 迁移可行性
检测目标 行人手机使用 驾驶员手机使用 ✅ 直接迁移
输入模态 姿态关键点+图像 面部关键点+图像 ✅ 适配
场景 街道 座舱 ⚠️ 需适配
光照 室外多变化 车内可控+红外 ✅ 更好
遮挡 轻微 手/方向盘遮挡 ⚠️ 需处理
实时性 离线 ≤3秒 ⚠️ 需优化

方法详解

MFT架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
行人图像序列
│
├──→ 姿态估计器 ──→ 人体关键点序列 ──→ 姿态特征编码 ──┐
│ │
└──→ 视觉特征提取 ──→ 外观特征序列 ──┐ │
│ │
▼ ▼
┌─────────────────────────┐
│ 跨模态注意力模块 │
│ (Cross-Modal Attention) │
│ 多头交叉注意力 │
└────────────┬────────────┘
│
▼
┌─────────────────────────┐
│ 时序注意力融合模块 │
│ (Transformer Encoder) │
│ 捕获时序依赖 │
└────────────┬────────────┘
│
▼
分心分类输出

模型实现

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
"""
论文:Detecting Phone-Induced Pedestrian Distraction via MFT
arXiv: 2609.23507

核心方法:多模态融合Transformer
"""

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

class MultimodalFusionTransformer(nn.Module):
"""
MFT: 融合姿态关键点和视觉外观的分心检测Transformer

可迁移到驾驶员分心检测
"""

def __init__(self,
num_keypoints: int = 17, # COCO 17关键点
keypoint_dim: int = 2, # x,y
visual_dim: int = 512, # 视觉特征维度
hidden_dim: int = 256,
num_heads: int = 8,
num_layers: int = 4,
num_classes: int = 4): # 正常/通话/发短信/看视频
super().__init__()

# 姿态特征编码
self.pose_encoder = nn.Sequential(
nn.Linear(num_keypoints * keypoint_dim, hidden_dim),
nn.ReLU(),
nn.Linear(hidden_dim, hidden_dim)
)

# 视觉外观编码
self.visual_encoder = nn.Sequential(
nn.Linear(visual_dim, hidden_dim),
nn.ReLU(),
nn.Linear(hidden_dim, hidden_dim)
)

# 跨模态注意力 (关键创新)
self.cross_modal_attn = nn.MultiheadAttention(
embed_dim=hidden_dim,
num_heads=num_heads,
batch_first=True
)
self.norm1 = nn.LayerNorm(hidden_dim)

# 时序Transformer编码器
encoder_layer = nn.TransformerEncoderLayer(
d_model=hidden_dim,
nhead=num_heads,
dim_feedforward=hidden_dim * 4,
dropout=0.1,
batch_first=True
)
self.temporal_encoder = nn.TransformerEncoder(
encoder_layer, num_layers=num_layers
)

# 分类头
self.classifier = nn.Sequential(
nn.Linear(hidden_dim, hidden_dim // 2),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(hidden_dim // 2, num_classes)
)

def forward(self, pose_seq, visual_seq):
"""
Args:
pose_seq: (B, T, num_keypoints, keypoint_dim) 姿态序列
visual_seq: (B, T, visual_dim) 视觉特征序列

Returns:
logits: (B, num_classes) 分心分类
"""
B, T, K, D = pose_seq.shape

# 1. 姿态特征编码
pose_flat = pose_seq.reshape(B, T, K * D)
pose_features = self.pose_encoder(pose_flat) # (B, T, hidden_dim)

# 2. 视觉特征编码
visual_features = self.visual_encoder(visual_seq) # (B, T, hidden_dim)

# 3. 跨模态注意力 (关键创新)
# 姿态特征作为Query,视觉特征作为Key/Value
attn_out, _ = self.cross_modal_attn(
query=pose_features,
key=visual_features,
value=visual_features
)
fused = self.norm1(pose_features + attn_out) # 残差连接

# 4. 时序编码
temporal_out = self.temporal_encoder(fused) # (B, T, hidden_dim)

# 5. 取最后时刻分类
last_output = temporal_out[:, -1, :] # (B, hidden_dim)
logits = self.classifier(last_output)

return logits


# 驾驶员分心检测适配
class DriverDistractionMFT(nn.Module):
"""
将MFT从行人分心迁移到驾驶员分心检测

关键变更:
- 输入: 面部关键点 + 座舱图像特征 (替代行人关键点+街景)
- 输出: 驾驶员分心类型 (替代行人分心类型)
- 场景: 车内固定视角 (替代多视角)
"""

def __init__(self, num_classes=5):
super().__init__()
# 使用面部68/98关键点 (替代COCO 17关键点)
self.mft = MultimodalFusionTransformer(
num_keypoints=98, # 面部关键点
keypoint_dim=2, # x,y
visual_dim=256, # DMS摄像头特征
hidden_dim=256,
num_heads=8,
num_layers=4,
num_classes=num_classes
)

def forward(self, face_keypoints_seq, dms_visual_seq):
"""
Args:
face_keypoints_seq: (B, T, 98, 2) 面部关键点序列
dms_visual_seq: (B, T, 256) DMS摄像头视觉特征
"""
return self.mft(face_keypoints_seq, dms_visual_seq)


# 测试
if __name__ == "__main__":
# 模拟数据
B, T = 4, 10 # batch=4, 时序=10帧

# 行人分心检测
pose_seq = torch.randn(B, T, 17, 2) # COCO 17关键点
visual_seq = torch.randn(B, T, 512) # 视觉特征
mft = MultimodalFusionTransformer(num_classes=4)
logits = mft(pose_seq, visual_seq)

print("=== 行人分心检测MFT ===")
print(f"输入姿态: {pose_seq.shape}")
print(f"输入视觉: {visual_seq.shape}")
print(f"输出: {logits.shape}")

# 驾驶员分心检测
face_kp = torch.randn(B, T, 98, 2) # 98面部关键点
dms_vis = torch.randn(B, T, 256) # DMS特征
driver_mft = DriverDistractionMFT(num_classes=5)
d_logits = driver_mft(face_kp, dms_vis)

print("\n=== 驾驶员分心检测迁移 ===")
print(f"输入面部关键点: {face_kp.shape}")
print(f"输入DMS特征: {dms_vis.shape}")
print(f"输出: {d_logits.shape}")

# 分心类型
distraction_types = ["正常驾驶", "手机通话", "手机打字", "看屏幕", "注意力分散"]
print(f"\n分类类型: {distraction_types}")

# 论文结果
print("\n=== 论文实验结果 ===")
print(f"整体准确率: 95%")
print(f"超越6个基线: +6%")
print(f"数据集: 287行人, 20,741图像")
print(f"跨模态注意力: 关键贡献模块")

从行人到驾驶员的迁移要点

1. 姿态关键点转换

行人 驾驶员 差异
COCO 17关键点 (全身) 98面部关键点 聚焦面部更精确
步态模式 头部转动模式 不同运动模式
手臂位置 手部位置(方向盘区域) 手部遮挡更多
行走方向 视线方向 需要眼动估计

2. 分心类型映射

行人分心 驾驶员分心 Euro NCAP场景
正常行走 正常驾驶 —
通话 手机通话 D-02
发短信 手机打字 D-03
看视频 看屏幕 D-04/D-05
— 视线偏离 D-01

3. 性能预期

指标 行人(论文) 驾驶员(预期)
准确率 95% 92-96%
延迟 离线 ≤2s
帧率 10fps 25-30fps
模型大小 未报告 <50MB

参考


发布时间: 2026-09-25 02:00
分类: 分心检测 | 多模态融合 | Transformer | 关键点 | 论文解读