Face Landmark:从级联回归到 3D 密集对齐
Face Landmark从级联回归到 3D 密集对齐Face landmark detection 看起来像一个很小的模块输入一张脸输出眼角、鼻尖、嘴角、脸轮廓上的一组点。可一旦进入真实应用它会变成整个视觉系统的几何地基。人脸对齐、表情迁移、口型驱动、换脸、AR 贴纸、视线估计、疲劳检测都在某种程度上依赖这些点是否稳定。这篇文章讲的是人脸 landmark而不是地图地标识别。重点不放在“怎么调用一个 API”而是把 landmark 的技术路线拆清楚传统级联回归为什么能快到毫秒级深度网络为什么把问题改写成 heatmap localization3D / dense landmark 又为什么比 68 点更适合今天的人脸驱动任务。Landmark 到底预测的是什么最常见的人脸 landmark 是稀疏关键点。比如经典的 68 点协议会标注下颌线、眉毛、眼睛、鼻子和嘴唇。模型输出通常是S{(xi,yi)}i1N S \{(x_i, y_i)\}_{i1}^{N}S{(xi,yi)}i1N其中NNN可以是 5、21、68、98、194也可以是几百个点。MediaPipe Face Mesh 这类系统会输出 468 个 3D face landmarks已经接近一张稠密脸部网格。这里有一个容易忽略的事实landmark 不是客观存在于图像里的“点”而是一个标注协议。鼻尖在哪里、嘴角点放在口裂端点还是纹理边缘、脸轮廓在大姿态下如何处理遮挡这些都取决于数据集定义。换一个协议模型学习的几何语义也会变。所以评估 landmark 模型时不能只问误差是多少。还要问它预测的是哪个协议适合正脸还是大姿态输出是 2D、2.5D 还是 3D是否对遮挡点给可见性这些问题会直接影响下游效果。传统路线级联回归为什么这么快2014 年前后人脸对齐里有一条非常成功的路线cascade regression。Kazemi 和 Sullivan 的 One Millisecond Face Alignment with an Ensemble of Regression Trees 是代表工作也被 dlib 的经典 68 点 landmark detector 广泛使用。它的思路不是先分割人脸区域也不是对每个点单独分类而是从一个初始形状开始反复预测形状更新量St1Strt(I,St) S^{t1}S^tr_t(I,S^t)St1Strt(I,St)StS^tSt是当前估计的 landmark shapertr_trt是第ttt级回归器。每一级都会根据当前 shape在相对坐标下采样一些像素强度差特征然后用回归树预测更新。这个方法快原因很直接特征非常便宜回归树也非常便宜。论文标题里的 One Millisecond 不是修辞它强调的是单张图像上接近实时以上的速度。它的抽象也很漂亮初始平均脸可能很粗但每一级只需要修正一小步后一级在前一级的基础上看更对齐的局部区域。级联回归有两个核心技巧。第一特征是 shape-indexed features。也就是像素采样位置不是固定在图像坐标里而是相对当前 landmark shape 定义。眼角附近的特征就跟着当前眼角估计移动。这个设计把“先定位点才能提特征”和“先提特征才能定位点”的循环打断了。第二模型把 shape update 限制在训练形状分布附近。回归器输出的更新来自训练数据的统计结构通常不会跳到完全不合理的人脸形状上。传统 ASM / AAM 也重视 shape prior只是级联回归用更直接的判别式方式实现。缺点也明显。级联回归依赖初始框质量对大姿态、遮挡、极端表情更脆弱特征表达能力有限很难像 CNN 那样利用大规模数据学习语义上下文。它适合轻量、稳定、正脸为主的场景但不是今天所有人脸任务的上限。3000 FPS 不是魔法local binary features 的路线同样在 CVPR 2014Ren、Cao、Wei 和 Sun 提出了 Face Alignment at 3000 FPS via Regressing Local Binary Features。这个标题听起来夸张但论文的逻辑很工程把特征设计成局部二值特征再用线性回归联合预测 landmark shape。它的关键是 locality principle。不同 landmark 周围需要不同的局部特征。嘴角的局部纹理对鼻尖帮助不大眼角附近的边缘变化对眼部点更有用。论文让每个 landmark 学习自己的 local binary features再把这些特征合起来做 shape regression。为什么会快二值特征提取成本低回归也轻。论文摘要里给出的速度是桌面端超过 3000 fps手机端约 300 fps用于定位几十个 landmarks。今天看这个数字仍然很惊人但要理解它背后的前提这是传统手工/弱学习特征路线在特定 benchmark 和点数设置下追求极致速度。这类方法给后来的系统留下了一个重要经验landmark 不一定要用很重的网络。如果下游只是需要眼角、鼻尖、嘴角做仿射对齐轻量级回归器可能比大网络更合适。模型大小、延迟、稳定性经常比 paper 上的平均误差更重要。深度学习路线从坐标回归到 heatmapCNN 进入人脸对齐后问题的主流表述发生了变化。早期有人直接回归坐标但更稳的路线通常是预测 heatmap每个 landmark 对应一张概率图峰值位置就是关键点。给第iii个点生成监督 heatmap 时常用一个以真实点为中心的 GaussianHi(u,v)exp(−(u−xi)2(v−yi)22σ2) H_i(u,v)\exp\left(-\frac{(u-x_i)^2(v-y_i)^2}{2\sigma^2}\right)Hi(u,v)exp(−2σ2(u−xi)2(v−yi)2)网络输出H^i\hat{H}_iH^i训练时用 MSE 或类似损失拟合。推理时取 heatmap 最大值或者用 soft-argmax 得到连续坐标。heatmap 的好处是把“精确坐标回归”变成“空间定位”。卷积网络天然保留空间结构heatmap 能表达不确定性也更容易利用多尺度特征。缺点是输出分辨率受 feature map 限制要靠上采样、hourglass、HRNet 或坐标细化来补精度。Bulat 和 Tzimiropoulos 的 2D / 3D Face Alignment 工作就是这一阶段的代表。他们构建了强 baseline用深网络做 landmark localization并通过 2D landmark 引导生成 3D 标注形成约 230,000 张图像的 LS3D-W 数据集。论文的问题意识很明确在现有 2D / 3D face alignment 数据集上深网络到底离“饱和”还有多远这类工作让 landmark 从“小模型回归问题”变成了“数据、网络结构、姿态分布、评估协议”共同决定的问题。尤其是大姿态下2D 可见点、投影点和真实 3D 语义点并不总是一回事。2D、3D、dense landmark 的区别2D landmark 输出图像平面坐标适合裁剪、对齐、表情粗估计。它简单、直观、部署成本低。3D landmark 会额外估计深度或三维坐标S{(xi,yi,zi)}i1N S \{(x_i, y_i, z_i)\}_{i1}^{N}S{(xi,yi,zi)}i1N这对大姿态和人脸驱动更有意义。头转过去时2D 投影会发生压缩脸轮廓点也可能从语义轮廓变成可见轮廓3D 表示能更清楚地区分头部姿态和表情形变。Dense landmark 或 dense alignment 则进一步把点数从几十个扩展到几百、几千甚至整张 UV map。PRNet 的 Joint 3D Face Reconstruction and Dense Alignment with Position Map Regression Network 采用 UV position map 表示把完整人脸的 3D 坐标记录到 UV 空间里。论文报告的单张图像处理时间是 9.8ms并且同时提供 3D 重建和 dense alignment。这类方法的价值在于语义连续性。稀疏 68 点只能约束眼鼻嘴轮廓无法描述脸颊、额头、鼻梁曲面。对于贴图、三维重建、face reenactment、表情迁移dense alignment 往往更自然。但 dense 并不总是更好。如果下游只需要稳定的眼睛中心和嘴角468 点可能反而增加后处理负担。点越多对标注协议、拓扑一致性和时序抖动的要求越高。MediaPipe Face Mesh工程系统里的 landmarkMediaPipe Face Mesh 是一个很典型的工程化 landmark 系统。官方文档描述它可以在移动设备上实时估计 468 个 3D face landmarks只需要单目 RGB 输入不需要深度传感器。这类系统和论文 demo 的区别在于它通常不是一个单独模型而是一条 pipeline先检测人脸再裁剪 ROI再跑 landmark model最后做跟踪、平滑和几何变换。实时系统里模型本身只是一部分ROI 复用、时序稳定、失败恢复同样重要。Face Mesh 对 AR 和人脸特效尤其有用。468 个点给出了足够密的脸部拓扑可以驱动眼镜、面具、妆容、表情滤镜。相比 68 点它更接近一张可用的几何表面。不过也要注意MediaPipe 输出的 3D 坐标不是通用精确三维扫描。它是为实时视觉应用设计的 face geometry 表示。用它做 AR 很合适如果要做医学级测量或高精度 3D 重建需要更严格的相机模型、标定和误差分析。评价指标NME 看起来简单细节很多Landmark 最常用的指标是 Normalized Mean ErrorNMENME1N∑i1N∥p^i−pi∥2d \text{NME}\frac{1}{N}\sum_{i1}^{N}\frac{\|\hat{p}_i-p_i\|_2}{d}NMEN1i1∑Nd∥p^i−pi∥2ddd是归一化尺度常见选择包括双眼距离、瞳孔距离、外眼角距离、bounding box 尺寸。选择不同数字不可直接比较。还有 CED 曲线和 AUC。CED 展示不同误差阈值下的累计样本比例AUC 则把曲线面积压成一个数。Failure rate 通常统计 NME 超过某阈值的比例。这些指标有用但不够。真实应用还关心时序抖动视频里点是否稳定遮挡鲁棒性手、头发、眼镜挡住时是否乱跳大姿态yaw 很大时轮廓点语义是否一致下游误差对齐后的人脸识别、表情迁移或口型驱动是否更好延迟和功耗移动端能不能稳定跑满帧率。尤其在人脸驱动和表情动画里平均 NME 低不代表视觉效果好。一个点在嘴角附近抖 1-2 像素静态误差可能不大但视频里会非常明显。Landmark 的后处理比很多人想象得重要生产系统很少直接使用模型原始输出。常见后处理包括 temporal smoothing、异常点过滤、shape constraint、头姿估计和坐标系转换。最简单的平滑是指数滑动平均p~tαpt(1−α)p~t−1 \tilde{p}_t\alpha p_t(1-\alpha)\tilde{p}_{t-1}p~tαpt(1−α)p~t−1α\alphaα越小越稳但延迟越大。视频任务里这就是典型 trade-off稳定性和响应速度互相拉扯。口型、眼睛、眉毛对延迟的容忍度还不一样统一平滑参数往往不是最优解。另一个常见步骤是把 landmark 转成 head pose。给定 2D landmark 和一个粗略 3D face template可以用 PnP 估计旋转和平移(ui,vi)∼K[R∣t]Xi (u_i,v_i) \sim K [R|t] X_i(ui,vi)∼K[R∣t]Xi这里KKK是相机内参R,tR,tR,t是头部姿态。很多 AR 系统会先用 landmark 估计头姿再把虚拟物体挂到稳定的三维坐标系里。如果做 face reenactment还会把 landmark 转成 expression coefficients、blendshape、motion field 或 dense correspondence。此时 landmark 不再是终点而是中间几何表示。训练一个 landmark 模型时真正麻烦的地方第一是数据标注一致性。不同标注员对脸轮廓、嘴唇内外边界、遮挡点的处理不一致模型会学到平均后的模糊规则。对稀疏点来说这个问题还可控对 dense landmark它会更明显。第二是数据分布。很多数据集正脸多、无遮挡多、光照正常。模型在 benchmark 上很好到了侧脸、低清、运动模糊、夸张表情、二次元脸、直播滤镜脸就开始漂。第三是坐标监督本身可能不够。只靠 L2 坐标损失模型会惩罚每个点的独立误差却不一定保证整体形状合理。加入 heatmap、visibility、edge/contour loss、shape prior 或 3D consistency往往能改善稳定性。第四是视频一致性。单帧模型即使每帧都“准确”连续输出也可能抖。要么在训练时引入 temporal loss要么在推理时做跟踪和平滑。对于实时互动系统后者几乎必不可少。什么时候用 5 点、68 点、468 点或 dense alignment如果只是做人脸识别前的仿射对齐5 点通常够用左右眼中心、鼻尖、左右嘴角。点少、稳定、速度快。如果要做传统表情分析、嘴眼区域裁剪、简单美颜和贴纸68 点仍然很实用。生态成熟dlib/OpenCV/很多数据集都能接上。如果要做 AR 面具、妆容、3D face effect、实时 avatar468 点 Face Mesh 更合适。它提供了脸部表面拓扑而不只是器官边界。如果要做高质量 3D 重建、表情迁移、dense correspondence 或神经渲染前处理dense alignment / UV position map / 3DMM-based fitting 会更自然。代价是系统复杂度更高也更依赖相机、模板和数据质量。选择点数时不要只看“更密更先进”。下游需要什么几何约束才决定 landmark 应该有多密。一个实用的技术栈建议如果你只是快速做 demo可以从 MediaPipe Face Mesh 开始。它部署简单点数足实时性好适合 AR 和人脸交互原型。如果你要在传统 CV 管线里做轻量部署dlib 的 ERT 或类似级联回归仍然值得考虑。它不性感但小、快、稳定尤其适合 CPU-only 场景。如果你要训练自己的模型建议优先用 heatmap-based CNN 或 HRNet 风格结构而不是直接坐标回归。除非你有强工程约束否则 heatmap 通常更稳。如果你的目标是人脸驱动视频、口型/表情迁移或 3D avatar不要把 2D landmark 当成完整 motion representation。它只能提供稀疏几何线索眼神、表情肌肉、头部微动、遮挡和身份形状还需要额外建模。这点在 face animation 里特别明显一个 landmark 序列可以让嘴动起来但很难让脸“像真人一样动”。真实感通常来自更丰富的 motion prior而不是更多 2D 点本身。结语Landmark 是接口不是答案Face landmark 的价值在于它把图像里的脸变成了可计算的几何结构。传统级联回归告诉我们好的形状先验和便宜特征可以非常快heatmap CNN 告诉我们空间概率图比裸坐标更稳定3D 和 dense alignment 则把 landmark 从“几个关键点”推进到“可驱动的脸部表面”。但 landmark 本身不是终点。它是一个接口连接检测、对齐、3D 姿态、表情、渲染和下游任务。真正做系统时最重要的不是追一个最低 NME而是让这个接口在目标场景里稳定、低延迟、语义一致。如果要把一句话带走landmark detection 不是“找点”而是在给脸建立一个可复用的几何坐标系。参考资料Vahid Kazemi, Josephine Sullivan. One Millisecond Face Alignment with an Ensemble of Regression Trees. CVPR 2014. https://www.cv-foundation.org/openaccess/content_cvpr_2014/papers/Kazemi_One_Millisecond_Face_2014_CVPR_paper.pdfShaoqing Ren, Xudong Cao, Yichen Wei, Jian Sun. Face Alignment at 3000 FPS via Regressing Local Binary Features. CVPR 2014. https://www.cv-foundation.org/openaccess/content_cvpr_2014/html/Ren_Face_Alignment_at_2014_CVPR_paper.htmlAdrian Bulat, Georgios Tzimiropoulos. How far are we from solving the 2D 3D Face Alignment problem? ICCV 2017. https://arxiv.org/abs/1703.07332Yao Feng, Fan Wu, Xiaohu Shao, Yanfeng Wang, Xi Zhou. Joint 3D Face Reconstruction and Dense Alignment with Position Map Regression Network. ECCV 2018. https://openaccess.thecvf.com/content_ECCV_2018/papers/Yao_Feng_Joint_3D_Face_ECCV_2018_paper.pdfGoogle MediaPipe Face Mesh documentation. https://github.com/google-ai-edge/mediapipe/blob/master/docs/solutions/face_mesh.md