InCarEmo:车内多模态情感识别数据集(arXiv 2026 论文解读与 IMS 落地)

发布时间: 2026-09-06
分类: 论文解读 / 情感识别 / 多模态
标签: InCarEmo, multimodal, emotion recognition, dataset, fatigue, distraction, RGB, IR, audio, dialogue


论文信息

项目 内容
标题 InCarEmo: A Multimodal Dataset for In-Cabin Emotion Recognition and Driver State Monitoring
arXiv 2607.14683
作者 Yang H., Zhao Y., Zhao K., et al.
发布日期 2026-07-16
领域 cs.AI
模态 RGB视频 + 红外视频 + 车内音频 + 对话文本
任务 情感识别 + 疲劳检测 + 分心监控
语言 中文(主)+ 英文(辅助基准)

1. 核心创新

1.1 填补空白

现有数据集 模态 局限
DR(eye)VE 视频+眼动 无音频/对话
BDD-A 视频 无音频
DADA-2000 视频+注视 事故场景,无对话
HIVE RGB+IR 无音频/对话
InCarEmo RGB+IR+音频+对话 首个四模态车内数据集

1.2 三大任务

1.3 数据集特点

特点 详情
多模态 RGB视频 + 红外视频 + 音频 + 对话文本
多光照 白天/夜间/隧道/阴影
多场景 城市道路/高速/停车场
对话场景 脚本化车内对话模拟
双语 中文(主)+ 英文(辅助基准)
噪声模拟 真实噪声+模态缺失测试

2. 数据集详解

2.1 模态规格

模态 采集设备 格式 用途
RGB视频 车内摄像头 1920×1080, 30fps 面部表情+姿态
红外视频 IR摄像头 同步 暗光场景
车内音频 麦克风阵列 16kHz, WAV 语音情感+声学
对话文本 ASR转写 文本 语义+情感

2.2 情感标注

情绪 定义 驾驶相关性
愤怒 攻击性驾驶行为 路怒症,事故风险↑300%
悲伤 低活力状态 反应力下降,注意力窄化
激动 高唤醒负面状态 判断力受损,冲动决策
喜悦 积极唤醒状态 可能过度放松(!)

2.3 基线实验设计

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
import torch
import torch.nn as nn
from typing import Dict, Optional

class InCarEmoBaseline(nn.Module):
"""
InCarEmo 多模态基线模型

支持:
- 单模态: RGB / IR / Audio / Text
- 多模态融合: 任意组合
- 模态缺失测试
- 噪声鲁棒性测试
"""

def __init__(
self,
modalities: list = ['rgb', 'ir', 'audio', 'text'],
hidden_dim: int = 256,
num_emotions: int = 4,
num_fatigue: int = 3,
num_distraction: int = 3
):
super().__init__()
self.modalities = modalities

# 各模态编码器
self.encoders = nn.ModuleDict()
if 'rgb' in modalities:
self.encoders['rgb'] = VideoEncoder(input_channels=3, hidden_dim=hidden_dim)
if 'ir' in modalities:
self.encoders['ir'] = VideoEncoder(input_channels=1, hidden_dim=hidden_dim)
if 'audio' in modalities:
self.encoders['audio'] = AudioEncoder(hidden_dim=hidden_dim)
if 'text' in modalities:
self.encoders['text'] = TextEncoder(hidden_dim=hidden_dim)

# 跨模态注意力
self.cross_attn = CrossModalAttention(
hidden_dim=hidden_dim,
num_heads=4
)

# 多任务头
self.emotion_head = nn.Linear(hidden_dim, num_emotions)
self.fatigue_head = nn.Linear(hidden_dim, num_fatigue)
self.distraction_head = nn.Linear(hidden_dim, num_distraction)

def forward(
self,
rgb: Optional[torch.Tensor] = None,
ir: Optional[torch.Tensor] = None,
audio: Optional[torch.Tensor] = None,
text: Optional[torch.Tensor] = None
) -> Dict[str, torch.Tensor]:
"""前向传播,支持模态缺失"""
inputs = {'rgb': rgb, 'ir': ir, 'audio': audio, 'text': text}

# 编码可用模态
embeddings = []
for mod in self.modalities:
if inputs[mod] is not None:
emb = self.encoders[mod](inputs[mod])
embeddings.append(emb)

if not embeddings:
raise ValueError("至少需要一个模态输入")

# 跨模态融合
fused = self.cross_attn(embeddings)

# 多任务输出
return {
'emotion': self.emotion_head(fused),
'fatigue': self.fatigue_head(fused),
'distraction': self.distraction_head(fused)
}


class VideoEncoder(nn.Module):
def __init__(self, input_channels, hidden_dim):
super().__init__()
self.conv = nn.Sequential(
nn.Conv2d(input_channels, 32, 3, stride=2, padding=1),
nn.ReLU(),
nn.Conv2d(32, 64, 3, stride=2, padding=1),
nn.ReLU(),
nn.AdaptiveAvgPool2d(1),
nn.Flatten(),
nn.Linear(64, hidden_dim)
)
def forward(self, x):
return self.conv(x)


class AudioEncoder(nn.Module):
def __init__(self, hidden_dim):
super().__init__()
self.encoder = nn.Sequential(
nn.Linear(128, hidden_dim), # 梅尔频谱输入
nn.ReLU(),
nn.Linear(hidden_dim, hidden_dim)
)
def forward(self, x):
return self.encoder(x)


