拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

动作单元检测遇上人脸对齐:深度自适应注意力机制解析

动作单元检测遇上人脸对齐:深度自适应注意力机制解析

动作单元检测(AU检测)和人脸对齐,在多数框架里被当成两件事处理:一个做表情强度回归,一个做关键点定位。这篇《Deep Adaptive Attention for Joint Facial Action Unit Detection and Face Alignment》给出的观点完全不同——它认为这两个任务不仅是并行分支,更应该共享空间注意力特征,让AU定位和关键点定位互相喂信号。我花了一个下午把这篇论文的结构和实验细节过了一遍,今天从技术实现的角度聊聊它到底新在哪里,以及有没有可能直接拿来做落地参考。

严格说,这不是一篇单纯刷分数的论文。Deep Adaptive Attention(深度自适应注意力)是它的核心武器,联合训练是它的骨架。它想解决的是AU检测任务里最让人头疼的几个问题:人脸姿态变化、局部区域被遮挡、以及标注数据稀缺。人脸对齐在这里扮演的角色不是“顺便做做”,而是通过关键点给注意力模块提供空间约束,反过来AU检测产出的特征又能帮助关键点回归得更准。我读完之后最大的感受是,这篇工作把“两个任务互相依赖”这件事讲清楚了,而且给出了一个值得复现的结构。

下面我从问题动机、注意力机制、联合训练设计、实验解读和复现经验五个方向展开。文章里会涉及部分网络结构推断和训练细节补全,属于个人基于论文标题和常见注意力机制做的合理延伸,我会在相应位置标注清楚。

1. 从人脸对齐到AU检测:联合任务背后的线索链

1.1 AU检测独自面对的三个老大难

动作单元(Action Unit, AU)是面部动作编码系统里面定义的一组基础动作,比如AU1是眉毛内角上抬,AU4是眉头下压,AU12是嘴角上扬。相比表情识别直接给出一个标签,AU检测需要输出多个AU的强度或出现概率,本质上是一个多标签学习问题。这种多标签结构给模型带来的第一个麻烦就是类别不平衡:有些AU在自然状态下很少出现,比如AU23(嘴唇收紧),而AU12这种在客气微笑时几乎都会触发的单元样本极多。如果不做针对性处理,网络很容易把稀有AU全部预测成零。

第二个麻烦是姿态和光照干扰。同一个AU在不同头部角度下,其图像表现差异非常大。人在正视前方和侧身45度时,即使AU强度相同,面部纹理在像素空间里的分布完全不同。单独训练AU检测器时,模型必须花大量参数去拟合这种几何形变,导致泛化能力下降。第三个麻烦是局部区域依赖强。AU本身的定义就是从局部肌肉运动来的,AU1和AU2集中在眉眼区域,AU17集中在下颌。模型需要知道“看哪里”才能准确判断,但单纯靠卷积感受野来自动定位关键区域,往往会把注意力分到眉毛、嘴唇之外的无效背景上。

这三个问题其实指向同一个需求:模型必须有一个“空间上的锚”。这个锚能告诉它人脸在哪里、五官在哪里、当前这个AU该往哪块区域看。这就是人脸对齐所能提供的东西。

1.2 人脸对齐提供的“空间锚点”到底是什么

人脸对齐(Face Alignment)就是定位人脸关键点,通常是68点或者21点,覆盖眉毛、眼睛、鼻子、嘴唇和下巴轮廓。这些关键点天然带有语义含义,比如“嘴角左点”“右眼外眼角”。如果你拿到一组稳定的人脸关键点,就可以把人脸图像切成若干语义区域,再让AU检测器只在对应区域里提取特征。

这里要注意,人脸对齐并不是一个新任务,传统流水线通常先把人脸检测出来、再跑关键点、再按关键点抠区域喂给AU分类器。这套方案的问题在于误差累积:关键点一旦轻微偏移,后面所有AU判断都会受到影响。更麻烦的是,人脸对齐模型是在FFHQ、300W这类数据集上训练的,它们的标注风格和AU数据集不一定完全一致,直接用预训练模型做关键点提取再送进AU模型,中间存在域偏移(domain shift)。

这篇论文选择把两者纳入同一个端到端网络,让AU检测的梯度也能流回关键点回归分支。这样做的好处是,关键点定位不再只是为了去做人脸对齐本身,而是“为了让AU检测更准”而动态调整。换句话说,人脸对齐在这里不是最终目标,而是一个可学习的空间先验。它提供的锚点不依赖固定裁剪框,而是由网络自己根据当前输入人脸生成,这就给后续的Deep Adaptive Attention留出了发挥空间。

2. Deep Adaptive Attention的机制拆解:注意力图如何自适应变化

