每个孩子第一次打开乐高盒时都会惊叹:几百块标准小砖,居然能拼出城堡、赛车和恐龙。工程师面对人脸时也有同样的观察——我们的脸上只有几十块表情肌肉,却能组合出成千上万种表情。四十多年前,心理学家 Paul Ekman 和 Wallace Friesen 把这张“积木说明书”写了出来,命名为 FACS(Facial Action Coding System,面部动作编码系统)。它把所有表情拆成最小的“肌肉级积木”——动作单元(Action Unit,AU):一个微笑不是一种零件,而是“脸颊上提 AU6 + 嘴角上扬 AU12”两块积木的合体。数字人、虚拟主播要想“活起来”,靠的就是把这张说明书逆向翻译成模型能听懂的表情指令。本文就带你从“认识积木”走到“开积木工厂”,完整看懂表情驱动 FACS 编码体系的原理、管线与落地。

岗位关联

掌握 FACS 编码与驱动链路,是进入数字人/虚拟主播赛道的核心本领,让你能把“一张会动的脸”从论文变成日活百万的视频 AI 产品。

目录
  1. 可视化演示
  2. FACS编码原理
  3. 核心动作单元
  4. 表情捕捉管线
  5. 驱动建模技术
  6. 渲染合成链路
  7. 评估质量体系
  8. 行业落地实践
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

交互式演示面部动作编码系统(FACS)的AU检测、组合规则与表情驱动流程,通过滑块调节AU强度观察面部动作变化。

本节配有交互动效(进入视口后自动加载,约 3KB)。

AU检测模式 面部关键点定位 AU区域识别 CNN检测器实时分析面部动作单元

FACS编码原理

每个孩子第一次打开乐高盒时都会惊叹,几百块标准小砖竟能拼出城堡、赛车和恐龙。工程师面对人脸时也有同样的观察:三十多块表情肌肉在皮肤下面相互配合,却能组合出成千上万种表情。四十多年前,心理学家 Paul Ekman 与 Wallace Friesen 把这张“积木说明书”写了出来,命名为 FACS(Facial Action Coding System,面部动作编码系统)——它把一切表情都拆成最小的“肌肉级积木”:动作单元(Action Unit,AU)。

在 FACS 里,每块积木 AU 都对应一组明确的肌肉运动,与情绪无关。比如 AU4 是“眉毛下压”,AU12 是“嘴角上扬”,AU25 是“嘴唇张开”。每块积木还自带强度刻度:从 A(微弱)到 E(强烈)五个等级。工程师只要写下“AU12 等级 C、AU6 等级 B”,就能精确描述一张正在微笑的脸,而不用含糊地说“她好像挺开心”。

把这种直觉数学化,任意表情都是一个加权求和:E 是整张脸的表情状态,AU_i 是第 i 个动作单元,w_i 是它在 0-5 之间的强度权重。标准 FACS 定义了 44 个基本 AU,再加上头部朝向与眼球运动等辅助编码。这条公式是整条数字人管线的“第一性原理”:表情既然能被分解成 AU,就能被参数量化、被模型学习、被其他模型重建。

有了统一的“积木语言”,真人的表演、动画师手工雕刻的表情、程序随机生成的脸,都能拆成同一套 AU 码互相翻译。数字人表情驱动这条流水线的第一站,不是摄像头,也不是渲染器,而是这张薄薄的乐高说明书。

E=∑i=1nwi⋅AUiE = \displaystyle\sum_{i=1}^{n} w_i \cdot AU_i
这条公式把“表情”从感性印象变成了可计算的加权和:每个 AU 是一块积木,w_i 就是这块积木的用力大小。
  1. E(表情状态)整张脸的最终表情量化结果,例如“微笑”对应的 AU 组合与强度向量。
    EE
  2. 求和符号 Σ把从 i=1 到 n 的所有动作单元逐个累加,标准 FACS 中 n 常取 44 个基本 AU。
    ∑i=1n\displaystyle\sum_{i=1}^{n}
  3. w_i(强度权重)第 i 个动作单元的激活程度,取值 0-5(对应 A-E 五个等级),决定这块积木“用力多大”。
    wiw_i
  4. AU_i(动作单元)第 i 个动作单元本身,如 AU12 表示嘴角上扬。
    AUiAU_i

