发布日期: 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 检测:适用于遮挡场景 """ 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 结果 """ if rgb_result['valid'] and ir_result['valid']: return self.weighted_merge(rgb_result, ir_result) elif not rgb_result['valid'] and ir_result['valid']: return ir_result elif rgb_result['valid'] and not ir_result['valid']: return rgb_result else: return {'confidence': 0.0, 'valid': False} def weighted_merge(self, rgb, ir): """ 加权合并 """ if self.detect_sunglasses_from_results(rgb, 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 测试 |
官方认证测试 |
参考资料
- Anyverse: Euro NCAP In-Cabin Monitoring Tests
- Smart Eye: Driver Monitoring 2.0 Euro NCAP 2026
- Tobii: DMS Signal Latency and Robustness
开发启示: Euro NCAP 2026 要求 DMS 在墨镜/口罩/面部毛发遮挡下仍然可靠工作。核心解决方案:1) 940nm IR 穿透墨镜;2) RGB+IR 融合;3) 上半脸检测处理口罩;4) 鲁棒特征点检测。建议采用 RGB+IR 双传感器融合方案,并使用 Anyverse 合成数据进行大规模遮挡场景验证。