CASME2 微表情数据集:技术解析与应用实践指南

1次阅读
没有评论

共计 2923 个字符,预计需要花费 8 分钟才能阅读完成。

image.webp

背景介绍

微表情是人类在试图隐藏真实情感时,短暂且难以控制的面部表情变化。它们通常只持续 1 /25 到 1 / 5 秒,这使得微表情识别成为一项极具挑战性的任务。CASME2(Chinese Academy of Sciences Micro-expression Database II)是目前最权威的微表情数据集之一,由中国科学院心理研究所开发。它包含 247 个微表情视频样本,涵盖了 7 种基本情绪类别,是微表情识别研究的重要基准数据集。

CASME2 微表情数据集:技术解析与应用实践指南

CASME2 的权威性体现在几个方面:

  • 样本数量和质量在同类数据集中领先
  • 提供精确的起始帧和结束帧标注
  • 包含丰富的元数据(如被试信息、诱发材料等)
  • 被广泛引用在顶级计算机视觉和心理学期刊上

数据结构解析

CASME2 数据集采用分层目录结构存储,主要包含以下内容:

  1. 视频文件 :AVI 格式,分辨率 640×480,帧率 25fps
  2. 标注文件 :Excel 格式,包含每个样本的:
  3. 起始帧和结束帧
  4. 情绪类别标签(如 happiness、disgust 等)
  5. 诱发材料描述
  6. 被试基本信息
  7. AU 编码 :部分样本包含面部动作单元(Action Unit)标注

一个典型的文件结构如下:

CASME2/
├── RawVideo/
│   ├── sub01/
│   │   ├── EP02_01.avi
│   │   └── ...
│   └── ...
└── CASME2-coding-20140508.xlsx

预处理方法

以下 Python 代码展示了如何加载和处理 CASME2 数据:

import cv2
import pandas as pd
from pathlib import Path

# 加载标注文件
annotations = pd.read_excel('CASME2-coding-20140508.xlsx')

# 定义预处理函数
def preprocess_video(video_path, start_frame, end_frame):
    """
    预处理视频片段
    :param video_path: 视频文件路径
    :param start_frame: 起始帧
    :param end_frame: 结束帧
    :return: 处理后的帧列表
    """
    cap = cv2.VideoCapture(str(video_path))
    frames = []

    # 定位到起始帧
    cap.set(cv2.CAP_PROP_POS_FRAMES, start_frame)

    for _ in range(start_frame, end_frame + 1):
        ret, frame = cap.read()
        if not ret:
            break

        # 转换为灰度图并调整大小
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        resized = cv2.resize(gray, (128, 128))

        # 直方图均衡化
        equalized = cv2.equalizeHist(resized)
        frames.append(equalized)

    cap.release()
    return frames

# 示例:处理单个样本
sample = annotations.iloc[0]
video_path = Path('RawVideo') / sample['Subject'] / f"{sample['Filename']}.avi"
processed_frames = preprocess_video(video_path, sample['OnsetFrame'], sample['ApexFrame'])

特征提取技巧

微表情识别常用的特征提取方法包括:

  1. 局部二值模式(LBP):对纹理变化敏感,计算效率高
  2. 光流特征 :捕获微小的面部运动
  3. 深度学习特征 :使用预训练 CNN 提取高层特征

以下是使用 LBP 特征的示例代码:

from skimage.feature import local_binary_pattern

def extract_lbp_features(frames, radius=1, n_points=8):
    """
    提取 LBP 特征
    :param frames: 预处理后的帧序列
    :param radius: LBP 半径
    :param n_points: 邻域点数
    :return: 特征向量
    """
    features = []
    for frame in frames:
        lbp = local_binary_pattern(frame, n_points, radius, method='uniform')
        hist, _ = np.histogram(lbp, bins=n_points+2, range=(0, n_points+2))
        features.append(hist)

    return np.concatenate(features)

# 提取特征
lbp_features = extract_lbp_features(processed_frames)

性能考量

处理 CASME2 数据时需要注意以下性能因素:

  1. 内存使用 :
  2. 原始视频数据较大,建议逐帧处理
  3. 对于深度学习模型,考虑使用生成器而非加载全部数据

  4. 计算效率 :

  5. LBP 和 HOG 等手工特征计算速度快
  6. 光流计算较耗时,可考虑 Farneback 或 TVL1 算法

  7. 平衡策略 :

  8. CASME2 各类别样本不均衡,需采用过采样 / 欠采样
  9. 数据增强(如轻微旋转、平移)有助于提升泛化性

避坑指南

常见问题及解决方案:

  1. 标注不一致 :
  2. 部分样本的起始帧定义模糊
  3. 解决方案:结合多个标注者的结果或人工复核

  4. 面部对齐问题 :

  5. 被试头部运动影响特征提取
  6. 解决方案:使用 Dlib 或 MTCNN 进行面部对齐

  7. 小样本挑战 :

  8. 某些情绪类别样本过少
  9. 解决方案:采用迁移学习或小样本学习技术

应用案例

下面展示一个简单的微表情分类流程:

from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

# 假设我们已经提取了所有样本的特征和标签
X = [...]  # 特征矩阵
Y = [...]  # 标签向量

# 划分训练测试集
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2)

# 训练 SVM 分类器
clf = SVC(kernel='rbf', class_weight='balanced')
clf.fit(X_train, y_train)

# 评估
preds = clf.predict(X_test)
print(classification_report(y_test, preds))

进一步学习

  1. 官方资源 :
  2. CASME2 数据集官网(需申请访问权限)
  3. 原始论文:Yan et al., “CASME II: An improved spontaneous micro-expression database”

  4. 开源工具 :

  5. OpenFace:面部行为分析工具包
  6. Py-FEAT:面部表情分析工具箱

  7. 进阶方向 :

  8. 时序建模(LSTM、3D CNN 等)
  9. 多模态融合(结合 EEG 或生理信号)
  10. 自监督学习解决数据稀缺问题

通过本文的介绍,希望读者能够快速上手 CASME2 数据集,并在微表情识别领域开展有价值的研究。记得在实际应用中,始终关注模型的泛化能力和计算效率,这是将研究成果转化为实际应用的关键。

正文完
 0
评论(没有评论)