class TextEncoder(nn.Module):
def __init__(self, hidden_dim):
super().__init__()
self.encoder = nn.Sequential(
nn.Linear(768, hidden_dim), # BERT嵌入输入
nn.ReLU(),
nn.Linear(hidden_dim, hidden_dim)
)
def forward(self, x):
return self.encoder(x)


class CrossModalAttention(nn.Module):
def __init__(self, hidden_dim, num_heads):
super().__init__()
self.attn = nn.MultiheadAttention(hidden_dim, num_heads, batch_first=True)
self.norm = nn.LayerNorm(hidden_dim)

def forward(self, embeddings: list) -> torch.Tensor:
# 将各模态嵌入堆叠为序列
seq = torch.stack(embeddings, dim=1) # (B, M, D)
attended, _ = self.attn(seq, seq, seq)
pooled = self.norm(attended.mean(dim=1))
return pooled


# ============ 模态缺失测试 ============

def test_modality_missing():
"""测试模态缺失场景下的性能"""
model = InCarEmoBaseline(modalities=['rgb', 'ir', 'audio', 'text'])

# 完整模态
full_input = {
'rgb': torch.randn(4, 3, 224, 224),
'ir': torch.randn(4, 1, 224, 224),
'audio': torch.randn(4, 128),
'text': torch.randn(4, 768)
}

# 缺失音频
no_audio = {**full_input, 'audio': None}

# 只有RGB
rgb_only = {'rgb': full_input['rgb'], 'ir': None, 'audio': None, 'text': None}

# 夜间(无RGB,有IR)
night = {'rgb': None, 'ir': full_input['ir'], 'audio': full_input['audio'], 'text': None}

results = {}
for name, data in [('full', full_input), ('no_audio', no_audio),
('rgb_only', rgb_only), ('night', night)]:
out = model(**data)
results[name] = {
'emotion': out['emotion'].shape,
'fatigue': out['fatigue'].shape,
'distraction': out['distraction'].shape
}

return results


if __name__ == "__main__":
results = test_modality_missing()
for name, shapes in results.items():
print(f"{name}: {shapes}")

print("\n=== InCarEmo 数据集关键指标 ===")
print("模态: RGB + IR + Audio + Text(首个四模态车内数据集)")
print("任务: 情感识别 + 疲劳检测 + 分心监控")
print("情绪类别: 愤怒/悲伤/激动/喜悦")
print("语言: 中文(主)+ 英文(辅助)")
print("光照: 白天/夜间/隧道/阴影")
print("特色: 模态缺失测试 + 噪声鲁棒性评估")

3. 关键发现

3.1 多模态融合优势

配置 情感识别准确率 疲劳检测准确率 分心监控准确率
RGB only 72% 78% 75%
RGB + IR 76% 82% 78%
RGB + Audio 79% 80% 77%
RGB + IR + Audio 83% 85% 81%
全模态 87% 89% 85%

3.2 噪声与模态缺失挑战

场景 可用模态 准确率下降 启示
白天正常 全模态 基准 最佳
夜间 IR+Audio+Text -5% IR替代RGB有效
强噪声 RGB+IR+Text -8% 音频噪声是主要弱点
无对话 RGB+IR+Audio -3% 文本非必需但有用
仅RGB RGB -15% 单模态不足

3.3 跨语言评估

基准 情感识别 说明
中文 87% 主数据集
英文(辅助) 82% 跨语言泛化有5%差距

4. 与现有数据集对比

数据集 模态数 情感标注 疲劳 分心 对话 夜间 规模
DR(eye)VE 2 ❌ ✅ ❌ ❌ ❌ 中
BDD-A 1 ❌ ❌ ✅ ❌ ❌ 大
DADA-2000 2 ❌ ❌ ✅ ❌ ❌ 中
HIVE 2 ❌ ✅ ❌ ❌ ✅ 小
CogDrive 2 ❌ ❌ ✅ ❌ ❌ 中
InCarEmo 4 ✅ ✅ ✅ ✅ ✅ 中

5. 对 IMS 开发的启示

5.1 数据集建设

建议 依据 优先级
建设多模态采集能力 4模态比单模态准确率高15% 🔴 高
必须包含夜间IR数据 夜间场景准确率下降5% 🔴 高
录制车内音频 音频对情感识别贡献最大(+7%) 🔴 高
采集对话内容 文本模态额外+3-4% 🟡 中
设计模态缺失降级 真实场景模态会缺失 🔴 高

5.2 情感识别落地

功能 技术路线 优先级
路怒症检测 RGB面部表情+音频语调 🔴 高
疲劳+情绪联动 RGB+IR+PERCLOS 🔴 高
分心+情绪联动 RGB+眼动+行为 🟡 中
对话情感分析 ASR+NLP情感分类 🟡 中

5.3 与 InCarEmo 的差距分析

维度 InCarEmo IMS 现状 差距
模态数 4 (RGB+IR+Audio+Text) 1-2 (RGB+IR) 🔴 需增加音频+文本
情感标注 4类情绪 无 🔴 需新增
模态缺失测试 完整 无 🔴 需新增
夜间数据 有 部分 🟡 需补充
对话场景 有 无 🟡 需新增

6. 参考资源


InCarEmo 是车内情感识别的里程碑数据集。 四模态融合+模态缺失测试+双语支持,为 IMS 从纯安全监控升级为”有共情能力的座舱”提供了数据基础。下一步应在 IMS 中增加音频和文本模态的采集能力。