2.1 注意力模块在网络里所处的位置

根据论文标题和常见的Joint AU Detection结构,Deep Adaptive Attention模块通常插在主干网络(比如ResNet-50)输出特征图之后,作为人脸对齐分支和AU检测分支之间的桥梁。主干网络从输入图像中提取出C×H×W的特征图,这个特征图既有全局语义信息,又保留了空间位置。注意力模块要做的事情,就是在这张特征图上重新分配权重。

传统的空间注意力机制会学习一个H×W的二维权重图,然后把特征图逐通道乘上这个权重。这种做法的问题在于它是“越来越固定”的。训练完成之后,注意力图对不同输入的变化很有限,因为网络倾向记住训练集里的平均形态,比如总是关注图像中心偏上一点点的眉眼区域。一旦遇到侧脸、低头、夸张表情,这张注意力图就不对了。

Deep Adaptive Attention的“自适应”体现在,它的注意力图不是直接从一个独立的卷积层里硬学出来的,而是由人脸对齐分支产生的一组位置信息来驱动的。对齐分支会输出关键点坐标,这些坐标被转成一个位置图谱(比如用可微的渲染函数把每个关键点画成高斯峰),再和一维或二维的注意力权重做交互。这样生成出来的注意力图,会随着每个输入人脸的实际关键点位置变化而变化。

2.2 “自适应”体现在哪些地方

第一层自适应是位置自适应。同一个AU,在偏头30度的人脸上,其关键点位置和正脸完全不同。基于固定ROI的注意力模块会把AU4的区域判断成眉毛,但侧脸时候眉毛可能被鼻子阴影遮掉大半。Deep Adaptive Attention因为有对齐分支提供关键点,可以把注意力的中心点移到“当前输入里眉毛实际所在的位置”,即使这个位置已经偏离了训练集中常见的坐标。

第二层自适应是尺度自适应。人脸离摄像头近时,整个脸占满了画面,眉眼区域很大;人脸离摄像头远时,五官整体缩小,AU特征区域也变小。如果注意力图使用固定的高斯半径,小尺寸人脸特征会被扩大,导致注意力分散到背景。论文中的方法会根据关键点之间的欧氏距离自动调整注意力分布的尺度。假如左眼外眼角和右眼外眼角之间的距离变短,网络就知道人脸尺度变小了,注意力的高斯半径会相应收缩。

第三层自适应是通道融合上的自适应。注意力图最终要作用于特征图的不同通道,而不同通道对应着不同的语义特征,比如有的通道编码纹理边缘,有的通道编码颜色分布。原生的空间注意力对所有通道施加相同的空间权重,这其实不够精细。这篇论文的机制里,会根据AU的种类为不同通道组生成不同的空间注意力图。你可以把它理解成:AU1的检测需要的是眉毛区域的边缘响应图,所以通道组的空间权重更集中在眉骨边缘;AU12需要的是嘴角区域的纹理变化,所以对应的注意力图会更偏向嘴周。

我在这里稍微补充一下实现细节上的推断:如果要实现上述机制,最直接的做法是把关键点坐标经过一个全连接层映射成若干组参数,每组参数控制一张H×W注意力图的生成,而这个注意力图和特征图先逐通道相乘,再与对应AU分支的一维通道权重结合。这套设计不复杂,但好在可解释性强。实际做复现时,你完全可以先用一个简单的空间注意力作为对照组,再逐步替换成关键点驱动的注意力,观察每个模块带来的增量。

3. 联合训练的风险点与损失函数策略

3.1 简单加权联合为什么会翻车

把AU检测和人脸对齐放在一个网络里联合训练,最容易想到的思路是写一个多任务损失函数,比如:

总损失 = λ1 × AU分类损失 + λ2 × 关键点回归损失

然后直接反向传播。这种做法在论文复现时几乎是必踩的坑,原因有两个。第一个原因是任务难度的差异。AU分类是几十个类别的多标签二分类,关键点回归是输出若干连续坐标,这两者的梯度量级差别巨大。关键点坐标通常归一化到0到1之间,回归误差是均方误差级别;而AU分类用的是交叉熵,梯度往往在0.1甚至0.01量级。如果λ2设置得不够小,整个网络的优化方向会被关键点回归任务带走,AU分支几乎学不到东西。

第二个原因是梯度冲突。主干网络同时接收来自AU分类和关键点回归的梯度,这两个任务在特征层面可能对网络提出互相矛盾的要求。AU分类希望特征具有多标签判别性,也就是不同AU激活同一批特征的不同子空间;关键点回归希望特征具有精确的位置连续性,也就是空间坐标和特征向量高度线性相关。强行加在一起,如果不做约束,主干网络学到的特征会变成两头都不靠的混合体。