核心动作单元

老玩家都知道,乐高里有些积木是“万金油”——2×4 标准砖、车窗、轮子,几乎每个模型都在用。面部积木也有一批高频主角,集中在眉眼与口鼻两个区域,它们是表情世界的“零件号”。

眉眼区有 AU1(内侧眉上提)、AU2(外侧眉上提)、AU4(眉毛下压)、AU5(上眼睑抬高)、AU6(脸颊上提)、AU7(眼睑收紧);口鼻区有 AU9(皱鼻)、AU12(嘴角上扬)、AU15(嘴角下压)、AU20(嘴角后拉)、AU23(嘴唇收紧)、AU25(嘴唇张开)、AU26(下颌下降)。这些编号跨文化、跨人种都稳定存在,是捏脸师和算法工程师共同的“通用零件目录”。

经典成果是六种基本表情的 AU 配方。心理学研究发现,真心微笑时眼轮匝肌会收缩(AU6),让眼睛下方鼓起、眼角出现细小皱纹;而假笑只是颧大肌拉动嘴角(AU12),眼睛纹丝不动。这一眼之别,恰恰是数字人“看起来真不真”的分水岭——很多早期虚拟主播的笑容都输在缺少 AU6 上。

牢记这些高频积木的配方,就等于记住了常见表情的“快捷组装法”。数字人捏脸师拿到一张新面孔,第一件事就是检查它的 AU6 与 AU12 能否独立驱动——能,才有资格谈“会笑”。

微笑=AU6+AU12\text{微笑} = AU6 + AU12
真笑和假笑在 FACS 面前的差别,就像乐高城堡有没有打地基:AU6 是地基,AU12 只是外墙。
  1. AU6(脸颊上提)眼轮匝肌收缩,把脸颊向上顶,眼睛下方出现“笑纹”,是真笑的标志。
    AU6AU6
  2. AU12(嘴角上扬)颧大肌拉动嘴角向斜上方翘起,是微笑的“主承重积木”。
    AU12AU12
  3. 加号(组合)两块积木同时激活才构成 Duchenne 真笑;仅有 AU12 而无 AU6,是礼貌性假笑。
    AU6+AU12AU6 + AU12

表情捕捉管线

面对一座已经拼好的乐高城堡,想搞清每块砖用了多大劲可不容易——得上手拆、上秤称。表情捕捉做的事同理:从一段视频里,反推出每一帧每个 AU 的激活强度,业内叫“AU 强度估计”。

管线通常分四步:先用 MediaPipe 或 OpenFace 提取面部关键点(68 点或 478 点坐标);再用 AU 检测模型为每个 AU 回归出强度值;接着对时间序列做平滑,去掉单帧的毛刺;最后把强度编码成下游可用的动作参数。“称重”准不准,直接决定表情自然不自然。

AU 强度回归可以建模为一个最小化问题:P_t 是第 t 帧观测到的关键点坐标,R(y_t) 是给定候选强度 y_t 时重建出的关键点,目标是让两者差异的平方和最小。如今主流做法是端到端训练卷积或 Transformer 回归器直接输出强度,数学本质没有变——还是在找“最像的那组积木力道”。

拆积木拆得准,后面拼装才有好原料。如果捕捉环节把 AU6 的强度多估了 0.3,数字人的微笑就会变成“咧嘴怪笑”——误差会顺着流水线一路放大到最终画面。

y^t=arg⁡min⁡y∑t=1T∥Pt−R(yt)∥22\hat{y}_t = \displaystyle\arg\min_{y} \sum_{t=1}^{T} \left\| P_t - R(y_t) \right\|_2^2
这个公式描述的是“逆向拆积木”:不断调整每块 AU 的力度,直到重新拼出的脸与摄像头里的脸误差最小。
  1. P_t(观测关键点)第 t 帧从视频中提取的面部关键点坐标,如 68 点或 478 点。
    PtP_t
  2. R(y_t)(重建函数)由候选 AU 强度 y_t 重建出的关键点位置,用于和实际观测对比。
    R(yt)R(y_t)
  3. 范数平方衡量重建与观测的差距,差距越小,说明估计的 AU 强度越准。
    ∥⋅∥22\left\| \cdot \right\|_2^2
  4. arg min遍历所有可能的强度组合,选出让总误差最小的 y_t。
    arg⁡min⁡y\displaystyle\arg\min_{y}

