DMS 眼动追踪遮挡鲁棒性:墨镜/口罩/面部遮挡解决方案

发布日期: 2026-04-13
标签: DMS, 眼动追踪, 遮挡鲁棒性, Euro NCAP, 红外, 墨镜, 口罩
来源: Anyverse、Smart Eye、Euro NCAP 协议


问题背景

现实世界中驾驶员可能佩戴各种遮挡物:

  • 墨镜(日光、处方墨镜)
  • 口罩(疫情、医疗)
  • 帽子
  • 面部毛发(胡须、络腮胡)
  • 手遮挡面部

Euro NCAP 2026 要求 DMS 在这些条件下仍然可靠工作。


Euro NCAP 遮挡测试要求

眼镜要求

类型 透光率 Euro NCAP 要求
普通眼镜 >90% ✅ 必须检测
墨镜 >70% ✅ 必须检测
厚边框眼镜 - ✅ 必须检测
处方墨镜 >70% ✅ 必须检测

光照条件

条件 照度 要求
日间 高照度 正常工作
夜间 1 lux 正常工作
阴影/逆光 变化光照 正常工作

遮挡物

遮挡物 Euro NCAP 要求
墨镜 ✅ 必须检测
口罩 ✅ 必须检测
帽子 ✅ 必须检测
面部毛发 ✅ 必须检测

红外技术优势

可见光 vs 近红外

特性 可见光 近红外 (NIR)
墨镜穿透 ❌ 被阻挡 ✅ 可穿透
夜间工作 ❌ 需要补光 ✅ 主动照明
阴影鲁棒 ❌ 受影响 ✅ 主动照明
隐私友好 ❌ 记录面部 ✅ 仅眼动特征

940nm IR 优势

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌────────────────────────────────────────────────────────┐
│ 940nm 红外穿透墨镜原理 │
├────────────────────────────────────────────────────────┤
│ │
│ 墨镜光学特性: │
│ ├─ 可见光 (400-700nm):被吸收/反射 │
│ └─ 红外光 (850-940nm):部分透过 │
│ │
│ 940nm LED → 墨镜 → 眼睛 → 墨镜 → 摄像头 │
│ ↑ ↑ │
│ 穿透 穿透 │
│ │
│ 墨镜透光率曲线: │
│ ├─ 可见光:<10% │
│ └─ 940nm IR:>50% │
│ │
└────────────────────────────────────────────────────────┘

多传感器融合方案

RGB + IR 融合

传感器 优势 用途
RGB 相机 色彩、纹理、物体识别 日间场景、物体检测
IR 相机 穿透墨镜、夜间工作 眼动追踪、瞳孔检测

融合策略

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
class MultiSensorFusion:
"""
多传感器融合眼动追踪
"""

def __init__(self):
self.rgb_camera = RGBCamera()
self.ir_camera = IRCamera()
self.fusion_policy = FusionPolicy()

def detect_eye_state(self):
"""
检测眼部状态
"""
# 获取两个传感器的数据
rgb_frame = self.rgb_camera.capture()
ir_frame = self.ir_camera.capture()

# 分别检测
rgb_result = self.detect_from_rgb(rgb_frame)
ir_result = self.detect_from_ir(ir_frame)

# 融合决策
return self.fusion_policy.merge(rgb_result, ir_result)

def detect_from_rgb(self, frame):
"""
RGB 检测:适用于无遮挡场景
"""
if self.has_occlusion(frame):
return {'confidence': 0.0, 'source': 'rgb', 'valid': False}

# 正常检测
eye_state = self.rgb_eye_detector(frame)
return {
'gaze': eye_state.gaze,
'eye_openness': eye_state.openness,
'confidence': 0.9,
'source': 'rgb',
'valid': True
}

def detect_from_ir(self, frame):
"""
IR 检测:适用于遮挡场景
"""
# IR 可穿透墨镜
eye_state = self.ir_eye_detector(frame)

# 检测墨镜遮挡
is_sunglasses = self.detect_sunglasses(frame)

return {
'gaze': eye_state.gaze,
'eye_openness': eye_state.openness,
'confidence': 0.85 if is_sunglasses else 0.95,
'source': 'ir',
'valid': True
}

融合策略

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
class FusionPolicy:
"""
融合策略
"""

def merge(self, rgb_result, ir_result):
"""
合并 RGB 和 IR 结果
"""
# 情况 1:RGB 有效,IR 有效
if rgb_result['valid'] and ir_result['valid']:
# 根据置信度加权
return self.weighted_merge(rgb_result, ir_result)