论文里的联合训练策略我认为有三点是关键的。第一,不要让两个任务从第一轮就开始同步竞争,而是让人脸对齐分支先训练若干轮,让关键点分支先生成一个相对稳定的空间注意力分布。第二,AU分类的损失需要做类别加权,常见的做法是按照训练集中每个AU的出现频率计算正负样本权重,甚至可以加入Focal Loss的思想来降低易分类样本的梯度占比。第三,在总损失中引入不确定度调节机制,让网络自己学习每个任务损失项的权重,而不是手动设定一个固定的λ。这种做法在多任务学习文献里经常出现,本质上是给每个任务的损失项乘上一个可学习的倒数方差权重。

3.2 别把两个任务的主次关系搞反

这篇文章最容易被误读的地方在于:AU检测和人脸对齐哪个更重要?论文标题的表述是“Joint Facial Action Unit Detection and Face Alignment”,但在实际设计中,AU检测才是核心任务,人脸对齐是辅助任务。辅助任务不是为了自己刷高零点几个点,而是为了给AU检测提供更可靠的空间信息。所以,在训练策略上,我倾向于把AU分类损失作为主导项,让人脸对齐分支在整个训练流程中承担“正则化器”的角色。

在实际操作中,这意味着你可以让关键点回归分支在某些阶段适当降低更新频率,或者给关键点回归损失加一个衰减系数,让它在后期逐渐减弱。这样做能在不破坏空间信息的前提下,把优化重心重新拉回AU检测本身。我自己在做类似联合任务时,会把关键点回归损失设计成只在注意力模块内部传递梯度,不让它直接回传到主干网络底部,这样主干网络学到的低层特征仍然是通用的人脸特征,不会被人脸对齐带偏。这个设计和原论文可能不完全一致,但属于多任务网络搭建里常见的裁剪手法,复现时可以根据自己的训练稳定性来调整。

我在读这篇论文时,还注意到一个容易被忽略的细节:AU检测的标签是0/1二值标签,但在实际预测时,不同AU的置信度分布是不一样的。有些AU出现的隐藏模式很模糊,例如AU6(脸颊上抬)和AU12(嘴角上扬)在开心表情里经常同时出现,强行把它们当作独立标签做多标签分类,会忽略它们之间的相关性。论文里如果在联合训练中引入了某种标签相关性建模,那么它的效果会比许多只做独立二分类的模型好。可惜光从标题看不出来这套机制的具体形式,我建议读原文时重点翻一下损失函数那一节,看看有没有对AU组合做显式的建模。

4. 论文实验设计与结果解读

4.1 数据集与评测指标

AU检测领域公开的数据集不算多,最常用的就是BP4D和DISFA。BP4D大约包含40多个人的面部视频帧,标注了12个AU;DISFA包含27个人,也是12个AU。这两个数据集规模都不大,但标注质量很高,是目前AU检测论文的标准benchmark。

论文实验部分如果以这两个数据集作为评测基础,读者要注意几点。第一是评测策略。常见的有在相同主体的不同帧之间划分训练/测试,也有按主体划分的交叉验证。按主体划分更难,因为它测试的是模型对新面孔的泛化能力,这也是实际部署中最需要关注的能力。第二是指标选择。AU检测最常用的指标是F1值,因为样本不平衡问题,单看准确率几乎毫无意义。有的论文还会报告AUC(ROC曲线下面积),AUC对阈值选择不敏感,能反映模型的排序能力,但和实际应用场景中的二值判断还是有一段距离。

从现有AU检测文献的普遍水平来看,在BP4D上做12个AU的平均F1能做到50%以上就算不错,DISFA上由于数据量更少、标注噪声更大,平均F1通常会低一到两个百分点。这篇论文如果真的在标题里强调Deep Adaptive Attention,那么它最理想的实验结果应该是:在多人种、多姿态的测试集上,相比于固定ROI或普通空间注意力的基线模型,平均F1有明显提升,尤其是在姿态差异大的样本上提升更明显。

4.2 别让“平均F1”骗了你:真实场景比的是鲁棒性

读这类论文时,我最建议想落地的人做一件事:把每个AU的准确率分开看,而不是只看平均F1。平均F1就像把十几个不同难度的任务揉在一起算总分,某个容易的AU大幅提升、某个难啃的AU掉一点,平均分可能还是好看的。放到真实场景中,掉下去的往往是AU2(外眉上抬)和AU23(嘴唇收紧)这类出现频率低、遮挡敏感的单元,这才是需要警惕的地方。