驱动建模技术

拆出 AU 强度清单后,难题来了:数字人这座“模型”用的可不是乐高积木,而是自己的零件体系——顶点网格。怎么把 AU 的力道翻译成它能听懂的语言?答案是 blendshape(融合变形,又称表情目标)。

blendshape 的思路朴素却强大:先准备一张中性脸 V0,再准备 m 个“变形目标”Δk,每个目标对应一种局部形变(嘴角上翘、眉毛抬高、眼睛闭合)。最终脸型 V 就是中性脸加上所有变形目标的加权和。b_k 是 0-1 间的驱动权重,由上游 AU 强度线性映射而来,这一步就是“AU 翻译表”。

近年 ARKit 把这一思想工程化为 52 个标准 blendshape,几乎成了行业通用接口。头部转动等大动作交给骨骼动画,面部细微表情交给 blendshape,两者叠加;推理端再用 ONNX/TensorRT 把权重计算压到毫秒级,这就是实时驱动数字人骨架的关键。

一句话:AU 像钢琴谱上的音符,blendshape 是琴键,b_k 就是按琴键的力度。乐谱再漂亮,键盘映射错了弹出来也是噪音——权重映射是整个数字人“手感”的来源。

V=V0+∑k=1mbk⋅ΔkV = V_0 + \displaystyle\sum_{k=1}^{m} b_k \cdot \Delta_k
就好比乐高说明书把“城堡”翻译成“砖块清单”,blendshape 公式把“表情”翻译成“顶点位移清单”。
  1. V(目标网格)数字人某一帧的最终面部顶点坐标集合,即观众看到的这张脸。
    VV
  2. V_0(中性网格)无表情时的基础人脸网格,相当于“未拼装的素体模型”。
    V0V_0
  3. Δ_k(变形目标)第 k 个 blendshape 相对中性脸的顶点偏移量,如嘴角上翘、闭眼等。
    Δk\Delta_k
  4. b_k(驱动权重)由 AU 强度映射而来的 0-1 系数,控制这个变形目标用多大力。
    bkb_k

渲染合成链路

模型拼得再像,灯光不好、镜头歪,照片一样难看。“渲染合成”就是把积木作品的成品照拍好的环节——对数字人而言,它决定观众眼睛舒不舒服。

链路包括:网格变形(顶点按 blendshape 偏移重排)、材质纹理贴合(嘴唇、皱纹、皮肤毛孔跟随形变而运动)、光影合成(面部光照与直播间或片场环境一致,必要时做阴影烘焙)。渲染完成后还要接一道时序后处理,因为每一帧独立渲染会有“闪烁”,像老式霓虹灯一样刺眼。

常用手段是指数移动平均平滑:x_t 是第 t 帧的原始参数,x̃_{t-1} 是上一帧平滑后的记忆,β 控制记忆占比。β 太大表情会“迟钝”,太小压不住抖动,工程上常在 0.2-0.4 之间调参,让数字人的表情既稳又不面瘫。

积木拼得严丝合缝,拍照却手抖,谁还会说它精致?渲染合成是表情驱动流水线最容易被外行看见、也最容易被内行忽略的一环——时序后处理就是那根“防抖三脚架”。

x~t=(1−β) xt+β x~t−1\tilde{x}_t = (1-\beta)\, x_t + \beta\, \tilde{x}_{t-1}
这就是“防抖三脚架”:当前帧不只看自己,还要参考上一帧的结果,避免表情一帧跳一下。
  1. x_t(当前帧参数)第 t 帧渲染得到的原始表情参数,如口型开合度、眉毛高度。
    xtx_t
  2. x̃_{t-1}(历史平滑值)上一帧平滑后的输出,作为“记忆”参与当前帧计算。
    x~t−1\tilde{x}_{t-1}
  3. β(平滑因子)0-1 之间的小数,越大历史占比越高、画面越稳但越迟钝,常用 0.2-0.4。
    β\beta
  4. 加权求和当前帧与历史值按比例混合,消除单帧抖动。
    (1−β) xt+β x~t−1(1-\beta)\, x_t + \beta\, \tilde{x}_{t-1}

