共计 2345 个字符,预计需要花费 6 分钟才能阅读完成。
背景与应用价值
微表情作为持续时间仅 1 /25 至 1 / 5 秒的面部肌肉运动,在测谎、临床诊断(如抑郁症评估)和智能人机交互等领域具有重要价值。相比普通表情识别,微表情分析面临三大核心挑战:

- 数据稀缺性:公开数据集仅包含数百个样本(如 CASME-II 的 247 个样本)
- 标注复杂性:需要专业 FACS(面部动作编码系统)认证人员标注 AU(动作单元)组合
- 信号微弱性:幅度变化通常小于 0.5 毫米(约 1 - 2 个像素)
CASME 数据集特点
- 高帧率采集:200fps 高速相机(普通视频的 10 倍)
- 多模态标注:包含 AU 标签、诱发情绪类别和强度等级
- 时空基准:提供起始帧(onset)、峰值帧(apex)和结束帧(offset)的精确位置
核心技术方案
传统方法与深度学习对比
光流法(TV-L1):
– 优点:无需训练数据,物理意义明确
– 缺点:对光照变化敏感,无法捕捉肌肉协同运动
3D-CNN+LSTM 混合架构:
– 空间特征提取:3D 卷积核(如 3×3×3)捕获面部微运动
– 时序建模:BiLSTM 处理峰值帧前后时序关系
– 混合优势:
– 3D-CNN 保留短时运动信息
– LSTM 建模长时依赖(如 onset-apex-offset 全过程)
数据增强策略
针对样本不足问题:
- 时空弹性形变:
- 对视频片段施加随机时间缩放(±10% 速度变化)
-
空间局部仿射变换(眼 / 嘴部区域独立变形)
-
光流扰动:
-
在计算的光流场上添加高斯噪声(σ=0.1)
-
跨样本混合:
- 将不同样本的 onset-apex 段进行拼接
代码实现
PyTorch 关键组件
# 数据加载器示例(含时序切片)class CASMELoader(torch.utils.data.Dataset):
def __init__(self, root_dir, clip_len=16):
self.clip_len = clip_len # 时间窗口大小
self.samples = []
# 解析 CASME 标注文件(省略具体 IO 代码)def __getitem__(self, idx):
video_path = self.samples[idx]['path']
frames = load_frames(video_path) # 返回 [T,H,W,C] 张量
# 时间切片:以 apex 帧为中心取片段
apex_idx = self.samples[idx]['apex']
start = max(0, apex_idx - self.clip_len//2)
end = min(len(frames), apex_idx + self.clip_len//2)
clip = frames[start:end]
# 归一化与增强
clip = (clip / 255.0 - 0.5) / 0.5 # 归一到[-1,1]
if self.transform:
clip = self.transform(clip)
return clip, self.samples[idx]['label']
模型核心代码
class MicroExprNet(nn.Module):
def __init__(self, num_classes):
super().__init__()
# 3D 特征提取(使用 SlowOnly 架构)self.cnn = nn.Sequential(nn.Conv3d(3, 64, kernel_size=(1,3,3), stride=(1,2,2)),
nn.BatchNorm3d(64),
nn.ReLU(),
# 更多 3D 卷积层...
)
# 时序建模
self.lstm = nn.LSTM(
input_size=512, # CNN 输出特征维度
hidden_size=128,
bidirectional=True
)
self.classifier = nn.Linear(256, num_classes) # 双向 LSTM 需×2
def forward(self, x):
# x 形状:[B,C,T,H,W]
features = self.cnn(x) # [B,512,T/8,14,14]
features = features.mean(dim=[3,4]) # 空间池化 [B,512,T/8]
features = features.permute(2,0,1) # 调整为 [T,B,C] 格式
_, (h_n, _) = self.lstm(features)
h_n = torch.cat([h_n[0], h_n[1]], dim=1) # 拼接双向输出
return self.classifier(h_n)
实验与优化
性能指标(CASME-II 子集)
| 模型 | 准确率 | 召回率 |
|---|---|---|
| 传统光流 +SVM | 58.2% | 53.7% |
| 3D-CNN(仅空间) | 63.1% | 59.4% |
| 本文混合模型 | 72.6% | 68.9% |
主干网络对比
- ResNet-18:
- 参数量:11.2M
- 推理速度:28 FPS
-
优点:训练稳定性高
-
EfficientNet-B0:
- 参数量:4.1M
- 推理速度:41 FPS
- 优点:更适合移动端部署
避坑指南
时间对齐问题
- 滑动窗口投票:将长视频切分为重叠的 16 帧片段,通过多数表决整合结果
- 关键帧注意力:让模型学习自动关注 apex 附近的特征(添加可学习的 attention gate)
面部遮挡处理
- 局部特征掩码:
- 使用面部关键点划分 ROI 区域
-
对遮挡区域(如戴口罩)对应的特征图通道置零
-
对抗训练:
- 在输入图像上随机添加矩形遮挡块(最大占画面 30%)
- 配合梯度反转层增强鲁棒性
未来改进方向
- 跨数据集迁移:
- 先在 SAMM(西方人种数据集)上预训练
-
再用 CASME 进行微调(需处理人种差异)
-
FACS 编码扩展:
- 将分类任务改为 AU 检测(如预测 AU4+AU7 组合)
- 需要更精细的局部特征提取(参考论文 DOI:10.1109/TPAMI.2021.3075412)
通过本方案的实践,开发者可快速构建基线系统。建议优先关注眼部区域(AU1-7)和嘴部区域(AU12-25)的特征学习,这是微表情最常发生的区域。
正文完
