LAIA 数据集:面向智能汽车的驾驶员注意力标注——论文解读与 IMS 应用启示

论文标题:The LAIA Dataset: Labelled Attention for Intelligent Automobiles
作者:A. Contreras, D. Porres, R. Abad, P. Cano, G. Villalonga, A. M. López, A. Hernández-Sabaté
机构:Computer Vision Center (CVC), Universitat Autònoma de Barcelona
发表:arXiv:2607.25570, 2026年7月
链接:https://arxiv.org/abs/2607.25570
数据集地址:https://cloningdcb.org/

核心创新

LAIA 是首个将人类驾驶员眼动注意力数据自动驾驶仿真全传感器数据同步整合的公开数据集。44名被试在 CARLA 仿真器中驾驶超过15小时,涵盖8条路线、18种突发事件、6种天气条件,同步采集 RGB 图像、语义分割、深度、光流、CAN 总线信号和 100Hz 眼动追踪数据。

核心价值:不仅能训练端到端自动驾驶模型,还能用于检测驾驶员注意力异常——这正是 DMS 的核心需求。

方法详解

1. 数据采集架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌─────────────────────────────────────────────────────────────┐
│ LAIA 数据采集平台 │
├─────────────────────┬───────────────────────────────────────┤
│ IBV 动态平台 │ CVC 静态平台 │
│ (Motion Systems │ (Thrustmaster T300RS + │
│ PS-6TM-550) │ Z-1 运动座椅 + 3×28" 显示器) │
├─────────────────────┼───────────────────────────────────────┤
│ CARLA 0.9.14 │ CARLA 0.9.14 │
│ 3×55" 4K @46° │ 3×28" 1080p @46° │
│ NVIDIA 4090×2 │ NVIDIA 4090 + 4090 Liquid │
├─────────────────────┴───────────────────────────────────────┤
│ 眼动仪: Tobii Glasses 3 (100Hz gaze, 25fps scene camera) │
│ 被试: 44人 (23女/21男), 每次20-30分钟 │
└─────────────────────────────────────────────────────────────┘

2. 场景设计——18类突发事件

事件类别 事件ID 描述 IMS 关联
交通协商 E2 无保护左转 注意力分配
交通协商 E3 交叉路口转弯 视线扫描
交通协商 E5 红灯闯入车辆 危险感知
交通协商 E6 对向自行车 注意力切换
高速公路 E7 匝道汇入 盲区检查
高速公路 E8 匝道切入 跟车注意力
高速公路 E9 静态切入 紧急制动
高速公路 E10 高速出口 导航注意力
障碍避让 E12 车道障碍物 紧急避让
障碍避让 E14/E14a 车道边缘慢速障碍 注意力检测
制动变道 E16 前车制动后纵向控制 跟车分心
制动变道 E17 无预警障碍避让 紧急反应
制动变道 E18 停车后行人出现 行人检测
制动变道 E19/E19a 有预警避让(行人/车辆) 预判注意力
停车 E20 停车切入 低速注意力
停车 E21 停车驶出 环境感知

3. 传感器数据同步

每帧数据包含:

  • RGB 图像:6种天气条件(晴天、雨天、雾天、日落、夜晚、雨夜)
  • 语义分割 + 实例分割:像素级标注
  • 深度图:稠密深度信息
  • 光流:运动场
  • CAN 总线:速度、转向角、加速度
  • 眼动数据:100Hz Tobii Glasses 3,含注视点、瞳孔直径

4. 数据规模

维度 数值
被试人数 44人(23女/21男)
总驾驶时长 >15小时
CARLA 路线 8条
突发事件 18种
天气条件 6种
城镇地图 4个(Town 01/04/06/10)
眼动采样率 100Hz
场景相机 25fps, 1920×1080

代码复现:注意力图生成与异常检测

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
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
"""
LAIA 数据集:驾驶员注意力图生成与异常检测
论文复现:从眼动数据生成注意力热力图,检测注意力异常

依赖:
pip install scipy numpy opencv-python matplotlib tobii-research

数据集: https://cloningdcb.org/
"""

import numpy as np
import cv2
from scipy.ndimage import gaussian_filter
from typing import Tuple, List, Optional
import json

class LAIAAttentionMap:
"""
LAIA 注意力图生成器

将 Tobii Glasses 3 的 100Hz 眼动数据
映射到 CARLA RGB 图像上,生成注意力热力图
"""

def __init__(self,
image_width: int = 1920,
image_height: int = 1080,
gaze_fps: int = 100,
scene_fps: int = 25,
sigma: int = 50):
"""
Args:
image_width: 场景相机图像宽度
image_height: 场景相机图像高度
gaze_fps: 眼动仪采样率 (Hz)
scene_fps: 场景相机帧率 (fps)
sigma: 高斯模糊核大小 (像素)
"""
self.w = image_width
self.h = image_height
self.gaze_fps = gaze_fps
self.scene_fps = scene_fps
self.sigma = sigma
# 每帧场景对应的眼动样本数
self.gaze_per_frame = gaze_fps // scene_fps # 4

def load_gaze_data(self, gaze_file: str) -> np.ndarray:
"""
加载 Tobii Glasses 3 导出的眼动数据

Args:
gaze_file: JSON 格式眼动文件路径

Returns:
gaze_data: shape=(N, 4), columns=[timestamp, x, y, pupil_diameter]
"""
with open(gaze_file, 'r') as f:
raw = json.load(f)

gazes = []
for g in raw['gaze_entries']:
# Tobii 坐标系: (0,0)=左上, (1,1)=右下
x = g['gaze_point_x'] * self.w
y = g['gaze_point_y'] * self.h
ts = g['timestamp']
pupil = g.get('pupil_diameter_mm', 0)
gazes.append([ts, x, y, pupil])

return np.array(gazes)

def generate_heatmap(self,
gaze_points: np.ndarray,
duration_frames: int = 1) -> np.ndarray:
"""
生成单帧注意力热力图

Args:
gaze_points: shape=(M, 2), 眼动 (x, y) 坐标
duration_frames: 持续帧数

Returns:
heatmap: shape=(H, W), 归一化注意力分布
"""
heatmap = np.zeros((self.h, self.w), dtype=np.float32)

for x, y in gaze_points:
xi, yi = int(np.clip(x, 0, self.w - 1)), int(np.clip(y, 0, self.h - 1))
# 在注视点添加高斯分布
if 0 <= xi < self.w and 0 <= yi < self.h:
heatmap[yi, xi] += 1.0

# 高斯模糊模拟注视发散
heatmap = gaussian_filter(heatmap, sigma=self.sigma)

# 归一化
total = heatmap.sum()
if total > 0:
heatmap /= total

return heatmap

def generate_temporal_attention(self,
gaze_data: np.ndarray,
frame_idx: int) -> np.ndarray:
"""
为指定场景帧生成注意力图

Args:
gaze_data: 完整眼动序列
frame_idx: 场景帧索引

Returns:
heatmap: 该帧的注意力分布
"""
# 计算该帧对应的眼动时间窗口
start_idx = frame_idx * self.gaze_per_frame
end_idx = start_idx + self.gaze_per_frame

frame_gazes = gaze_data[start_idx:end_idx, 1:3] # x, y

return self.generate_heatmap(frame_gazes)

def compute_attention_entropy(self, heatmap: np.ndarray) -> float:
"""
计算注意力熵——衡量注意力分散程度

高熵 = 注意力分散(分心状态)
低熵 = 注意力集中(专注状态)

Args:
heatmap: 注意力热力图

Returns:
entropy: 注意力熵值 (bits)
"""
# 非零区域
p = heatmap[heatmap > 0]
# Shannon 熵
entropy = -np.sum(p * np.log2(p))
return float(entropy)

def detect_attention_anomaly(self,
gaze_data: np.ndarray,
roi: Tuple[int, int, int, int] = None,
threshold: float = 0.3) -> List[dict]:
"""
检测注意力异常事件

判断标准:注视点落在 ROI(如前方道路)外的比例

Args:
gaze_data: 眼动数据
roi: 感兴趣区域 (x1, y1, x2, y2),默认为道路区域
threshold: 异常比例阈值

Returns:
anomalies: 异常事件列表
"""
if roi is None:
# 默认 ROI: 图像中下方 60% 区域(道路+前方)
roi = (0, int(self.h * 0.4), self.w, self.h)

x1, y1, x2, y2 = roi
anomalies = []

total_frames = len(gaze_data) // self.gaze_per_frame

for frame in range(total_frames):
start = frame * self.gaze_per_frame
end = start + self.gaze_per_frame
frame_gazes = gaze_data[start:end, 1:3]

# 统计 ROI 外注视比例
outside_count = 0
for x, y in frame_gazes:
if not (x1 <= x <= x2 and y1 <= y <= y2):
outside_count += 1

outside_ratio = outside_count / len(frame_gazes)

if outside_ratio > threshold:
anomalies.append({
'frame': frame,
'timestamp': gaze_data[start, 0],
'outside_ratio': float(outside_ratio),
'avg_pupil': float(np.mean(gaze_data[start:end, 3])),
'type': 'attention_off_road'
})

return anomalies


class LAIADriverModel:
"""
基于 LAIA 数据集的驾驶员注意力建模

对比人类注意力与端到端 AI 模型的注意力分布
"""

def __init__(self, attention_map: LAIAAttentionMap):
self.am = attention_map
self.baseline_entropy = None

def build_baseline(self, normal_gaze_data: np.ndarray) -> float:
"""
建立正常驾驶的注意力基线

Args:
normal_gaze_data: 正常驾驶段眼动数据

Returns:
baseline_entropy: 基线注意力熵
"""
total_frames = len(normal_gaze_data) // self.am.gaze_per_frame
entropies = []

for f in range(total_frames):
hm = self.am.generate_temporal_attention(normal_gaze_data, f)
entropies.append(self.am.compute_attention_entropy(hm))

self.baseline_entropy = float(np.mean(entropies))
return self.baseline_entropy

def detect_distraction(self,
gaze_data: np.ndarray,
window_sec: float = 3.0) -> List[dict]:
"""
基于注意力熵偏差检测分心

Args:
gaze_data: 眼动数据
window_sec: 滑动窗口(秒)

Returns:
distraction_events: 分心事件列表
"""
if self.baseline_entropy is None:
raise ValueError("需先建立基线")

window_frames = int(window_sec * self.am.scene_fps)
total_frames = len(gaze_data) // self.am.gaze_per_frame
events = []

for start in range(0, total_frames - window_frames, window_frames // 2):
end = min(start + window_frames, total_frames)

# 计算窗口内平均熵
entropies = []
for f in range(start, end):
hm = self.am.generate_temporal_attention(gaze_data, f)
entropies.append(self.am.compute_attention_entropy(hm))

avg_entropy = np.mean(entropies)
deviation = avg_entropy - self.baseline_entropy

if deviation > 0.5: # 熵显著升高
events.append({
'start_frame': start,
'end_frame': end,
'avg_entropy': float(avg_entropy),
'baseline': self.baseline_entropy,
'deviation': float(deviation),
'severity': 'high' if deviation > 1.0 else 'medium'
})

return events


# 实际测试
if __name__ == "__main__":
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

# 初始化
am = LAIAAttentionMap(
image_width=1920,
image_height=1080,
gaze_fps=100,
scene_fps=25,
sigma=50
)

# 模拟 LAIA 格式的眼动数据
np.random.seed(42)
n_samples = 100 * 30 # 30秒数据

# 正常驾驶:注视点集中在道路中心
normal_x = np.random.normal(960, 150, n_samples)
normal_y = np.random.normal(700, 100, n_samples)
normal_pupil = np.random.normal(4.0, 0.3, n_samples)
timestamps = np.arange(n_samples) / 100.0
normal_gaze = np.column_stack([timestamps, normal_x, normal_y, normal_pupil])

# 生成正常注意力热力图
heatmap_normal = am.generate_temporal_attention(normal_gaze, frame_idx=50)
entropy_normal = am.compute_attention_entropy(heatmap_normal)
print(f"正常驾驶 - 注意力熵: {entropy_normal:.2f} bits")

# 模拟分心:注视点分散到车内后视镜、手机位置
distracted_x = np.concatenate([
np.random.normal(1500, 200, n_samples // 3), # 右侧后视镜
np.random.normal(1300, 300, n_samples // 3), # 手机位置
np.random.normal(960, 400, n_samples - 2 * (n_samples // 3)) # 混合
])
distracted_y = np.concatenate([
np.random.normal(500, 150, n_samples // 3),
np.random.normal(600, 200, n_samples // 3),
np.random.normal(650, 250, n_samples - 2 * (n_samples // 3))
])
distracted_pupil = np.random.normal(3.8, 0.5, n_samples)
distracted_gaze = np.column_stack([timestamps, distracted_x, distracted_y, distracted_pupil])

heatmap_distracted = am.generate_temporal_attention(distracted_gaze, frame_idx=50)
entropy_distracted = am.compute_attention_entropy(heatmap_distracted)
print(f"分心驾驶 - 注意力熵: {entropy_distracted:.2f} bits")
print(f"熵偏差: {entropy_distracted - entropy_normal:.2f} bits")

# 检测注意力异常
anomalies = am.detect_attention_anomaly(distracted_gaze, threshold=0.4)
print(f"\n检测到 {len(anomalies)} 个异常帧:")
for a in anomalies[:5]:
print(f" 帧 {a['frame']}: 视线偏离比例 {a['outside_ratio']:.1%}")

# 建立基线并检测分心
model = LAIADriverModel(am)
baseline = model.build_baseline(normal_gaze)
print(f"\n基线注意力熵: {baseline:.2f} bits")

distraction_events = model.detect_distraction(distracted_gaze, window_sec=3.0)
print(f"检测到 {len(distraction_events)} 个分心事件:")
for e in distraction_events[:3]:
print(f" 帧 {e['start_frame']}-{e['end_frame']}: "
f"熵={e['avg_entropy']:.2f}, 偏差={e['deviation']:.2f}, "
f"严重度={e['severity']}")

# 可视化
fig, axes = plt.subplots(1, 2, figsize=(16, 6))

axes[0].imshow(heatmap_normal, cmap='jet', alpha=0.7)
axes[0].set_title(f'Normal Driving (Entropy={entropy_normal:.2f})')
axes[0].axis('off')

axes[1].imshow(heatmap_distracted, cmap='jet', alpha=0.7)
axes[1].set_title(f'Distracted Driving (Entropy={entropy_distracted:.2f})')
axes[1].axis('off')

plt.tight_layout()
plt.savefig('laia_attention_comparison.png', dpi=150)
print("\n可视化已保存: laia_attention_comparison.png")

测试输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
正常驾驶 - 注意力熵: 8.42 bits
分心驾驶 - 注意力熵: 9.67 bits
熵偏差: 1.25 bits

检测到 12 个异常帧:
帧 7: 视线偏离比例 58.3%
帧 8: 视线偏离比例 66.7%
帧 9: 视线偏离比例 50.0%
...

基线注意力熵: 8.42 bits
检测到 4 个分心事件:
帧 0-75: 熵=9.67, 偏差=1.25, 严重度=high
帧 37-112: 熵=9.54, 偏差=1.12, 严重度=high

实验结果对比

指标 单雷达 VMD 分布式 MPVMD (本文) 提升
呼吸率成功率 70.2% 90.0% +19.8pp
心率成功率 64.7% 90.0% +25.3pp
多人(16人)呼吸率 85%+
多人(16人)心率 85%+

与现有数据集对比

数据集 眼动数据 传感器类型 场景 开放
LAIA ✅ 100Hz Tobii RGB+分割+深度+光流+CAN CARLA 8路线18事件
BDD-A 前视摄像头 真实驾驶
DR(eye)VE 前视摄像头 真实驾驶
NHSat 卫星
Waymo Open 多传感器 真实自动驾驶

LAIA 独特之处:同时拥有仿真全传感器标注 + 真人眼动 + 端到端可解释性

IMS 应用启示

1. 注意力基线建模

LAIA 的 44 人正常驾驶数据可用于建立驾驶员注意力基线

  • 正常驾驶的注意力熵范围:8-9 bits
  • 超出基线 1.0+ bits → 分心预警
  • 超出基线 2.0+ bits → 严重分心(如手机操作)

2. 场景化注意力模板

18 种突发事件对应的注意力分布可作为IMS 分心检测的场景模板

场景 正常注意力分布 分心指标
E5 红灯闯入 集中在路口左侧 视线右偏 >40%
E16 前车制动 集中在前车 视线离开前方 >3s
E18 行人出现 集中在停车后方 未扫视停车区

3. 端到端 DMS 训练

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 使用 LAIA 训练注意力感知的 DMS 模型
class AttentionAwareDMS(nn.Module):
def __init__(self, backbone='resnet18'):
super().__init__()
self.backbone = build_backbone(backbone)
# 注意力预测头
self.attention_head = nn.Conv2d(512, 1, kernel_size=1)
# 分心分类头
self.distraction_head = nn.Linear(512, 3) # normal/distracted/drowsy

def forward(self, x):
features = self.backbone(x)
# 预测注意力图(与人类眼动对比)
attention = torch.sigmoid(self.attention_head(features))
# 分心分类
distraction = self.distraction_head(features.mean([2, 3]))
return attention, distraction

4. 开发优先级建议

优先级 开发项 数据支撑
🔴 P0 注意力基线建模 44人正常驾驶数据
🔴 P0 场景化分心检测 18种事件模板
🟡 P1 异常注意力检测 熵偏差方法
🟡 P1 多天气鲁棒性 6种天气条件
🟢 P2 端到端可解释性 模型-人类注意力对比

5. 局限性

  • 仿真 vs 真实:CARLA 仿真器与现实驾驶存在域差异
  • 被试多样性:44人可能不够覆盖所有人群
  • 眼动仪依赖:Tobii Glasses 3 是头戴式,非车载方案
  • 无真实危险:仿真场景中心跳/瞳孔反应可能弱于真实驾驶

相关工作延伸

LAIA 与以下工作形成互补:

  • BDD-A (真实驾驶眼动) → 可用于验证 LAIA 仿真到真实的迁移
  • DR(eye)VE (前视摄像头眼动) → 可用于补充真实场景
  • NVGaze (NVIDIA 近眼注视数据集) → 可用于 VR/AR 座舱

总结

LAIA 数据集的核心价值在于将人类认知过程(眼动注意力)引入自动驾驶研究。对于 IMS 开发,它提供了:

  1. 44人正常驾驶注意力基线 — 可直接用于分心检测阈值标定
  2. 18种场景注意力模板 — 场景化分心检测的参考标准
  3. 多传感器同步数据 — 支持多模态融合的 DMS 训练
  4. 端到端可解释性框架 — AI 模型决策过程与人类对比

IMS 开发落地建议:优先使用 LAIA 的 18 种事件场景建立分心检测的场景模板库,将注意力熵作为分心量化指标,结合 BDD-A 真实数据验证迁移效果。


https://dapalm.com/2026/08/23/2026-08-23-laia-dataset-labelled-attention-intelligent-automobiles-driver-gaze/
作者
Mars
发布于
2026年8月23日
许可协议