最近把微表情识别(Micro-expression Recognition)方向几篇比较经典的综述重新翻出来做了逐段精读,这篇算是我梳理的第一篇笔记。微表情识别这个领域很有意思,它研究的是那些持续时间极短、强度极低、通常只在脸部局部区域出现的表情信号。很多人一听到“微表情”就想到刑侦剧里审讯室的高清特写,实际接触下来发现完全不是那么回事——数据采集难、标注更难、模型泛化更是老大难。这篇笔记围绕微表情识别的核心环节展开,适合刚接触这个方向的研究生、准备做课程设计的本科生,以及想了解情感计算落地边界的工程师。我会把综述里涉及的识别流程、数据集、主流方法、评价指标和现实挑战逐一拆开讲,结合我自己跑实验踩过的坑,尽量给出一份能直接参考的笔记。
1. 微表情识别到底在解决什么问题
1.1 微表情和普通表情的界限在哪里
先理清一个基本概念:微表情和普通表情(宏表情)不是程度上的差别,而是本质上的差别。1966年Haggard和Isaacs在临床影像中首次记录了这种转瞬即逝的面部动作,后来Ekman等人在研究谎言行为时系统化地把它定义下来。综述里给了一个被广泛引用的界定标准:微表情的持续时间通常在1/25秒到1/5秒之间,动作强度非常低,并且通常只涉及脸部的局部区域——比如嘴角短暂地抽动一下、眉毛迅速上挑又恢复。相比之下,普通表情可以持续0.5秒到4秒,运动幅度明显,而且往往涉及整个面部的多块肌肉协同。这里有个容易被忽略的细节:微表情的出现往往是被试试图掩盖真实情绪时泄露的“破绽”,所以它不像普通表情那样有清晰的起始、峰值、结束三个阶段,很多时候只有一个模糊的、幅度极低的运动片段,这就给识别带来了很大的困难。
从应用场景来看,微表情识别的价值恰恰在于它的“不可控性”。人在社交场合中会有意识地管理自己的表情,但微表情是自主神经系统驱动的,很难完全抑制。这也是为什么这项技术除了传统的心理学研究,还被逐步引入到访谈分析、医疗辅助评估、人机交互等领域。不过我得泼一盆冷水:目前学术界的研究仍然高度依赖实验室条件下的诱发视频和高速相机,离真实场景下的“读心”还有很远。综述里也明确提到,当前方法在受控数据集上已经能拿到不错的准确率,但迁移到自然环境时性能会明显下降。
1.2 为什么这个任务这么难
我在第一次接触这个领域时天真地以为,微表情识别就是把普通表情识别模型的骨干网络换一下、把帧率调高就行了。实际做下来才发现,这个任务难在三个地方。
第一个难点是数据太稀少。微表情的采集不像普通表情那样可以摆拍,它需要被试在严格的实验室条件下观看能诱发真实情绪的视频片段,然后用高速相机以100到200帧每秒的速度记录,再通过专家逐帧标注出现的微表情区间和类别。一个被试一个小时的采集,最终可能只有几十个有效样本。目前公开的数据集,比如CASME II,总共也只有两百多个样本,这和ImageNet那种百万级的数据量完全不在一个数量级。数据量小直接导致深度模型容易过拟合,这是整个领域面临的结构性矛盾。
第二个难点是运动幅度太小。普通表情的特征是“形状变化”,比如嘴巴张大、眉毛扬起;但微表情更多是“微小运动”,比如嘴角某个角度的轻微移动。很多在普通表情识别里效果很好的空间特征提取器,拿到微表情上根本提不到有效信息。这就需要在预处理阶段做运动放大,但这又会引入噪声。如何在放大微弱信号的同时抑制背景抖动和传感器噪声,是一个非常棘手的问题。
第三个难点是标注的主观性。微表情的起始帧和峰值帧怎么定,不同标注者之间经常有分歧;类别标签也依赖标注者对动作单元(Action Units, AUs)的熟练程度。综述里特别提到,数据集的标注一致性(比如Cohen's Kappa系数)直接影响后续所有实验的可比性。这也就是说,很多时候模型性能的差异,可能有一半是标注噪声带来的。
2. 微表情识别的完整流程与设计思路
2.1 四步走的基本架构
综述里把微表情识别系统拆成了四个标准模块:人脸检测与对齐、运动放大、时空特征提取、分类器学习。这个架构在过去的十多年里基本没变过,变的只是每个模块内部的具体技术。
人脸检测与对齐是第一步,目的是把视频帧中的人脸区域裁剪出来,并做几何归一化,保证同一个被试的不同帧、不同被试之间的人脸位置和尺度一致。这一步听起来简单,但在微表情场景下有个特殊要求:因为后续要做帧间的运动分析和特征对比,人脸对齐的精度直接决定了运动信号的质量。如果对齐不准确,哪怕只是几个像素的偏移,都会被运动放大模块放大成虚假的“表情”。我在实验中就吃过这个亏,最初用的是普通表情识别里的轻量级人脸检测器,结果放大后的图像边缘出现大量伪影,后来换成基于人脸关键点做仿射变换的严格对齐,问题才缓解。
运动放大是微表情识别里非常关键的一步。常见做法是使用欧拉视频放大(Eulerian Video Magnification)或者其改进版本,把人脸视频分解成不同的时空频带,对感兴趣的频带做放大后再重建。放大的倍率不能盲目调高,太高会突出噪声,太低又提不到有效运动。综述里给出的参考区间是2到5倍,具体要根据数据集的采集环境和分辨来调。这个环节做得好不好,直接影响后续特征提取的输入质量,可以说是整个流程里性价比最高的一步。
2.2 特征提取与分类的两条路线
在特征提取和分类环节,综述把过去的工作按技术路线分成了两大阵营。
第一个阵营是手工特征加传统分类器。这属于微表情识别的经典范式,代表性方法包括局部二值模式在三正交平面上的扩展(LBP-TOP)、方向梯度直方图(HOG)的时空版本、光流特征等。这类方法的好处是计算开销小、可解释性强,对数据量的要求也比较低。直到今天,LBP-TOP仍然是一个很难被彻底打败的基线。但它的缺点也很明显:手工设计的特征很难覆盖微表情所有可能的运动模式,特征表达能力有上限。
第二个阵营是深度学习方法。早期直接套用普通表情识别的卷积神经网络结构,把视频帧堆叠成多通道输入,或者用三维卷积提取时空特征。近几年的工作逐渐精细化,出现了基于光流图的双流网络、基于注意力机制的局部区域增强、基于动作单元的引导网络,以及一些尝试用Transformer建模帧间依赖的架构。深度学习的优势在于特征是端到端学出来的,上限更高;劣势则是前面提到的对数据量极度敏感,在几百个样本上训练一个深度模型,稍有不慎就是严重过拟合。所以现在很多论文都采用预训练加微调、数据增强、跨数据集验证等策略来弥补数据不足。
我在实际项目中采用过一个折中方案:先用光流法提取微表情视频中运动最显著的区域,再把这些区域对应的原始帧送入一个相对浅层的三维卷积网络。这个方案的好处是既保留了深度模型的特征学习能力,又通过光流先验降低了模型需要学习的空间范围,在CASME II上的效果比我直接端到端训练一个深网络要好。
3. 核心数据集与评价标准细节
3.1 主流公开数据集速览
读综述时最重要的收获之一,就是把主流数据集的基本情况梳理清楚。我整理了一个表格,方便后续比对。
| 数据集 | 样本量 | 帧率 | 分辨率 | 类别 | 特点 |
|---|---|---|---|---|---|
| CASME | 195 | 60fps | 640x480 | 7类情绪 | 基于AUs标注,自发微表情 |
| CASME II | 247 | 200fps | 640x480 | 7类情绪 | 分辨率较高,标注精细,广泛使用 |
| SAMM | 159 | 200fps | 2040x1088 | 7类情绪 | 被试种族多样,难度更高 |
| SMIC | 164 | 100fps | 640x480 | 3类(正/负/惊) | 包含可见光、近红外、高速三个子集 |
| MMEW | 300+ | 100fps | 高分辨率 | 多类 | 更接近真实场景的诱发方式 |
这里有个需要特别注意的点:虽然CASME II是最常用的基准,但它的样本分布很不均衡,某些类别只有十几个样本。如果你在训练时不做任何处理,模型会倾向于把大多数测试样本预测为样本量大的类别。综述里的很多方法在报告准确率时,如果不明确说明采用了什么平衡策略,那这个数字的可信度就要打个折扣。SAMM数据集因为被试的种族、年龄更加多样,难度也相应提升,近年来越来越多的工作开始用“CASME II + SAMM”的组合做跨数据集验证,这是一个更严苛也更有说服力的评估方式。
3.2 评价指标里的门道
在分类任务中,大家习惯看准确率(Accuracy),但在微表情识别里只看准确率远远不够。因为类别不平衡,一个把所有样本都预测成多数类的“傻模型”也能拿到不错的准确率。综述里强调的指标有两个:一个是未加权平均召回率(Unweighted Average Recall, UAR),它对每个类别单独计算召回率再取平均,能更好地反映模型在每个类别上的表现;另一个是加权F1分数(Weighted F1),它综合了精确率和召回率,并且按样本量加权,是对不平衡数据更友好的指标。
做实验的时候,验证策略也会影响指标的解读。最常见的做法是被试内(within-subject)交叉验证,也就是同一个人的样本既出现在训练集也出现在测试集;而更严格的是被试间(cross-subject)交叉验证,训练集和测试集来自不同的人。被试间验证的难度要大得多,因为模型要泛化到没见过的人脸、表情风格甚至采集环境。综述里有很多论文在被试内验证上报告了接近90%的准确率,但一旦改成被试间验证,性能往往会掉到60%甚至更低。这个差距本身就是领域面临的真实难题。我自己的经验是,如果做横向对比,尽量选择被试间验证的报告值作为参考基准,这样更接近真实应用的难度。
提示:读论文时不要只看摘要里的准确率数字,一定要确认它用的是被试内还是被试间验证。这两个实验设置下的结果没有直接可比性。
4. 主流方法梳理与我的实操体会
4.1 从LBP-TOP到深度时空网络的演进
LBP-TOP是微表情识别里最经典的手工特征之一。它的思路是把一个小邻域内的像素纹理模式编码成二进制数,再分别在XY、XT、YT三个平面上统计直方图,最后串联起来作为视频片段的特征描述符。这个特征对光照变化有一定的鲁棒性,计算也简单,而且不需要逐帧标注关键点,所以成为早期微表情识别研究的主力。它的变体包括LBP-SIP(只使用三个正交平面上的相交点)、LBP-MOP(对三个平面分别提取统计量再拼接),不同变体在特征维度和鲁棒性上各有取舍。如果让我给新手一个建议,与其一上来就搞复杂的深度网络,不如先把LBP-TOP在数据集上跑通,它会给你一个非常可靠的性能基线。
深度学习方法在微表情识别上的应用,大致走过了三个阶段。第一个阶段是直接用三维卷积(3DCNN)或者循环神经网络(LSTM)处理裁剪后的人脸视频片段,思路是让网络自己去学时空特征。这类方法的代表有基于C3D的模型和基于ConvLSTM的模型。第二个阶段是引入光流信息,把光流图或者光流分量作为额外的输入通道,与RGB帧并行输入网络。这样做的好处是显式地强调了运动信息,让网络不用从零去学“哪里动了”。第三个阶段是结合动作单元和注意力机制,通过AU标签引导模型关注特定面部区域,或者在特征图上施加注意力权重,让模型更关注眉毛、眼角、嘴角这些微表情高发区域。
我在复现深度模型时发现,微表情数据集太小时,直接从头训练一个三维卷积网络几乎必然过拟合,训练集损失能降到接近0,验证集损失却一直往上涨。解决办法有几个:一是用在大规模视频数据集(比如Kinetics)上预训练好的模型做微调,二是对训练样本做运动放大和局部裁剪增强,三是采用浅层网络加正则化。这些技巧在综述里不一定详细展开,但在实际操作中往往是决定成败的关键。
4.2 我复现论文时踩过的坑
第一个坑是数据预处理不一致。有些论文在预处理阶段对视频做了人脸区域裁剪和时间段截取,另一些论文则用了整个人脸区域,这就导致即使采用同一种模型架构,报告出来的结果也可能差异很大。我一开始直接用原始视频帧训练,性能一直提不上去,后来仔细读论文的补充材料才发现对方在前处理里做了运动放大。所以复现论文的第一步,一定是从数据预处理开始逐行对齐,而不是直接跑到模型训练那一环。
第二个坑是数据增强方式不当。微表情的运动强度太弱,如果沿用普通表情识别里常用的随机裁剪、水平翻转等增强手段,很可能破坏微表情原本就微弱的运动模式,反而让模型学到错误的信息。我试过对微表情视频做水平翻转增强,结果跨被试验证的UAR下降了大概4个百分点,因为翻转后光流的方向信息被左右对调了,微表情的某些局部运动模式(比如左嘴角抽动变成右嘴角抽动)和标签之间的对应关系变成了噪声。这个经历让我意识到,做增强前得先想清楚这个操作会不会改变任务本身的语义。
第三个坑是类别不平衡的干扰。CASME II中“压抑”类样本数量远多于“紧张”等其他类别,如果直接用交叉熵损失训练,模型会把所有样本都倾向预测为“压抑”。我后来给每个类别按样本量的倒数加权了损失函数,UAR提升了将近10个百分点。这个提升幅度远大于我换任何模型结构带来的收益,可见数据不平衡问题在微表情识别里的影响有多大。综述里很多论文虽然提到了不平衡,但很少给出具体的处理细节,这一点需要自己在实验中验证。
注意:在做微表情识别实验时,损失函数的类别权重、数据增强策略、运动放大倍数这三个超参数,对最终性能的影响往往比网络结构更大。先把这三个点固定好,再谈模型结构的改进,实验会高效很多。
4.3 微表情检测与微表情识别的关系
综述里把微表情检测(spotting)和微表情识别(recognition)分成两个不同的子任务。检测任务是在一段长视频里找出微表情出现的起止时间或峰值帧;识别任务则是给定一个已经裁剪好的微表情视频片段,判断它属于哪种情绪。这两个任务在实际系统中是串联的:先检测,后识别。目前很多研究集中在检测环节,因为真实场景下不可能假设视频已经被精准裁剪过。检测的难点在于微表情在长视频里占比极短,本质上是一个极度不平衡的时序定位问题。常用的方法有基于帧间差异的峰值帧筛选、基于光流能量的候选段生成,以及近年来的基于时序卷积网络的检测模型。
我在做检测相关的实验时最直观的感受是,阈值设定是个非常微妙的事。如果把微表情和宏表情都当成“运动事件”来检测,很容易把宏表情的起始阶段误判为微表情。综述里提到一种思路:利用AU在特定区域的出现时间和强度来区分微表情和宏表情——宏表情通常激活多个AU且持续较久,微表情往往只激活局部AU且很快消失。这种基于面部运动单元的启发式规则,在标注质量较高的数据集上能起到很好的辅助过滤作用。
5. 当前挑战与我认为值得关注的方向
5.1 数据规模、标注成本与泛化能力
微表情识别要想从实验室走向真实场景,最大的一个拦路虎还是数据。现有的公开数据集基本都是实验室环境下诱发的自发微表情,被试坐在固定位置、配合特定光源、观看特定视频,和地铁、会议室、远程摄像头下的自然表情状态差异非常大。采集一个高质量微表情数据集的成本非常高,需要高速相机、专业心理学诱发素材、多名标注专家花费数百小时标注。这个问题短期内没有特别好的解决方案,所以很多团队开始尝试用生成对抗网络合成带标注的微表情样本,或者用自监督学习在大规模无标注视频上预训练,再用少量微表情数据微调。这些方向我在综述里看到了不少萌芽期的探索,虽然效果还不稳定,但思路是对的。
泛化能力差的另一个体现在于跨数据集迁移困难。不同数据集的采集设备、诱发任务、被试群体差异都很大,在一个数据集上训练好的模型直接拿到另一个数据集上去测试,性能会大幅下降。有些工作尝试通过域自适应来缓解这个问题,比如在特征层面对齐不同数据集的数据分布,效果有一定提升,但仍然远未到可实际部署的程度。如果你打算在这个方向上做深入,我建议重点关注跨数据集泛化问题,这是一个既有学术价值又有实际意义的切入点。
5.2 未来可能带来突破的几个技术方向
结合综述内容和我自己的观察,我觉得有几个方向值得持续跟踪。
第一个方向是自监督预训练。既然手工标注这么贵,那能不能先让模型在大量无标注的面部视频上做对比学习之类的自监督任务,学到通用的面部运动表征,然后再在少量微表情数据上微调?这条路线在普通视频理解领域已经被验证是有效的,微表情识别领域才刚刚开始尝试,但潜力很大。
第二个方向是基于多模态信息的融合。综述里主要讨论的是纯视觉方法,但微表情的产生往往伴随其他生理信号,比如心率变化、皮肤电导率变化、瞳孔直径变化等。如果有条件同时记录这些信号,理论上可以为识别提供额外的信息。不过多模态数据的同步采集和缺失处理都是麻烦事,短期内可能还是以视觉为主、生理信号为辅的浅层融合为主。
第三个方向是模型的可解释性。在心理分析和访谈辅助这类应用中,用户不仅想知道“这个人是不是在压抑情绪”,还想知道“是哪个动作单元、哪块肌肉的运动导致了这样的判断”。纯粹的黑盒模型很难获得用户信任。近年来涌现了不少基于注意力热力图、基于关键点轨迹、基于动作单元解释的方法,这类工作虽然不一定能显著提升准确率,但对应用落地很重要。
6. 实操笔记:我搭建一个微表情分类模型的流程记录
6.1 搭建流程和关键参数
我这里记录一个我实际跑通的微表情分类实验流程,给想入门的读者一个完整参考。整个流程用的是CASME II数据集的裁剪后视频片段。
预处理部分:我先把视频的每一帧用人脸关键点检测器提取68个人脸关键点,然后根据两只眼睛的位置做仿射变换,把人脸对齐到统一尺寸(256x256)。对齐之后,对所有帧的灰度图做欧拉运动放大,放大倍率先设为3,频带设定在0.5到3赫兹之间。接着把每个视频片段裁剪成统一的帧数,比如16帧,用于后续的时序模型输入。这里有个细节:如果原视频帧数不足16帧,我会用插值补全而不是重复最后一帧,这样能更好地保持运动连续性。
模型部分:我采用的方案是光流引导的浅层三维卷积网络。先用Farneback光流法在放大后的相邻帧之间计算稠密光流场,然后把光流场的水平分量和垂直分量叠加到原始灰度帧上,形成一个三通道的输入序列。网络使用三层三维卷积加两层全连接的结构,三维卷积的卷积核大小统一设为3x3x3,通道数分别是32、64、128。为了防止过拟合,我在全连接层之前加了概率为0.5的Dropout,并采用类加权交叉熵损失。
训练部分:优化器用Adam,初始学习率设为0.001,batch size设为8,训练80个epoch。因为数据量太少,我在训练时对每个训练样本在时间轴上做了随机裁剪(从16帧中随机选12帧),并在空间上做了小幅度的随机平移,幅度控制在4个像素以内。这个平移幅度不能太大,否则会破坏人脸对齐的一致性。最终我在被试间验证下拿到了大约62%左右的准确率,UAR在0.60附近,加权F1约为0.58。这个结果比单纯用LBP-TOP加SVM的基线(准确率约49%)高了十多个百分点,但距离综述里一些被放大后的结果仍有差距,主要原因是被试间验证确实难得多。
6.2 实验中几个值得记录的观察
首先,运动放大对结果的影响非常显著。我不做放大时,准确率直接掉到55%左右;放大倍数从3提升到5时,准确率有小幅上升,但噪声明显增加。我认为3到4倍是一个相对合适的区间,具体还要结合数据集来判断。
其次,光流的计算方式会直接影响特征质量。我用Farneback稠密光流时发现,视频背景的轻微抖动在放大之后会被光流算法捕捉成“面部运动”,这导致部分样本的特征被污染。后来我在计算光流之前,对所有帧做了时间维度的均值减除,相当于做了一个简单的时间高通滤波,背景抖动的干扰就小多了。这个预处理操作极其简单,但效果立竿见影。
最后,类别加权损失虽然提升了UAR,但代价是整体的top-1准确率略有下降。这是因为模型不再一味迁就多数类,而会更多地去尝试识别少数类样本,必然会在容易判对的多数类上付出一些牺牲。在实际应用场景中,这两种指标哪个更重要取决于具体需求:如果只是做情绪状态的粗筛,准确率更重要;如果希望每个情绪类别都被尽可能召回,UAR更重要。具体要根据业务目标来取舍。
提示:记录实验时要养成把数据预处理、增强方式、损失函数、验证策略全部写清楚的好习惯。我见过太多论文只写模型结构,让人复现时无从下手。
7. 常见问题速查表与个人经验
7.1 常见问题与解决办法
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| 训练损失下降但验证损失上升 | 模型过拟合,数据集太小 | 增加Dropout、缩小模型容量、使用预训练微调、做时间维数据增强 |
| 准确率很高但UAR很低 | 类别不平衡,模型被多数类主导 | 采用类别加权损失、Focal Loss、重采样 |
| 运动放大后噪声明显 | 放大倍数太高或光照变化大 | 降低放大倍数,增加时间高通滤波,对图像做平滑 |
| 跨被试验证性能崩塌 | 被试差异大,模型学到了身份特征而非表情特征 | 使用身份归一化、跨数据集预训练、限制模型对全局外观的依赖 |
| 测试集上偶发严重误判 | 微表情峰值帧选取有误差 | 尝试多帧融合或注意力机制,减少对单帧的依赖 |
这个表是我在多次实验迭代中慢慢沉淀下来的。遇到问题时先对照排查,大部分性能问题都能归因到表格里的几个类别。
7.2 关于“小白友好”的一些实操建议
如果你刚接触微表情识别,我建议先做三件事。第一,把CASME II数据集下载下来,不要急着跑模型,先可视化几个样本,看微表情和普通表情在帧序列上的差异,建立直观感受。第二,复现LBP-TOP加SVM的基线,跑通整个流程,理解数据格式和评估代码。第三,在基线上尝试一项修改,比如加入运动放大或者换成深度特征,对比性能变化。这三个步骤做完,你对这个领域的核心痛点就会有真正的体感,而不是停留在论文摘要的结论里。
另外提醒一点:微表情识别领域论文复现时,代码和数据集的版本差异会带来很大的结果波动。比如不同版本的人脸对齐库、光流计算库,都会对最终数字产生可观察到的影响。遇到复现结果和论文不一致时,先别急着怀疑模型,先检查预处理细节和验证划分方式是否完全一致。
8. 读综述笔记时我会怎么做
回到“论文笔记”这件事本身。很多人读综述喜欢从头到尾顺着读,读完就完了,合上书什么也没留下。我自己的方法是带着问题去读:这篇综述把问题框架分成了哪些环节?每个环节有哪些代表性方法?这些方法之间的演进逻辑是什么?哪些地方被反复强调但一直没有被很好解决?然后把答案用自己的话写下来,配合对数据集的统计和方法的表格整理,形成一份可以随时查阅的笔记。这篇“微表情识别综述1”就是我沿着这个思路产出的第一篇笔记。
做笔记时我有一个小技巧:每读完一个章节,就把这一章的核心问题用一句话写在本子顶部,然后合上原文,尝试默写出这个问题的答案。如果能写清楚,说明真的理解了;如果写不清楚,就再回头读一遍。这个方法虽然简单,但比反复划线有效得多。微表情识别综述的信息密度很高,如果只是“读过”而不“产出”,过一个月基本就等于没读。我也会把综述中提到的经典方法和基线整理成表格,方便后续做实验时快速查阅。这篇笔记只覆盖了综述的前半部分,后面如果继续精读,我还会写“微表情识别综述2”,重点展开深度学习方法、微表情检测和跨数据集泛化这几个更深入的环节。到时候我踩过的新坑,也会继续补充进来。