CASME数据集入门指南:从数据预处理到微表情识别实战

1次阅读
没有评论

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

image.webp

背景介绍

微表情识别是计算机视觉中极具挑战性的研究方向,它通过分析人类面部微小、短暂的表情变化来识别真实情绪。这类技术在心理学研究、测谎系统、人机交互等领域有重要应用价值。

CASME 数据集入门指南:从数据预处理到微表情识别实战

CASME(Chinese Academy of Sciences Micro-expression)是中国科学院心理研究所发布的高质量微表情数据集,具有以下特点:

  • 包含 35 名中国受试者的 195 个微表情样本
  • 视频分辨率 640×480,帧率 60fps
  • 提供 AUs(动作单元)标注和情绪类别(如高兴、厌恶等)
  • 包含面部关键点坐标数据

与其它数据集相比,CASME 的优势在于:

  1. 样本采集环境受控,背景统一
  2. 标注信息丰富且专业
  3. 针对亚洲人面部特征

数据预处理

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. 数据标准化

微表情数据通常需要进行以下处理:

  1. 人脸检测和对齐(使用 dlib 或 MTCNN)
  2. 图像归一化(尺寸调整、灰度化等)
  3. 时序标准化(统一序列长度)

模型实现

我们使用 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 数据集时,新手常遇到以下问题:

  1. 标签不一致问题
  2. 解决方案:仔细检查 Excel 中各 sheet 的标签定义,建议统一转换为数字标签

  3. 视频时长差异大

  4. 解决方案:使用滑动窗口切分或填充 / 截断统一长度

  5. 面部检测失败

  6. 解决方案:尝试多种检测器(dlib、MTCNN 等),必要时手动调整参数

  7. 类别不平衡

  8. 解决方案:采用加权损失函数或过采样技术

  9. 过拟合问题

  10. 解决方案:增加数据增强(随机裁剪、翻转等),使用 Dropout 层

扩展思考

要提升模型在 CASME 上的表现,可以考虑以下方向:

  1. 时序建模改进
  2. 使用 LSTM 或 Transformer 替代简单池化
  3. 尝试光流特征作为补充输入

  4. 注意力机制

  5. 添加空间注意力聚焦面部关键区域
  6. 时序注意力突出微表情关键帧

  7. 迁移学习

  8. 在大型表情数据集(如 FER2013)上预训练
  9. 使用人脸识别模型(如 VGGFace)的特征

  10. 多模态融合

  11. 结合 AUs 标注信息
  12. 引入生理信号(如 EEG、GSR)

  13. 数据增强策略

  14. 基于 GAN 生成合成微表情样本
  15. 跨数据集迁移(如 CASME 与 SAMM 结合)

学习资源推荐

  1. 官方资源
  2. CASME 数据集官网
  3. 原始论文

  4. 相关工具

  5. OpenCV 视频处理教程
  6. PyTorch 官方文档

  7. 进阶学习

  8. 《Microexpression Recognition》专著
  9. IEEE FG 等会议的最新论文

通过本教程,你应该已经掌握了 CASME 数据集的基本使用方法。微表情识别仍是一个快速发展的领域,建议持续关注最新研究进展,并尝试将本文的基础方案扩展到更复杂的应用中。

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