评估质量体系

城堡拼完了,质检员上场:不是“看着顺眼”就行,得拿出可复现的量化分数。数字人表情评估就是这套质检体系,指标分四层。

AU 检测精度(精确率、召回率、F1,衡量“每块积木识别得对不对”);强度一致性(用 ICE 相关系数比对标注强度与预测强度);自然度(组织真人用户打分,得到 MOS 主观评分);时序一致性(统计相邻帧参数抖动率,数值越小越好)。真实项目里,MOS 和抖动率往往是上线决策的最终裁判,毕竟用户不关心你的模型论文,只关心脸顺不顺眼。

AU 检测本质是二分类问题,正负样本比例悬殊,不能只用准确率。业界用 F1 调和平均(P 是精确率,R 是召回率)综合两者:F1 越高,说明模型既“说得对”又“找得全”。

质检报告就是数字人的“毕业证书”:单砖合格、整体自然、连续不抖,才有资格走进直播间。反过来,一份漂亮的 F1 背后,是数据、模型、调参三班倒的流水线功力。

F1=2×P×RP+RF1 = \displaystyle\frac{2 \times P \times R}{P + R}
精确率强调“说出来的每句都对”,召回率强调“该找的一个不落”;F1 则是两者的和事佬,逼着模型两边都不偏科。
  1. P(精确率)模型说“有这个 AU”的判断中,真正激活的比例。
    PP
  2. R(召回率)真实激活的 AU 中,模型找出来的比例。
    RR
  3. F1(调和平均)综合精确率与召回率,避免不均衡样本下准确率虚高。
    F1F1

行业落地实践

单人拼乐高是兴趣,开一家乐高工厂是生意。从技术验证走向商业落地,数字人表情驱动拼的是“流程”和“预算”。

数据采集要规范:多机位多光源,覆盖不同年龄段与姿态,且必须获得肖像与表情数据授权。工具链选型上,OpenFace 与 MediaPipe 负责 AU 和关键点,ARKit 提供 52 个 blendshape 标准接口,Unity/Unreal 负责渲染,Live Link 打通数据流。性能优化靠量化和剪枝把模型压进边缘设备;质量保障靠回归集、A/B 评测与上线监播告警形成闭环。

实时性是直播场景的生命线。全链路延迟 L 由预处理、推理、渲染、编码四段相加,必须小于等于 33 毫秒,对应 30fps 的直播帧率。实践里模型推理常占一半以上耗时,所以“优化优先打最大头”是铁律——先压推理,再谈别的。

从乐高桌到流水线,背后是标准、工具与预算的三重打磨。当延迟预算、AU 精度、渲染质量都进入可控区间,数字人表情驱动才算真正从“能跑”走向“能打”。

L=Tpre+Tinfer+Trender+Tenc≤33 msL = T_{pre} + T_{infer} + T_{render} + T_{enc} \leq 33\,\text{ms}
这是一张“时间预算表”:四道工序总共只有 33 毫秒可花,哪一道超支,观众看到的直播就会卡顿。
  1. T_pre(预处理)摄像头帧缩放与关键点提取耗时。
    TpreT_{pre}
  2. T_infer(推理)AU 检测与 blendshape 权重计算的模型推理耗时,通常是最大头。
    TinferT_{infer}
  3. T_render + T_enc(渲染与编码)网格变形、光照合成与视频编码耗时。
    Trender+TencT_{render} + T_{enc}
  4. 33 ms30fps 的一帧预算,全链路超过它直播就会卡顿。
    ≤33 ms\leq 33\,\text{ms}

AI 应用场景

虚拟主播直播带货

阶段:表情捕捉 → 驱动建模 → 渲染合成(实时推理)

