原文
微表情序列中Apex帧介绍
一个微表情视频序列以Onset帧开始,以Offset帧结束,通常保持中性的表情;其中Apex帧是在序列中变化强度最大的那一帧。
一个微表情序列的Apex帧,在微表情分类中能提供丰富的特征,可以帮助接下来的光流特征提取、迁移学习等。
一种查找Apex帧算法
下面是一种在微表情序列中提取Apex帧的算法,算法流程如下:
- 根据面部68个特征点,定位10个微表情肌肉移动发生频繁的区域
- 定义变化强度M,用于衡量序列中每一帧变化大小
- 遍历序列帧,计算每一帧变化强度Mi,取值最大的那帧作为Apex帧
Step 1 定义10个面部区域块
首先通过一个开源面部工具(ageitgey/face_recognition)[https://github.com/ageitgey/face_recognition]定位每一帧68个面部特征点,接着基于这些特征点定义10个面部区域块。其效果如图1:
这10个区域分别选取left_lip、right_lip、chin、left_nose、right_nose、left_eye、right_eye、left_eyebrow、right_eyebrow处的特征点作为基准点,形成正方形块。其中,正方形的边长是上嘴唇距离的一半,作者称边长的确定是启发式地(heuristically)。
下面以左嘴唇正方形块区域举例:
1 | import face_recognition |
Step 2 定义变化强度
首先分别计算当前帧与Onset帧、Offset帧在这10个区域块的绝对像素差,为了减少环境噪音影响,将差值的除以当前帧与偏差为З的连续帧的绝对像素差。将规化后的像素差求和,表示当前帧的变化强度值,即Mi。(З 表示epsilon,一个变量,并非数字3)
下面根据计算脸部某个区域的变化强度函数,理解上述公式。实际上还需要对10个面部区域块分别计算,取其均值作为当前帧的变化强度值Mi。
1 | def compute_cell_difference(cell_t: np.ndarray, cell_onset: np.ndarray, cell_offset: np.ndarray, cell_epsilon: int): |
Step 3 遍历查找
遍历计算对应帧的的变化强度M,取值最大的那帧作为Apex帧。
浅蓝色曲线描述了序列中每帧的变化强度M值的变化。
实验
CASMEⅡ 微表情数据集已经对其中的微表情序列Apex帧进行了人工标注,在此数据集上使用上述算法进行自动查找,观察实验结果。
- 准备CASMEⅡ 数据集
- 运行代码得到预测的Apex 帧序号数组pred_apex_id_list,图3 显示了某个微表情序列的Apex帧标注过程
- 通过人工标注的Apex帧序号数组groundtruth_apex_id_list 和自动预测的Apex帧序号数组 pred_apex_id_list,得到绝对差值数组absolute_difference_list, 观察其平均值(也即两组数据的平均绝对误差,MAE)、无偏标准差(两组数组的均方根误差, RMSE)、中位数。
其平均值7.91, 中位数4.0,无偏标准差10.0, 反应了其集中趋势和波动大小。
参考文献
[1] N. V. Quang, J. Chun and T. Tokuyama, “CapsuleNet for Micro-Expression Recognition,” 2019 14th IEEE International Conference on Automatic Face & Gesture Recognition (FG 2019), 2019, pp. 1-7, doi: 10.1109/FG.2019.8756544.