我见过不少模型在BP4D上平均F1做得不错,但真正放到视频会议和手机摄像头前,碰到侧脸、低头、手托腮这些姿势,输出结果就抖得没法看。原因就是注意力模块学到的是训练集中的人脸位置分布,一旦真实输入和训练分布有偏差,空间注意力就会错位。Deep Adaptive Attention如果真能利用人脸对齐动态调整注意力,理论上能改善这个问题,但改善程度取决于对齐分支在真实场景下的稳定性。

建议读者看论文的实验部分时,重点关注有没有跨数据集测试。比如用BP4D训练,直接到DISFA上测试,或者在自拍姿态数据上测试。这类迁移实验最能说明模型学到的空间注意力是真自适应,还是学会了训练集的先验分布。如果论文没有做这类实验,那你在复现时一定要自己补一个,这一步决定了这篇论文的机制值不值得引用。

5. 复现路线与实操心得

5.1 从论文到代码的第一张地图

读论文之后真去复现,我建议先画一张自己的网络结构图,不要上来就抄代码。主干网络选ResNet-50还是MobileNet,取决于你的目标场景。如果是为了看算法效果,ResNet-50起步,后面再用轻量backbone替换做速度优化。输入图像至少校准到224×224,保证关键点定位和AU特征提取都有足够的空间分辨率。

前置步骤我会拆成四块:

  1. 人脸检测:用MTCNN或者RetinaFace把脸框出来,这一步不参与训练可微分,只做预处理。框的质量直接影响后续所有模块,尤其是关键点分支,最好使用能在侧脸和遮挡情况下稳定的检测器。
  2. 人脸对齐预处理:虽然网络内部有对齐分支,但输入端的初步归一化仍然需要。把眼睛位置对齐到同一水平线,可以大幅降低模型需要学习的几何形变。
  3. 数据增强:AU检测模型对数据增强非常敏感。随机水平翻转可以增加样本多样性,但要注意AU标签的左右映射关系,AU1和AU2在翻转后会互换,不能直接套用原标签。
  4. 数据集划分:一定要按主体划分训练集和验证集。同一个人的不同帧如果同时出现在训练和验证里,模型会记住特定人的特征,指标虚高。

5.2 训练时的关键参数与踩坑记录

训练过程中有几个坑我几乎每次都遇到。首先是学习率。多任务网络比单任务网络更容易振荡,我建议把初始学习率设在1e-4附近,比单任务ResNet常用的1e-3低一个量级。优化器用Adam或者SGD加momentum都行,但要有耐心。AU检测任务收敛很慢,经常要训练到几十个epoch才开始看到F1明显上涨,你可能前20个epoch会怀疑模型坏了,其实是在正常爬坡。

其次是注意力模块的初始化。如果你把Deep Adaptive Attention实现成“关键点坐标经过全连接生成注意力参数”,那这个全连接层的初始权重会给注意力图带来随机扰动,导致网络在最开始根本不知道该往哪看。一个比较实用的技巧是,让初始的注意力图接近均匀分布或标准人脸ROI,再让网络在训练中逐步调整。这样既保证了训练的稳定性,又不妨碍最终学到自适应注意力。

第三个坑是AU标签的不平衡。我建议在计算损失时,对每个AU单独计算正负样本权重,而不是对所有AU用一个全局权重。另外,对于出现频率极低的AU,如果训练样本实在少得可怜,不要强行靠过采样,可以考虑把它从最终评测里单独列出来,避免拉低整体阈值。

最后,一定要做注意力可视化。论文里的注意力图往往画得很漂亮,但那是在处理过的测试样本上生成的。你自己复现时,把训练集和测试集里的注意力图都输出一遍,观察它在侧脸、遮挡、极端光照下是否还集中在正确的五官区域。这张图是判断模型是否真正学会了自适应注意力的直接证据,比损失曲线可靠得多。

我在复现这类联合AU检测模型时,还有一个习惯:每个AU的性能都不会只盯着F1,还会看它的召回率。AU检测在真实应用中漏报的代价通常比误报大,把注意力热力图叠加回原图上,往往能解释为什么某个AU召回率低——通常是注意力区域被旁边更强的特征抢走了。针对这种情况,你可以在注意力图上加入一个小损失,约束注意力中心点与关键点坐标保持一致,这比换模型结构更管用。

这篇论文读下来,我最大的收获不是某个具体的注意力公式,而是它在任务关系上的处理方式。AU检测和人脸对齐的关系,不同团队会给出完全不同的答案,这篇论文选择了“以AU为主、对齐为辅、用注意力串联”的路线。这个思路不仅适用于AU检测,也适合其他强局部依赖、弱标签空间关系的计算机视觉任务。下次读到标题里带“Joint”的论文时,建议你先问一句:它联合的底气是什么?是共享backbone,还是共享空间结构?搞清楚这一点,比多记几个网络层更能帮你把论文变成自己的东西。

返回列表