解决的问题:真人主播和 2D/3D 数字分身之间需要毫秒级表情复刻,传统方式靠手动捏表情根本跟不上语速;AI 用 FACS 编码把真人表情实时翻译成数字人动作参数。

具体案例:某电商直播间用单目摄像头捕捉真人主播,OpenFace 提取 AU 强度,映射到 ARKit 的 52 个 blendshape,在 Unity 中渲染数字分身并输出直播流,全链路延迟控制在 33ms 内,观众看到的分身会跟着主播一起挑眉、微笑、嘟嘴。

影视与游戏动捕重定向

阶段:动作捕捉 → FACS 编码 → 骨骼与 blendshape 重定向

解决的问题:真人演员的骨架和 CG 角色(如四足兽人、机器人)完全不同,需要一种“中间语言”把表演搬过去;FACS 的 AU 不依赖具体面部造型,正是这种语言。

具体案例:某电影剧组用头戴式动捕相机记录演员表演,数据工程师把表情拆成 AU 序列后,重定向到只有四只眼睛的异星角色上,角色的“愤怒”依然能被观众识别。

心理健康辅助筛查

阶段:AU 识别 → 情绪特征分析(评估侧应用)

解决的问题:微表情持续只有几十分之一秒,人眼容易漏判;FACS 编码能把“礼貌性微笑下的低落”这类微妙信号变成可统计的 AU 组合模式。

具体案例:某心理咨询平台在用户授权下采集咨询录像,用 AU1+AU2+AU15 的组合模式辅助识别“嘴角保持上扬但眉毛持续微蹙”的隐秘情绪,生成医生参考报告。

Python 演示

python63 行
# -*- coding: utf-8 -*-"""FACS expression driving pipeline: emotion -> AU intensity -> blendshape weights."""AU_NAMES = {    "AU1": "inner brow raiser",    "AU2": "outer brow raiser",    "AU4": "brow lowerer",    "AU5": "upper lid raiser",    "AU6": "cheek raiser",    "AU7": "lid tightener",    "AU9": "nose wrinkler",    "AU12": "lip corner puller",    "AU15": "lip corner depressor",    "AU20": "lip stretcher",    "AU23": "lip tightener",    "AU25": "lips part",    "AU26": "jaw drop",} EMOTION_RECIPES = {    "happy": {"AU6": 0.9, "AU12": 1.0, "AU25": 0.4},    "sad": {"AU1": 0.8, "AU4": 0.5, "AU15": 1.0},    "surprise": {"AU1": 1.0, "AU2": 1.0, "AU5": 0.8, "AU26": 0.9},    "angry": {"AU4": 1.0, "AU5": 0.6, "AU7": 0.9, "AU23": 0.4},    "disgust": {"AU9": 1.0, "AU15": 0.8},    "fear": {"AU1": 0.7, "AU4": 0.8, "AU20": 0.6},} BSHAPE_AU_MAP = {    "browInnerUp": {"AU1": 1.0},    "browDown": {"AU4": 1.0},    "cheekSquint": {"AU6": 1.0, "AU7": 0.5},    "mouthSmileLeft": {"AU12": 1.0},    "mouthFrownLeft": {"AU15": 1.0},    "jawOpen": {"AU25": 0.6, "AU26": 1.0},} def format_recipe(emotion):    # 按 AU 编号排序,保证输出稳定    parts = []    for au, intensity in sorted(EMOTION_RECIPES[emotion].items()):        parts.append("%s(%.1f)" % (au, intensity))    return " + ".join(parts) def au_to_blendshape(au_intensities):    # 多个 AU 映射到同一个融合变形时,取最强驱动    weights = {}    for bs, mapping in BSHAPE_AU_MAP.items():        total = 0.0        for au, coef in mapping.items():            total = max(total, coef * au_intensities.get(au, 0.0))        if total > 0.0:            weights[bs] = round(total, 3)    return weights def main():    print("[pipeline] emotion -> AU intensities -> blendshape weights")    for emotion in EMOTION_RECIPES:        weights = au_to_blendshape(EMOTION_RECIPES[emotion])        print("%-9s AU: %s" % (emotion, format_recipe(emotion)))        print("          BS: %s" % weights) if __name__ == "__main__":    main()
目的:用 60 行代码模拟“情绪 → AU 强度 → blendshape 权重”的完整表情驱动链路,理解 FACS 在数字人管线中的桥梁作用。
  1. "happy": {"AU6": 0.9, "AU12": 1.0, "AU25": 0.4},真笑配方把 AU6 与 AU12 同时点亮;若只保留 AU12 就是假笑
  2. for au, intensity in sorted(EMOTION_RECIPES[emotion].items()):按编号排序,保证同一种情绪任何时候输出同一串配方
  3. total = max(total, coef * au_intensities.get(au, 0.0))多块 AU 积木共同驱动同一个 blendshape 时,按“最强积木”决定权重,避免叠加爆表
  4. weights[bs] = round(total, 3)把 0-5 的 AU 强度折算成 0-1 的融合变形权重,渲染引擎可直接消费
  5. if __name__ == "__main__":可执行入口,直接运行即可看到六种情绪的完整驱动链路输出

