PCL:姿态解耦与对比学习怎样塑造人脸表示
交换重建、正负增强与冻结线性评价的完整解释
一句话总结
PCL 用因素交换重建与两类对比学习改善通用人脸表示;姿态不变性、代码差异和各下游任务边界必须分清。
为什么研究表情还要学习头部姿态
Pose-Disentangled Contrastive Learning for Self-Supervised Facial Representation,简称 PCL,发表于 CVPR 2023。它研究通用人脸表征的自监督学习,而不是专门的情绪分类器,也不是持续学习。目标是在不使用预训练阶段人工任务标签的情况下,学习能够支持表情识别、人脸验证、动作单元检测和姿态估计的表示。
一个人的脸向左转时,像素和几何结构变化很大,但身份与部分表情信息可能不变。如果把这些变化全部混在同一个向量中,模型可能把头部朝向当作身份或情绪的捷径。PCL 尝试把姿态相关与姿态无关的面部因素分开训练,同时保留一个通用主干表示供不同下游任务使用。
自监督不是完全没有监督信号,而是从数据变换与样本关系构造信号。同一图片的增强版本通常视为正对,不同图片视为负对;重建原图也提供像素级约束。这里最关键的问题是变换对不同因素的意义不同:翻转可能不改变身份,却会改变面部朝向,因此不能对所有分支使用完全相同的正负关系。
Figure 1 说明姿态混杂问题,Figure 2 给出整体框架,Figure 3 展示解耦重建。初学者可以先把一张人脸和它的水平翻转并排画出,问哪些信息应该共享、哪些应该变化,再理解两个分支的职责。不要一开始就把“姿态无关”理解为统计上已证明完全独立,论文使用的是训练约束而非可识别性定理。
PDD:交换两个因素,再要求把图像重建回来
主干 B 先提取通用特征 Fs,两个分支分别输出面部因素 Ff 与姿态因素 Fp。输入原图 s 和翻转图 ŝ 后,得到两组因素。解码器既重建原始组合,也重建交换组合:原图的面部因素加翻转图的姿态因素,应形成翻转图;反过来则应形成原图。这个交换约束给两个分支分工的压力。
如果解码器只接受一组不交换的向量,它可能任意分配信息,甚至一个分支包办全部重建。交叉组合迫使被交换的部分携带能够改变朝向的信息,另一个部分尽量保留共享面部内容。不过神经网络仍可能找到其他编码方式,因此交换重建成功是有用证据,不是数学意义上唯一解耦的证明。
正交约束进一步减少两分支重叠信息。原文以两种表示的内积约束说明思想,公开代码实际对批量中心化、逐样本归一化后的特征计算跨维相关矩阵平方均值。二者相关但不完全相同;精确复现应报告采用论文公式还是当前公开实现,不能把这种差异悄悄抹去。
训练后下游通常使用主干 Fs,而不是仅使用被称为姿态无关的 Ff。原因是四类任务需要的信息不同:姿态估计恰好需要姿态信息。论文 Table 7 比较不同特征,主干对表情和身份表现较好,而拼接分支在 AU 上可能更好。解耦训练是改善通用表示的手段,不是要求所有任务都扔掉姿态。
flowchart TD S[原图与翻转图] --> B[共享主干Fs] B --> F[面部因素分支Ff] B --> P[姿态因素分支Fp] F --> D[原组合与交换组合解码] P --> D D --> R[四项重建约束] F --> FC[面部对比学习] P --> PC[姿态对比学习] R --> L[联合优化与动态权重] FC --> L PC --> L B --> E[冻结主干 后训练下游线性头]
公式:正负样本关系比损失名称更重要
原文 Eq.1 的前两种组合。D 是解码器。面部因素固定而换姿态因素,目标图像的朝向随之变化。另两种组合使用翻转图的面部因素,分别与两种姿态因素配合。四种约束一起限制信息分工。
原文 Eq.2 的紧凑重写。上标零与一代表原图和翻转图,目标由姿态分支的来源决定。L1 是各像素绝对差的汇总,不是情绪分类误差;重建清晰也不必然意味着情绪表示更好,所以还需要下游评价。
原文 Eq.3 的思想表示。使两个因素的线性重叠变小。向量正交只能限制某种线性关系,不能保证统计独立;两个变量可能内积很小却仍有非线性依赖。源码的批量跨维版本见后文,不能与此简式完全等同。
面部对比分支 Eq.6 的常见形式。正对是同一图片的两种增强,其余非自身样本参与分母。温度 τ 控制相似度差异被放大的程度。这个式子与姿态分支的样本构造要一起读;仅写出 InfoNCE 名称并不能说明模型学到了哪种不变性。
原文 Eq.4。像素重建要求信息足够,正交约束要求分支不要过度重复。只最小化正交项可以通过退化表示轻易做到,重建约束用于阻止这种无用解;两项互相制约,不能孤立地评价其中一项。
原文 Eq.7。姿态对比与面部对比采用动态权重平衡。若某项训练速度或尺度与其他项差异很大,固定等权可能使一个任务主导。动态权重并不是保证最优的魔法参数,仍需通过固定权重消融检查贡献。
姿态分支把保留朝向的增强作为正关系,把改变朝向的翻转或旋转作为负关系;面部分支则强调同一人脸增强间的一致。三个原文关键词“disentangled”“contrastive”“pose”对应分工、关系约束和被单独建模的因素。学习时要为每种增强写清“对哪一个分支保持什么”,避免把所有增强一律视为正样本。
原文姿态损失的分母写法与常见包含正项的交叉熵形式存在差异。当前源码先拼接正相似度与负相似度,再用交叉熵处理,因此实际归一化包含正项;还出现负特征混合操作。这些细节说明当前仓库不能只按论文公式逐字推测,复现时应固定提交并记录偏差。
实验:通用性要看多个下游任务
| 任务 | SimCLR | PCL |
|---|---|---|
| FER2013准确率 | 49.51 | 56.81 |
| RAF-DB准确率 | 71.06 | 74.47 |
| LFW验证准确率 | 75.97 | 79.72 |
| CPLFW验证准确率 | 62.25 | 64.61 |
| DISFA平均AU F1 | 49.4 | 54.8 |
| AFLW2000姿态MAE/度 | 14.38 | 12.36 |
同一预训练表示在四类任务上改善,支持通用人脸表征的目标。但不能把所有数字加起来求一个没有单位意义的总分:准确率、AU F1 和角度误差衡量不同对象。部分监督方法在表情识别上仍高于 PCL,说明自监督收益不等于全面超过使用标签的方法。
| 设置 | 准确率 |
|---|---|
| SimCLR基线 | 71.06 |
| 加入重建 | 71.47 |
| 继续加入正交 | 72.39 |
| 继续加入姿态对比 | 73.73 |
| 完整动态权重 | 74.47 |
这张逐步消融表表明每个环节在该设置下有增益,但不能证明模块之间没有交互。Table 6 还显示仅给 SimCLR 增加姿态相关策略已到七十三点一七,接近不使用动态权重的七十三点七三。也就是说,增强与正负对设计贡献很大,不能把全部收益都归于复杂的解码结构。
AU 平均提升也不是每个动作单元都提升:Table 3 中 AU2、AU12 和 AU26 相对 SimCLR 出现下降。细粒度研究应该查看每个 AU 的样本数、可见度与误差,而不是只展示平均 F1。对姿态角度也应分别查看俯仰、偏航和翻滚,避免平均误差掩盖大角度侧脸的困难。
论文预训练使用 VoxCeleb 大量片段、每秒六帧、六十四像素人脸与千轮级训练,批量二百五十六。下游冻结主干训练线性头约三百轮,不同任务图像尺寸不同。这里的“线性评价”不是端到端微调,因此与一个全网络微调结果直接比较会改变监督预算与可训练容量。
源码:最有价值的是发现公式与实现的距离
源码:Models/exppose.py,L17–33(固定提交 6e71d4110873)
def forward(self, input1, input2):
# Zero mean
input1_mean = torch.mean(input1, dim=0, keepdims=True)
input2_mean = torch.mean(input2, dim=0, keepdims=True)
input1 = input1 - input1_mean
input2 = input2 - input2_mean
input1_l2_norm = torch.norm(input1, p=2, dim=1, keepdim=True).detach()
input1_l2 = input1.div(input1_l2_norm.expand_as(input1) + 1e-6)
input2_l2_norm = torch.norm(input2, p=2, dim=1, keepdim=True).detach()
input2_l2 = input2.div(input2_l2_norm.expand_as(input2) + 1e-6)
diff_loss = torch.mean((input1_l2.t().mm(input2_l2)).pow(2))
#diff_loss = torch.mean((input1_l2 * input2_l2).sum(dim=1).pow(2))
return diff_loss这段 DiffLoss 对特征先按批量中心化,再逐样本归一化,最终计算维度间相关矩阵平方均值。归一化分母使用 detach,使梯度路径也与完全可微的标准归一化不同。初学者无需立即判断哪种更好,先用小张量比较“每样本点积”和“批量跨维相关”数值为何不同即可。
源码:Models/exppose.py,L371–383(固定提交 6e71d4110873)
pos = torch.cat(
[torch.einsum('nc,nc->n', [q, k]).unsqueeze(-1), torch.einsum('nc,nc->n', [k, q]).unsqueeze(-1)], dim=0)
fea_neg_tensor = fea_neg_tensor.transpose(2, 1)
neg = torch.bmm(features.view(b, 1, -1), fea_neg_tensor).view(b, -1)
logits = torch.cat([pos, neg], dim=1)
labels = torch.zeros(logits.shape[0], dtype=torch.long).cuda()
logits = logits / self.temperature
# print('cost time: {}'.format(time.time() - time_start))
return logits, labels正相似度放在 logits 第一列,标签全为零,随后交给交叉熵。这意味着分母包含第一列正项。配置 remote_PCL_vox.yaml 的 epochs 为六千,而论文描述千轮级训练;当前配置还含负样本混合参数。这些差异需要在实验记录中说明,不能直接运行仓库默认值后宣称严格对应论文主表。
学习与复现:先做交换实验,再考虑大规模预训练
第一步取十张有权限的人脸图片,生成水平翻转、轻微旋转、裁剪与颜色扰动,为每一种变换写一张表:身份、表情和姿态分别是否应该保持。验收是至少找到一个“同一增强对不同任务意义不同”的例子,解释为什么翻转对身份可作正对,对姿态却可能需要负关系。
第二步用随机小向量实现四种因素组合与 L1 重建目标,检查目标图由姿态因素来源决定。先不要追求重建漂亮;打印每个分支梯度,确认面部与姿态编码器都收到信号。验收是交换一个分支时对应目标正确,且没有把原图与翻转图的目标顺序写反。
第三步在很小的数据子集上验证正交项与对比项数值,画出特征范数和两分支相关性随训练变化。若相关性下降但全部特征也趋近零,属于退化而非成功解耦。验收必须同时有重建误差、特征方差和简单下游读出,不能只看一个损失曲线下降。
第四步优先使用有来源记录的预训练权重做冻结线性评价,建立与随机初始化主干相同的分类头和划分。只在验证集选择超参数,测试集最后评估一次。若使用与论文不同的脸部裁剪、输入尺寸或身份划分,明确称为本地兼容实验;这些变化会影响结论,不能被一个相近准确率掩盖。
细粒度扩展可以研究局部 AU 与姿态分支是否仍混杂:按头部角度分组报告每个 AU 的 F1,检查侧脸时哪一类局部动作退化最明显。跨场景扩展可以固定主干,在不同拍摄条件下训练相同线性头,观察表示是否依赖场景或身份。先控制任务与监督量,才有资格解释迁移能力。
作者后续方向与独立判断
作者提出进一步考虑年龄、化妆、遮挡等因素。当前只针对姿态进行特定解耦,不能据此声称所有无关因素都已消除。水平翻转也不是完整的真实三维头部旋转;它保留很多镜像结构,与遮挡变化和大角度转头的物理过程仍有差异。
本文独立判断是:PCL 很适合作为“表示如何被训练关系塑造”的学习案例,但负样本默认互异的假设仍可能排斥语义相似的人脸。两个不同样本可能具有相同姿态或相近表情,却被一起推开。这正是后续 PCFRL 讨论样本凝聚与假负样本的自然入口,学习顺序是概念延伸,并非把两个模型串成推理流水线。
把机制变成可以复查的实验记录
阅读线性评价时,要分清预训练、冻结与分类头训练三段。自监督主干先使用无任务标签的人脸数据学习,再固定参数,只用下游标签训练一个简单读出层。这样测试的是已有表示中信息是否容易被读取。若随后允许整个主干更新,结果回答的是微调能力,不能继续沿用同一线性评价标题。
身份泄漏尤其容易影响人脸研究。同一个人的不同视频如果出现在训练与测试两侧,模型可能利用身份或拍摄条件,而不是目标表情。应按数据集官方协议核对划分,并记录预训练与下游数据是否存在身份重叠。不能仅凭文件路径不一样判断样本独立,更不能把相邻视频帧随机划分当作跨场景泛化。
交换重建的可视化应做成四格:原面部配原姿态、原面部配翻转姿态、翻转面部配原姿态、翻转面部配翻转姿态。每格标出目标图与重建图,单独计算误差。这样能看出模型是否真正按姿态来源改变图像,而不是只重建一张模糊平均脸来降低总体像素损失。
正交约束的反例也值得手算。两个向量在某个样本上内积为零,不代表两个随机变量独立;一个分支可能通过非线性方式编码另一个分支的信息。可以训练一个小预测器,用面部因素预测姿态角度,作为残留信息探针。探针失败也受容量限制,因此应解释为当前探针未读出,而非绝对无信息。
批量大小改变会影响对比学习中的负样本数量与难度。若为了显存把二百五十六降到十六,不能认为只改变了训练速度;目标函数看到的关系集合也变了。可以用梯度累积扩大有效优化批量,但它并不自动把跨累积步骤的特征放入同一个对比分母,二者在机制上并不完全等价。
公开代码中的负特征混合意味着负样本不一定对应一张真实图片,而可能是两个特征的组合。分析错误时不能只回看一个负样本文件就解释该梯度来源。应先固定是否启用混合,再与不混合版本比较,并记录混合系数的分布;这些工程选择可能对复现结果有实质影响。
最终验收报告应至少展示一个重建交换例、一个正负增强表和一个冻结读出结果。若只做完随机张量检查,结论应是机制实现通过基本检查;若完成小数据训练,结论是小规模验证;只有满足原始数据与协议并取得可比结果,才讨论论文复现程度。这样的分层能让每一步进展真实且可积累。
原文与核验边界
论文原文及出版信息。本篇依据全文、附录和表格编写;文中的教学计算与研究建议均不冒充作者实验证据。核验日期:2026-10-23。
自己的解释与验收记录
写出一条输入到输出的链路、一个关键公式的含义,以及你完成的最小检查。笔记仅保存在当前浏览器,可从主站「我的学习笔记」导出。