EmoDLNet 深度解析:2D+1D CNN + 分层 GRU 时序认知状态检测及 DMS 迁移

EmoDLNet 深度解析:2D+1D CNN + 分层 GRU 时序认知状态检测及 DMS 迁移

Frontiers in Human Neuroscience 2026 引用 EmoDLNet 端到端深度学习框架,集成 2D+1D CNN 与分层 GRU 自动提取多尺度时空特征。原用于飞行学员脑网络情绪分类,可迁移到 DMS 时序认知状态检测。

1 EmoDLNet 架构

1.1 架构概要

组件 作用 输入 输出
2D CNN 空间特征提取 多通道信号 (B,C,T) 空间特征图
1D CNN 时频特征提取 多通道信号 (B,C,T) 时频特征
分层 GRU 长时序依赖 拼接特征序列 时序状态
分类头 多类分类 GRU 最后隐状态 类别概率

1.2 DMS 迁移方案

原始用途 DMS 迁移 输入变化
EEG 14通道 面部关键点序列 14→98点
情绪4分类 认知状态4分类 标签调整
离线分析 实时检测 延迟约束

1.3 核心代码(参考前篇航空座舱博客中的 EmoDLNet 实现)

已在前篇博客中提供完整实现,此处聚焦 DMS 迁移关键改动:

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
class EmoDLNetDMS(nn.Module):
"""
EmoDLNet DMS 改造版

输入: 面部关键点序列 (代替 EEG)
输出: 认知状态 (正常/疲劳/分心/压力)

关键改动:
1. 输入从 EEG (B,14,T) → 关键点 (B,98*2,T)
2. 2D CNN 空间维度从 14 → 196 (98点×2坐标)
3. 1D CNN 时频提取不变
4. GRU 时序建模不变
"""

def __init__(self, n_keypoints: int = 98, n_classes: int = 4):
super().__init__()
n_features = n_keypoints * 2 # x,y 坐标

# 2D CNN: 空间模式提取
self.spatial = nn.Sequential(
nn.Conv2d(1, 32, kernel_size=(n_features, 3), padding=(0, 1)),
nn.BatchNorm2d(32), nn.ReLU(),
nn.MaxPool2d((1, 2)),
nn.Conv2d(32, 64, kernel_size=(1, 3), padding=(0, 1)),
nn.BatchNorm2d(64), nn.ReLU(),
nn.MaxPool2d((1, 2)),
)

# 1D CNN: 时频模式
self.temporal = nn.Sequential(
nn.Conv1d(n_features, 64, 7, padding=3),
nn.BatchNorm1d(64), nn.ReLU(),
nn.MaxPool1d(2),
nn.Conv1d(64, 128, 5, padding=2),
nn.BatchNorm1d(128), nn.ReLU(),
nn.MaxPool1d(2),
)

# 分层 GRU
self.gru = nn.GRU(192, 128, num_layers=2,
batch_first=True, bidirectional=True, dropout=0.3)

self.head = nn.Sequential(
nn.Linear(256, 128), nn.ReLU(), nn.Dropout(0.5),
nn.Linear(128, n_classes),
)

def forward(self, keypoints: torch.Tensor) -> torch.Tensor:
"""
Args:
keypoints: (B, T, n_keypoints*2) 面部关键点序列
"""
B, T, F = keypoints.shape
x = keypoints.permute(0, 2, 1) # (B, F, T)

# 2D
x2d = x.unsqueeze(1) # (B, 1, F, T)
spatial = self.spatial(x2d).squeeze(2) # (B, 64, T//4)

# 1D
temporal = self.temporal(x) # (B, 128, T//4)

# 融合
combined = torch.cat([spatial, temporal], dim=1) # (B, 192, T//4)
combined = combined.permute(0, 2, 1) # (B, T//4, 192)

# GRU
out, _ = self.gru(combined)

return self.head(out[:, -1, :])

2 对 IMS 的价值

价值 说明
时序认知状态 比帧级分类更鲁棒
多尺度特征 空间+时频双视角
GRU 长依赖 捕捉认知状态渐变
关键点输入 无需 EEG,用摄像头即可

3 总结

EmoDLNet 的 2D+1D CNN + 分层 GRU 架构天然适合 DMS 时序认知状态检测。将输入从 EEG 改为面部关键点序列,即可实现非接触式认知状态监测。


参考来源:


EmoDLNet 深度解析:2D+1D CNN + 分层 GRU 时序认知状态检测及 DMS 迁移
https://dapalm.com/2026/09/10/2026-09-10-emodlnet-2d-1d-cnn-hierarchical-gru-cognitive-dms-migration-ims/
作者
Mars
发布于
2026年9月10日
许可协议