常见误区

误区很多初学者觉得“微笑 = 开心”,设计情绪识别时看到脸上拼出 AU12 就断定用户心情很好。

正解FACS 只描述肌肉动作,不定义情绪含义。同一个 AU12 在道歉、礼貌、尴尬里都会出现;“开心”是多种信号与上下文综合推断的结果。乐高能拼出城堡,不等于城堡就是国王的家——形状描述与语义解释是两码事。真实项目里“表情 → 情绪”需要额外建模并谨慎标注。

为何常见:六种基本表情常与六种情绪名称绑定,教材示例简化导致概念混淆。

误区初学者把十个 AU 全推到高等级,觉得“零件越多效果越丰富”,结果数字人表情狰狞。

正解真实表情是“稀疏激活 + 强度分层”:一个微笑通常只激活 2-4 个相关 AU,周边肌肉还有微妙的抑制联动。全开会掉进恐怖谷。乐高作品的美感来自结构与比例,不是砖块数量。

为何常见:误以为“参数越多越精细”,忽略了面部肌肉的协同抑制机制。

误区只做 0/1 判断,把 AU12 = 1 当作嘴角完全上扬,省掉强度估计。

正解强度等级(A-E,对应 0-5)决定表情的细腻度:AU12 强度 1 是浅笑,5 是咧嘴大笑。忽略强度,数字人只有“面瘫”和“狰狞”两档。乐高积木不仅分种类还分大小,力度分级是表情层次感的来源。

为何常见:很多开源数据集只标存在性,初学者沿用分类思维,没意识到驱动任务本质是回归。

误区卡通数字人、动物角色、二次元虚拟主播用不上 FACS,因为脸不是真肌肉。

正解FACS 描述的是肌肉运动模式而非脸部造型。卡通风格常用“风格化 AU 子集”:ARKit 的 52 个 blendshape 本身就是面向通用角色设计的简化 FACS。乐高可以拼人也可以拼恐龙,积木语言与最终造型无关。

为何常见:看到卡通脸没有真实肌肉,误以为肌肉模型失效,没理解 AU 本质是“运动单元”。

面试题

Q1. FACS 的中文全称是?

单选题 · easy

  • A.面部动作编码系统← 正确答案
  • B.人脸特征识别系统
  • C.表情纹理生成系统
  • D.肌肉骨骼模拟系统

答案:A。FACS 全称 Facial Action Coding System,核心是把表情拆成肌肉层面的动作单元(AU)。B、C、D 都是泛化的图像或建模名词,不指向这套标准化的表情编码体系。

Q2. 真笑(Duchenne 微笑)与假笑的关键区别是?

单选题 · easy

  • A.是否激活 AU6 脸颊上提← 正确答案
  • B.是否激活 AU12 嘴角上扬
  • C.是否张嘴露出上下牙齿
  • D.是否伴随眼睛大幅睁开

答案:A。真笑的标志是眼轮匝肌带动脸颊上提(AU6),假笑只有嘴角上扬(AU12)。就像乐高城堡有没有打地基,AU6 这层地基决定了笑容是否真诚。