# 情况 2:RGB 无效,IR 有效
elif not rgb_result['valid'] and ir_result['valid']:
return ir_result

# 情况 3:RGB 有效,IR 无效
elif rgb_result['valid'] and not ir_result['valid']:
return rgb_result

# 情况 4:都无效
else:
return {'confidence': 0.0, 'valid': False}

def weighted_merge(self, rgb, ir):
"""
加权合并
"""
# IR 在墨镜场景下更可靠
if self.detect_sunglasses_from_results(rgb, ir):
# IR 权重更高
w_rgb, w_ir = 0.3, 0.7
else:
# 正常权重
w_rgb, w_ir = 0.5, 0.5

gaze = w_rgb * rgb['gaze'] + w_ir * ir['gaze']
confidence = w_rgb * rgb['confidence'] + w_ir * ir['confidence']

return {
'gaze': gaze,
'confidence': confidence,
'valid': True
}

口罩场景处理

挑战

问题 说明
面部遮挡 口罩遮挡下半脸
特征丢失 鼻部、嘴部特征不可见
呼吸检测 可能干扰眼动追踪

解决方案

方法 说明
上半脸检测 仅使用眼部特征
头部姿态估计 基于可见特征推断
多帧融合 时序信息补偿

算法实现

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 MaskAwareDetector:
"""
口罩感知检测器
"""

def __init__(self):
self.upper_face_detector = UpperFaceDetector()
self.head_pose_estimator = HeadPoseEstimator()

def detect_with_mask(self, frame):
"""
口罩场景检测
"""
# 检测口罩
mask_detected = self.detect_mask(frame)

if mask_detected:
# 仅使用上半脸特征
eye_features = self.upper_face_detector.detect_eyes(frame)

# 从眼部推断头部姿态
head_pose = self.head_pose_estimator.from_eyes(eye_features)

# 视线估计
gaze = self.estimate_gaze_from_upper_face(eye_features, head_pose)

return {
'gaze': gaze,
'head_pose': head_pose,
'mask': True,
'confidence': 0.75 # 略低于无遮挡
}
else:
# 正常全脸检测
return self.full_face_detect(frame)

面部毛发处理

挑战

问题 说明
胡须遮挡 络腮胡遮挡下巴轮廓
特征点丢失 下巴、嘴部特征点不可见
个人差异 不同人的胡须密度不同

解决方案

方法 说明
鲁棒特征点检测 不依赖单一特征点
多模态融合 结合眼动和头部姿态
自适应阈值 根据遮挡程度调整

遮挡鲁棒性测试场景

Anyverse 合成数据场景

场景类型 参数变化
墨镜 不同颜色、透光率、边框厚度
口罩 医用口罩、布口罩、N95
帽子 棒球帽、鸭舌帽、毛线帽
胡须 无胡须、小胡子、络腮胡
组合 墨镜+口罩、帽子+墨镜

测试矩阵

场景 光照 遮挡 预期检测率
日间无遮挡 >99%
日间墨镜 墨镜 >95%
日间口罩 口罩 >95%
日间墨镜+口罩 墨镜+口罩 >90%
夜间无遮挡 1 lux >95%
夜间墨镜 1 lux 墨镜 >85%

开发启示

传感器选择

方案 成本 鲁棒性 推荐场景
仅 RGB ❌ 不推荐
仅 IR ⚠️ 可用
RGB + IR ✅ 推荐

算法开发重点

优先级 任务 说明
P0 IR 眼动追踪 核心功能,穿透墨镜
P1 上半脸检测 口罩场景
P2 多传感器融合 提高鲁棒性
P3 自适应阈值 个性化调整

验证方法

方法 说明
合成数据测试 Anyverse 生成遮挡场景
实车测试 真实遮挡物测试
Euro NCAP 测试 官方认证测试

参考资料

  1. Anyverse: Euro NCAP In-Cabin Monitoring Tests
  2. Smart Eye: Driver Monitoring 2.0 Euro NCAP 2026
  3. Tobii: DMS Signal Latency and Robustness

开发启示: Euro NCAP 2026 要求 DMS 在墨镜/口罩/面部毛发遮挡下仍然可靠工作。核心解决方案:1) 940nm IR 穿透墨镜;2) RGB+IR 融合;3) 上半脸检测处理口罩;4) 鲁棒特征点检测。建议采用 RGB+IR 双传感器融合方案,并使用 Anyverse 合成数据进行大规模遮挡场景验证。