ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

微表情识别综述精读:从经典基线到深度学习的完整技术笔记

微表情识别综述精读:从经典基线到深度学习的完整技术笔记 最近把微表情识别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的熟练程度。综述里特别提到数据集的标注一致性比如Cohens Kappa系数直接影响后续所有实验的可比性。这也就是说很多时候模型性能的差异可能有一半是标注噪声带来的。2. 微表情识别的完整流程与设计思路2.1 四步走的基本架构综述里把微表情识别系统拆成了四个标准模块人脸检测与对齐、运动放大、时空特征提取、分类器学习。这个架构在过去的十多年里基本没变过变的只是每个模块内部的具体技术。人脸检测与对齐是第一步目的是把视频帧中的人脸区域裁剪出来并做几何归一化保证同一个被试的不同帧、不同被试之间的人脸位置和尺度一致。这一步听起来简单但在微表情场景下有个特殊要求因为后续要做帧间的运动分析和特征对比人脸对齐的精度直接决定了运动信号的质量。如果对齐不准确哪怕只是几个像素的偏移都会被运动放大模块放大成虚假的“表情”。我在实验中就吃过这个亏最初用的是普通表情识别里的轻量级人脸检测器结果放大后的图像边缘出现大量伪影后来换成基于人脸关键点做仿射变换的严格对齐问题才缓解。运动放大是微表情识别里非常关键的一步。常见做法是使用欧拉视频放大Eulerian Video Magnification或者其改进版本把人脸视频分解成不同的时空频带对感兴趣的频带做放大后再重建。放大的倍率不能盲目调高太高会突出噪声太低又提不到有效运动。综述里给出的参考区间是2到5倍具体要根据数据集的采集环境和分辨来调。这个环节做得好不好直接影响后续特征提取的输入质量可以说是整个流程里性价比最高的一步。2.2 特征提取与分类的两条路线在特征提取和分类环节综述把过去的工作按技术路线分成了两大阵营。第一个阵营是手工特征加传统分类器。这属于微表情识别的经典范式代表性方法包括局部二值模式在三正交平面上的扩展LBP-TOP、方向梯度直方图HOG的时空版本、光流特征等。这类方法的好处是计算开销小、可解释性强对数据量的要求也比较低。直到今天LBP-TOP仍然是一个很难被彻底打败的基线。但它的缺点也很明显手工设计的特征很难覆盖微表情所有可能的运动模式特征表达能力有上限。第二个阵营是深度学习方法。早期直接套用普通表情识别的卷积神经网络结构把视频帧堆叠成多通道输入或者用三维卷积提取时空特征。近几年的工作逐渐精细化出现了基于光流图的双流网络、基于注意力机制的局部区域增强、基于动作单元的引导网络以及一些尝试用Transformer建模帧间依赖的架构。深度学习的优势在于特征是端到端学出来的上限更高劣势则是前面提到的对数据量极度敏感在几百个样本上训练一个深度模型稍有不慎就是严重过拟合。所以现在很多论文都采用预训练加微调、数据增强、跨数据集验证等策略来弥补数据不足。我在实际项目中采用过一个折中方案先用光流法提取微表情视频中运动最显著的区域再把这些区域对应的原始帧送入一个相对浅层的三维卷积网络。这个方案的好处是既保留了深度模型的特征学习能力又通过光流先验降低了模型需要学习的空间范围在CASME II上的效果比我直接端到端训练一个深网络要好。3. 核心数据集与评价标准细节3.1 主流公开数据集速览读综述时最重要的收获之一就是把主流数据集的基本情况梳理清楚。我整理了一个表格方便后续比对。数据集样本量帧率分辨率类别特点CASME19560fps640x4807类情绪基于AUs标注自发微表情CASME II247200fps640x4807类情绪分辨率较高标注精细广泛使用SAMM159200fps2040x10887类情绪被试种族多样难度更高SMIC164100fps640x4803类正/负/惊包含可见光、近红外、高速三个子集MMEW300100fps高分辨率多类更接近真实场景的诱发方式这里有个需要特别注意的点虽然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.001batch 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”重点展开深度学习方法、微表情检测和跨数据集泛化这几个更深入的环节。到时候我踩过的新坑也会继续补充进来。
返回列表