Q3. AU4 在 FACS 编码中表示哪种动作?

单选题 · mid

  • A.眉毛下压向内收拢← 正确答案
  • B.嘴角上扬拉向两颊
  • C.眼睛紧闭挤压眼轮
  • D.下颌向下张开口腔

答案:A。AU4 是“眉毛下压”,常参与愤怒、悲伤等表情;嘴角上扬是 AU12,闭眼是 AU43,下颌下降是 AU26。记住编号就像记住乐高零件号,才能看懂配方表。

Q4. FACS 最初由哪两位心理学家提出?

单选题 · easy

  • A.埃克曼与弗里森← 正确答案
  • B.图灵与麦卡锡
  • C.辛顿与杨立昆
  • D.本吉奥与施密特

答案:A。Paul Ekman 与 Wallace Friesen 于 1978 年提出 FACS。其他选项分别是计算机科学、深度学习领域的代表人物,与面部动作编码的起源无关。

Q5. blendshape 驱动公式 V = V0 + ΣbkΔk 中,bk 表示什么?

单选题 · mid

  • A.当前帧的顶点坐标
  • B.变形目标驱动权重← 正确答案
  • C.中性脸的基础网格
  • D.光照贴图的透明度

答案:B。V 是最终网格,V0 是中性网格,Δk 是第 k 个变形目标,bk 是由 AU 强度映射来的 0-1 驱动权重。权重映射就是乐高说明书里的“每块积木用多大力”。

Q6. 以下哪些 AU 属于“惊讶”表情的典型组合?

多选题 · mid

  • A.AU1 内侧眉上提← 正确答案
  • B.AU26 下颌下降← 正确答案
  • C.AU2 外侧眉上提← 正确答案
  • D.AU4 眉毛下压

答案:ABC。惊讶的配方是 AU1+AU2+AU5+AU26:眉毛整体抬高、眼睛瞪大、下颌下降。AU4 是眉毛下压,属于愤怒/悲伤阵营,加入会把惊讶变成惊恐或皱眉。

Q7. FACS 中 AU 强度分级 A-E 与数值的对应关系是?

单选题 · mid

  • A.A-E 五级对应 1-5← 正确答案
  • B.A-D 四级对应 1-4
  • C.0-5 连续数值 0-5
  • D.0-1 归一化数值

答案:A。标准 FACS 用 A(微弱)到 E(强烈)五档,对应数值 1-5,表示同一 AU 的不同用力程度。强度分级是“积木力度”的标尺,驱动自然度全靠它。

Q8. 以下哪些手段可以缩短实时数字人的推理延迟?

多选题 · hard

  • A.模型量化压缩至 int8← 正确答案
  • B.TensorRT 算子融合← 正确答案
  • C.增加 Transformer 层数
  • D.剪枝冗余网络分支← 正确答案

答案:ABD。量化、算子融合、剪枝都是压缩推理耗时的主流手段;增加模型层数会显著提高延迟,与 33ms 预算目标背道而驰。优化要“打最大头”,先压推理再调其他。

Q9. 评估数字人表情质量时,常用指标包括哪些?

多选题 · hard

  • A.AU 检测 F1 得分← 正确答案
  • B.用户主观 MOS 评分← 正确答案
  • C.关键点数量多少
  • D.强度 ICE 相关系数← 正确答案

答案:ABD。F1 衡量 AU 识别精度,MOS 衡量自然度,ICE 衡量强度预测与标注的一致性。关键点数量是算法设计参数,不是质量指标——就像乐高零件数多不代表城堡好看。

Q10. 已测全链路延迟 35ms,其中 T_infer=18ms 占比最高,最优先的优化动作是?

单选题 · extreme

  • A.将 AU 模型量化到 int8← 正确答案
  • B.降低摄像头采集帧率
  • C.跳过每帧的光照合成
  • D.减少 blendshape 数量

答案:A。35ms 已超 33ms 预算(30fps),延迟大头是推理 18ms,量化打最大头最划算。降帧率牺牲流畅度,跳光照和减 blendshape 直接伤害视觉质量,属于丢了西瓜捡芝麻。