
做了几年人脸相关的算法我最大的感受是AU检测这个任务看着简单做起来是真磨人。你给一张人脸图要判断AU1眉毛内侧上提、AU4眉毛下压、AU12嘴角上拉这些动作单元到底激活了没有标注贵、样本少、类内差异还大。我身边不少同事一上来就直接堆分类模型结果平均F1卡在及格线附近上不去然后就开始怀疑人生。后来我认真读了一篇FG 2018的论文《Deep Adaptive Attention for Joint Facial Action Unit Detection and Face Alignment》才慢慢想明白一件事AU检测不该当成一个独立分类任务硬做它和Face Alignment人脸关键点对齐本来就是天生一对。这篇论文的核心是把人脸关键点对齐和AU检测放进同一个框架里联合训练再用一个Deep Adaptive Attention机制让网络自己找到每个AU最该看的区域。如果你是做人脸表情识别、AU检测、人脸关键点方向的工程师或研究生这篇论文值得细读。它发布得比较早但里面很多设计思路放到现在依然不过时尤其是“弱监督注意力多任务联合优化”这套组合拳后来不少工作都能看到它的影子。这篇文章我不会只复述论文而是把它拆成几个关键问题为什么要联合注意力机制到底在干什么训练和复现时有哪些容易踩的坑以及读完之后我对AU检测这件事的新理解。1. 这件事的起点AU检测为什么天然需要“对齐”帮一把很多人刚接触AU检测时会有一个困惑不就是个多标签分类问题吗输入一张人脸图输出十几个动作单元是否激活网络建模能力够了不就行了实际做下来会发现远没那么简单。AU检测的难点不只是“分类任务难”而是这个任务的数据和定义本身就带着一堆麻烦。1.1 AU检测到底难在哪第一个难点是AU的视觉表现非常细微。AU定义来自FACS面部动作编码系统描述的是特定肌肉运动带来的外观变化。比如AU6是脸颊上提表现是眼轮匝肌收缩、眼睑变窄、颧骨下方皮肤隆起但这些变化幅度可能只有几个像素光照稍微一变视觉差异就被背景噪声吞掉了。第二个难点是AU之间高度相关。人做表情时往往是多个AU一起动比如开心时的AU12嘴角上拉经常伴随AU6脸颊上提网络很容易把AU12的激活特征错误当成AU6的激活证据产生特征混叠。第三个难点是标注本身非常昂贵。FACS编码需要经过专业训练的人一帧一帧地标注普通人标不不了专业编码员也费时间所以公开数据集的规模普遍偏小BP4D和DISFA已经是这个领域用得最多的了规模也就几十个受试者、十几万帧。样本一少模型就特别容易过拟合到受试者的身份特征上而不是学到真正的AU模式。再加上正负样本比例天然失衡很多AU在数据里出现的概率连20%都不到模型直接学成“全部预测为未激活”也能拿到不错的准确率但对AU检测毫无意义。第二个难点是AU的视觉表现非常细微。AU定义来自FACS描述的是特定肌肉运动带来的外观变化。比如AU6是脸颊上提表现是眼轮匝肌收缩、眼睑变窄、颧骨下方皮肤隆起但这些变化幅度可能只有几个像素光照稍微一变视觉差异就被背景噪声吞掉了。再加上正负样本比例天然失衡很多AU在数据里出现的概率连20%都不到模型直接学成“全部预测为未激活”也能拿到不错的准确率但对AU检测毫无意义。1.2 对齐和AU检测为什么是天生一对这里要先理解一个解剖学层面的关系AU的定义不是凭空来的它对应着具体的肌肉运动。比如AU1是额肌内侧收缩牵动眉毛内侧上提AU4是皱眉肌和降眉肌收缩把眉毛往下压。这些肌肉附着点和人脸关键点landmark的位置高度重合。换句话说关键点本身就在表征人脸解剖结构的几何位置而AU是在描述这些结构附近的肌肉运动状态两者讲的其实是同一块物理区域的事。这种耦合关系在数据上有一个很直观的体现AU12激活时嘴角关键点的位置会明显向外上方偏移AU4激活时眉毛内角区域的关键点位置会往下沉。所以只要关键点定位准了AU的几何先验就有了。反过来AU的激活状态也能帮助关键点定位因为AU激活意味着某个区域的肌肉收缩会带来关键点的可预测位移。你把这两个任务放在一起训练等于让AU分类借助关键点提供的位置信息让关键点回归借助AU标签提供语义级的形变先验。这种双向信息流是单独训练任何一个任务都给不了的。1.3 之前的方案有哪些不够顺手的地方在深度学习方法普及之前主流做法是级联式pipeline先做人脸检测再用SDM或ERT这类方法做关键点对齐然后根据关键点切出眼睛、眉毛、嘴巴周围的小图块手工设计LBP或SIFT特征最后接一个SVM或随机森林做AU分类。这套流程的问题在于误差级联上游对齐一旦偏了几个像素下游所有图块的特征全部被污染而且每一步的优化目标互不相关没法全局调整。进入深度学习时代之后很多工作先用预训练CNN提取整张人脸的表征再在某个中间层手动画ROI池化只取眼睛区域、嘴巴区域对应的feature map做AU分类。这种方式比手工特征强不少但ROI的位置和大小是人定的一旦人脸姿态变化、脸型差异大固定ROI就很不准。还有些工作尝试把对齐和AU检测放在一个多任务网络里但两个分支只是共享一个骨干缺少显式的空间对应关系建模AU分类分支仍然不知道“我该重点看哪里”。这篇论文要解决的就是这个问题让AU特征提取的区域能够根据当前人脸形状动态调整同时让整个系统端到端联合优化。2. Deep Adaptive Attention这个注意力到底在干什么论文的核心创新是Deep Adaptive Attention我理解它的本质是“不依赖AU区域标注从分类标签中弱监督地学习每个AU对应的空间注意力”。要搞懂它得先把整体框架拆开看。2.1 整体架构一条特征干线两个并行分支整个网络可以分成四块。第一块是骨干网络论文用的是VGG-Face的卷积部分输入是检测并对齐后的人脸图输出一组feature map空间分辨率大约是输入图的1/8或1/16通道数是512。这块骨干的作用是把原始像素转成高层语义特征后面所有分支都在这组特征上继续做计算。第二块是关键点回归分支。它从骨干特征出发通过几层卷积加反卷积输出一组关键点热图heatmap每个关键点对应一张空间概率图峰值位置就是关键点坐标。这里用了68点方案。第三块是自适应注意力模块它接收骨干特征和关键点热图为每个AU生成一张空间注意力图表示“判断这个AU时feature map上哪些位置更重要”。第四块是AU分类分支把空间注意力图与骨干特征逐通道加权实际是HxW维度的空间加权聚合成一个与通道数等长的向量再通过全连接层做二分类判断每个AU是否激活。训练时的损失函数由两部分组成关键点热图的回归损失通常是预测热图与高斯标签之间的MSE或者L2距离以及AU多标签分类的加权交叉熵损失。两个loss联合反传整个网络端到端更新。2.2 关键点分支为什么用热图而不是直接回归坐标这里有一个值得展开的设计细节关键点回归分支为什么不直接输出68个(x, y)坐标而是输出68张热图直接回归坐标在实现上更简单不少对齐网络也是这么做的但放到这个框架里就不太合适。首先热图保留了空间分布信息。坐标是一组稀疏的点热图则是一张空间连续的概率分布峰值周围有高斯状的响应区域。对于后续的注意力模块来说它需要的是“关键点大致在哪个区域”而不是精确到像素的一个点热图的平滑响应正好可以作为空间先验。其次热图的监督信号更丰富。回归68个坐标相当于只有68个监督点而回归68张热图相当于在feature map的每个空间位置上都提供了监督信号网络训练更稳定。第三从工程角度看热图天然是HxW的二维结构和feature map尺寸一致方便直接做逐元素相乘或相加不需要额外的索引、采样操作整个网络可以保持全卷积结构梯度反传也顺畅。2.3 自适应注意力的“自适应”体现在哪如果只看名字容易误解Deep Adaptive Attention不是那种给feature map乘一个可学习向量的通道注意力而是在空间维度上、针对每个AU独立生成一张注意力图。它和两种baseline的区别能说明问题。第一种是固定ROI。你预先定义眼睛区域、嘴巴区域然后在这些区域上做池化。这个方案完全静态人脸形变、姿态变化、不同人的脸型差异都会让ROI失准。第二种是简单的关键点邻域。你根据关键点位置在关键点周围取固定半径的圆形区域作为AU特征区。这个方案虽然跟随人脸形状但每个AU真正需要的区域并不一定是某个关键点的圆形邻域可能是多个关键点之间的一片区域也可能是比固定半径大得多或小得多的区域。Deep Adaptive Attention的做法是让注意力模块以骨干特征和关键点热图为输入通过卷积层来预测每个AU的注意力图。训练过程中没有“AU出现在图像哪个位置”这种区域级标注网络只能根据AU分类loss的回传来调整注意力图的位置、形状和大小。当某个AU激活时分类loss希望特征中能提取到判别性的信号注意力图就会被推着去覆盖那些对判别有帮助的区域当某个AU未激活时模型同样要学会忽略那些容易混淆的区域。所以它的自适应性体现在两个层面一是不同AU有不同的注意力图二是同一个AU在面对不同人脸、不同姿态时注意力图可以动态移动和形变。这种弱监督方式不需要额外的标注成本也避免了手工设计ROI的主观性。2.4 联合优化为什么比“对齐完再做AU”效果好逐级pipeline最大的问题在于目标割裂。单独训练对齐任务时模型只关心关键点位置是否准确单独训练AU分类时模型只关心分类loss是否降低。两者结合时如果把对齐当作预处理、AU当作后处理AU分类的错误没法回传到对齐模块对齐模块也不会为了服务AU分类而调整自己的特征表达。这篇论文让关键点热图参与注意力图的生成再把注意力图作用于AU分类AU分类loss可以直接影响到关键点分支。这意味着关键点分支学到的特征不只是语义位置上准确还会倾向于保留对AU分类更有判别性的信息。反过来关键点分支提供的解剖学先验给attention提供了强烈的位置约束可以有效减少attention漂移到背景或无关区域。两个任务在同一套特征空间里互相校正形成了一种良性竞争和互补。3. 训练细节、实验配置与复现复盘读论文不能只看框架训练和实验的设计往往才是决定效果的关键。这篇论文在数据、评估、训练策略上都有一些讲究我在下面按实际工作流的顺序梳理一遍也穿插一些复现时容易踩的坑。3.1 数据与评估协议BP4D和DISFA怎么用AU检测领域最常用的两个benchmark是BP4D和DISFA。BP4D包含328个受试者的视频包含诱导出的多种情绪状态每帧都做了AU标注标注覆盖12个AU包括出现与否和强度。DISFA规模更小27个受试者约13万帧标注了强度等级。论文里通常选择其中8个AU做评估常见组合是AU1、AU2、AU4、AU6、AU7、AU10、AU12、AU14因为这几个AU在数据集中出现频率相对均衡也是FACS中比较核心的动作单元。评估指标方面AU检测主要看每类的F1 score和平均F1。注意这里用的是按帧计算后的二值F1不是按视频或按序列来算。标注有强度的数据集需要先转成二值标签一般做法是设置阈值比如强度大于0或者大于1就算激活论文和常见benchmark协议里用哪个阈值要仔细核对否则复现结果会差很多。关键点对齐部分通常使用300W数据集做预训练和辅助评估评估指标是NMENormalized Mean Error用人脸尺寸归一化平均关键点误差。3.2 训练过程的几个关键选择骨干网络这块论文用的是VGG-Face它在大规模人脸识别任务上预训练过学到的人脸纹理和结构特征比ImageNet预训练模型更贴合AU检测场景。关键点分支在300W这类对齐数据集上先做一轮预训练是有必要的因为AU数据集本身就小如果从头学关键点回归很难学出稳定的几何先验。我的建议是先固定骨干只训练关键点分支等到关键点热图输出比较干净了再放开整个网络做联合训练。损失函数方面AU分类使用加权的二分类交叉熵。权重设置很关键一般根据训练集每个AU的正样本比例来定正样本少的AU权重要调高。关键点热图的回归loss用一个L2或MSE loss对热图生成的高斯标签回归。优化器用Adam比较多初始学习率在1e-4到1e-5之间批次大小根据显存来一般16到32。数据增强方面水平翻转、小角度旋转、随机裁剪和色彩抖动都可以做但要注意翻转时AU标签的左右对称性要同步处理。3.3 复现时最常遇到的几个坑我按自己实践和跟同行交流的经验把容易出问题的地方列成了一张速查表。常见问题现象排查思路AU全部预测为未激活准确率高但各AU F1极低检查正负样本比例调大正样本权重用F1做早停而不是用loss或accuracy关键点热图发散、糊成一片注意力区域漂移AU特征混乱检查热图高斯半径是否过大降低AU分类loss的权重先稳住关键点分支不同AU的注意力图几乎相同特征混叠AU分类相互干扰增加attention模块的容量检查骨干特征是否被共享得过狠给attention加一点空间熵正则训练集F1很高验证集掉得厉害模型记住了受试者身份或背景确认数据集是按受试者划分的增加数据增强、dropout避免视频相邻帧进同一个batchattention区域跑到脸外或背景AU分类学到了非判别性特征用关键点热图对attention做约束比如乘上一个人脸掩膜或对attention加上稀疏性约束先说最影响结果的一点预处理。很多人直接在原始视频帧上跑网络效果自然不行。标准做法是先用MTCNN或类似检测器把人脸框检测出来再缩放到统一尺寸比如224x224。如果检测框上下偏移几个像素AU注意力区域就会被带偏所以检测到人脸后最好再用关键点做一次相似变换把眼睛位置对齐到固定坐标。这一步的精度直接影响后面所有分支的上限。然后是训练阶段划分。论文的整个框架虽然端到端但训练时一口气全量更新很容易把关键点分支带崩。AU分类loss对关键点分支的梯度会要求关键点特征尽量靠近AU分类需要的方向如果没有前期预训练形成的稳定热图先验关键点预测就会在训练早期出现抖动甚至发散。我建议的训练顺序是先在300W上预训练关键点分支再在BP4D或DISFA上同时训练AU分类和注意力模块关键点分支用小学习率微调。还有一个很容易被忽略的细节是数据划分。BP4D和DISFA是视频数据同一受试者的相邻帧高度相似如果不做按受试者划分的训练/测试集而是随机按帧划分模型会在验证集上“记住”受试者身份F1虚高得离谱。往届不少论文的结果差异部分原因就出在这个评估协议不严谨上。复现的时候一定要确认好数据划分方式通常做法是训练集和测试集受试者完全互斥。3.4 实验结果怎么看才有意义看这篇论文的实验表格时不要只盯着平均F1涨了多少要关注三个维度。第一是每个AU的F1变化不同AU的提升幅度差异很大。通常AU12这些区域较大、纹理变化明显的AU提升空间有限而AU7眼睑收紧这种区域小、依赖精细纹理的AUjoint框架带来的增益会更明显。第二是比较“仅用关键点先验”和“完整自适应attention”的差距这能看出attention模块是否真正在起作用而不是只靠多任务正则。第三是看attention可视化结果图论文展示出来的可视化attention map能直观判断网络把注意力放在了哪些区域如果大部分AU的attention合理地落在对应肌肉位置说明弱监督学习是成功的。4. 读完之后我对AU检测这件事的一些想法论文读一遍有一遍的收获尤其是把它放回AU检测技术的发展脉络里能看到很多值得玩味的点。4.1 这篇论文在技术演进里的位置在Deep Adaptive Attention之前AU检测的区域特征更多依赖手工定义ROI。这篇论文的意义在于把“AU特征该从哪里提取”这件事变成了可学习的、端到端优化的问题而且通过弱监督方式绕开了区域标注的瓶颈。后来的JAA-Net、基于图结构建模AU关系的GCN方法、基于区域学习和关系建模的多分支方案都能看到这套思路的影子用关键点或者对齐信息提供几何先验用可学习机制动态聚合局部特征。所以把这篇当成AU检测领域从“固定区域”走向“可学习区域”的一个节点来读理解会更立体。4.2 方法设计的成功和局限成功的地方很清楚它对区域标注的需求为零数据要求低对齐和AU检测彼此借力形成了结构上的正反馈热图作为中间表示让空间信息在任务间传递得干净自然。局限也很明显。第一注意力图是弱监督学出来的它的可解释性有限。有些AU的attention不一定落在解剖学对应的肌肉区域而可能落在网络认为“容易分类”的人脸纹理区域这在badcase分析时会误导人。第二端到端联合训练虽然漂亮但也带来训练不稳定、调参成本高的问题。关键点分支和AU分类分支的loss权重、训练阶段怎么切换都需要在验证集上仔细调否则复现结果波动很大。第三论文在8个AU上的提升幅度并不大很多AU的F1依然在60%上下徘徊。这说明AU检测的天花板更多被数据质量和标注噪声卡住了模型结构只能在有限范围内改善性能。4.3 对实际业务的启发如果手头要做一个AU检测或表情分析的系统这篇论文能带来的直接启发至少有三条。第一条AU检测别只盯着分类网络对齐信息是成本很低的强先验哪怕不联合训练用对齐结果做局部特征增强也能带来稳定的F1提升。第二条弱监督注意力的思路可以迁移到其他细粒度识别任务上比如人脸属性识别、野生动物个体识别、工业缺陷检测这类场景同样面临“特征区域位置不固定、没有区域标注”的问题。第三条多任务联合优化的收益和成本要权衡联合训练不等于堆多几个分支就能涨点需要设计合理的中间表征像热图这样把任务耦合起来如果只是共享骨干、各出各的loss提升往往非常有限。说实话这篇论文我最初只扫了摘要感觉平平无奇。后来自己在BP4D上搭基线、踩数据坑、调训练流程才意识到它把两个任务拉到一起的巧妙程度远比摘要里写的要深。Deep Adaptive Attention这个命名也很准确它不是简单加权而是一套让网络自己决定“每个AU长什么样、该看哪里”的机制。如果你也想复现我的建议是先拿预训练好的VGG-Face跑通关键点热图分支再把attention模块和AU分类分支一层层叠上去每一步都用可视化确认当前模块学到的内容是否符合预期。这个过程会让你踩不少坑但每一步反馈都很直观。AU检测这条路上标注、评测、长尾分布都还远未到成熟但至少这篇论文给了一个值得反复琢磨的起点。