共计 2838 个字符,预计需要花费 8 分钟才能阅读完成。
背景介绍
微表情识别是计算机视觉中极具挑战性的研究方向,它通过分析人类面部微小、短暂的表情变化来识别真实情绪。这类技术在心理学研究、测谎系统、人机交互等领域有重要应用价值。

CASME(Chinese Academy of Sciences Micro-expression)是中国科学院心理研究所发布的高质量微表情数据集,具有以下特点:
- 包含 35 名中国受试者的 195 个微表情样本
- 视频分辨率 640×480,帧率 60fps
- 提供 AUs(动作单元)标注和情绪类别(如高兴、厌恶等)
- 包含面部关键点坐标数据
与其它数据集相比,CASME 的优势在于:
- 样本采集环境受控,背景统一
- 标注信息丰富且专业
- 针对亚洲人面部特征
数据预处理
CASME 原始数据以 AVI 视频和 Excel 标注文件的形式存储。我们需要将视频转换为适合模型训练的帧序列,并处理对应的标签数据。
1. 视频帧提取
使用 OpenCV 逐帧读取视频,并按固定间隔采样(避免相邻帧过于相似):
import cv2
import os
def extract_frames(video_path, output_dir, interval=3):
"""
从视频中按间隔提取帧
:param video_path: 视频文件路径
:param output_dir: 输出目录
:param interval: 采样间隔(帧数)"""
if not os.path.exists(output_dir):
os.makedirs(output_dir)
cap = cv2.VideoCapture(video_path)
frame_count = 0
saved_count = 0
while True:
ret, frame = cap.read()
if not ret:
break
if frame_count % interval == 0:
output_path = os.path.join(output_dir, f"frame_{saved_count:04d}.jpg")
cv2.imwrite(output_path, frame)
saved_count += 1
frame_count += 1
cap.release()
return saved_count
2. 标注数据处理
CASME 的标注信息存储在 Excel 中,我们需要将其转换为易用的格式(如 CSV):
import pandas as pd
def process_annotations(excel_path, output_csv):
"""
处理原始 Excel 标注文件
:param excel_path: Excel 文件路径
:param output_csv: 输出 CSV 路径
"""
# 读取 Excel 文件
df = pd.read_excel(excel_path, sheet_name='Sheet1')
# 选择需要的列
processed = df[[
'Filename',
'OnsetFrame',
'ApexFrame',
'OffsetFrame',
'Emotion'
]].copy()
# 保存为 CSV
processed.to_csv(output_csv, index=False)
3. 数据标准化
微表情数据通常需要进行以下处理:
- 人脸检测和对齐(使用 dlib 或 MTCNN)
- 图像归一化(尺寸调整、灰度化等)
- 时序标准化(统一序列长度)
模型实现
我们使用 PyTorch 构建一个简单的 3D CNN 模型,该架构适合处理视频时序数据:
import torch
import torch.nn as nn
class Simple3DCNN(nn.Module):
def __init__(self, num_classes):
super(Simple3DCNN, self).__init__()
self.conv1 = nn.Conv3d(3, 32, kernel_size=(3, 3, 3), padding=1)
self.bn1 = nn.BatchNorm3d(32)
self.pool1 = nn.MaxPool3d(kernel_size=(1, 2, 2))
self.conv2 = nn.Conv3d(32, 64, kernel_size=(3, 3, 3), padding=1)
self.bn2 = nn.BatchNorm3d(64)
self.pool2 = nn.MaxPool3d(kernel_size=(2, 2, 2))
self.conv3 = nn.Conv3d(64, 128, kernel_size=(3, 3, 3), padding=1)
self.bn3 = nn.BatchNorm3d(128)
self.pool3 = nn.MaxPool3d(kernel_size=(2, 2, 2))
self.global_pool = nn.AdaptiveAvgPool3d(1)
self.fc = nn.Linear(128, num_classes)
def forward(self, x):
# x 形状: (batch_size, 3, seq_len, H, W)
x = torch.relu(self.bn1(self.conv1(x)))
x = self.pool1(x)
x = torch.relu(self.bn2(self.conv2(x)))
x = self.pool2(x)
x = torch.relu(self.bn3(self.conv3(x)))
x = self.pool3(x)
x = self.global_pool(x)
x = x.view(x.size(0), -1)
x = self.fc(x)
return x
避坑指南
在使用 CASME 数据集时,新手常遇到以下问题:
- 标签不一致问题
-
解决方案:仔细检查 Excel 中各 sheet 的标签定义,建议统一转换为数字标签
-
视频时长差异大
-
解决方案:使用滑动窗口切分或填充 / 截断统一长度
-
面部检测失败
-
解决方案:尝试多种检测器(dlib、MTCNN 等),必要时手动调整参数
-
类别不平衡
-
解决方案:采用加权损失函数或过采样技术
-
过拟合问题
- 解决方案:增加数据增强(随机裁剪、翻转等),使用 Dropout 层
扩展思考
要提升模型在 CASME 上的表现,可以考虑以下方向:
- 时序建模改进
- 使用 LSTM 或 Transformer 替代简单池化
-
尝试光流特征作为补充输入
-
注意力机制
- 添加空间注意力聚焦面部关键区域
-
时序注意力突出微表情关键帧
-
迁移学习
- 在大型表情数据集(如 FER2013)上预训练
-
使用人脸识别模型(如 VGGFace)的特征
-
多模态融合
- 结合 AUs 标注信息
-
引入生理信号(如 EEG、GSR)
-
数据增强策略
- 基于 GAN 生成合成微表情样本
- 跨数据集迁移(如 CASME 与 SAMM 结合)
学习资源推荐
- 官方资源
- CASME 数据集官网
-
相关工具
- OpenCV 视频处理教程
-
PyTorch 官方文档
-
进阶学习
- 《Microexpression Recognition》专著
- IEEE FG 等会议的最新论文
通过本教程,你应该已经掌握了 CASME 数据集的基本使用方法。微表情识别仍是一个快速发展的领域,建议持续关注最新研究进展,并尝试将本文的基础方案扩展到更复杂的应用中。
