Skip to content

Mediapipe 面捕解算器

基于 Mediapipe 478 点位数据,自研面部解算器,采用卡尔曼滤波与低通滤波,输出稳定可靠的 15 个 BlendShape。

背景

B 站要做 3D 虚拟人直播。面捕是最核心的模块。调研期间,在开源面捕引擎中,Mediapipe 兼顾面捕+动捕、支持多端,选择它作为自研引擎的基础。

整体流程

Mediapipe 引擎 → 输出 478 个面部关键点位

面捕解算器(自研核心) → 将点位数据转换为 15 个 BlendShape

ModelDriver → 驱动 VRM / Live2D / AR 头套等模型

我负责的是面捕解算器这一层——连接点位数据到模型驱动。

关键技术难点

难点 1:头部旋转推导

Mediapipe 只提供点位坐标,不提供旋转角。需要从关键点位推算头部旋转。

关键点位(鼻尖、眼角、嘴角) → 计算头部的 pitch/yaw/roll

推导出的旋转值不能直接应用到模型的 Head Bone,需要将模型的 localRotation 矩阵映射到 worldRotation 矩阵。

难点 2:BlendShape 推导

Mediapipe 只给坐标,不给表情。需要从坐标反推表情值。

眨眼推导

关键点位(上下眼睑距离) → 分段函数(眼睛开合度阈值)
  → 卡尔曼滤波(平滑抖动) → 低通滤波(去高频噪声)
  → Lerp 插值(平滑过渡) → 输出稳定的 Blink BS 值

15 个 BlendShape:眨眼(Blink)、张嘴(A)、微笑(I)、噘嘴(U)、嘟嘴(O)、噘嘴(E)、眼珠 X/Y、眉毛上下、特殊表情等。

算法细节

卡尔曼滤波

  • 对关键点位坐标做卡尔曼滤波,消除摄像头噪声和光照抖动
  • 预测步骤 + 更新步骤的标准卡尔曼实现

低通滤波

  • 对 BS 输出值做低通滤波
  • 过滤高频抖动(头动、摄像头帧间差异导致的 BS 跳跃)

眨眼分段函数

python
def blink_func(eye_aspect_ratio):
    if ear < OPEN_THRESHOLD:  # 眼睛闭合中
        return lerp(0, 1, (ear - CLOSED) / (OPEN_THRESHOLD - CLOSED))
    else:  # 眼睛完全睁开
        return 0

效果

  • PC 端从 2022-04-21 上线至今稳定运行
  • 移动端从 2022-08-31 上线
  • 面捕模块 CPU 占用从 50% 降至 10%
  • 已在 A 级项目 3D 虚拟开播和 Z-star 落地
  • 相关专利:基于 Mediapipe 面部捕捉算法(已提交审核)

展望(当时)

  • BS 从 15 个增加到 52 个
  • 滤波器进一步优化低延时和稳定性

架构图说明

面捕开发技术架构图

整体分为驱动层、应用层、数据层、基础服务层、输入层、运行层,由右侧的 CaptureFrameWork 贯穿支撑。

数据流:真实相机源、虚拟相机源、视频源、图片源 → 相机模块 → Mediapipe 运行层(Iris SolutionHolistic SolutionFaceMeshSolution 做面部/姿态识别)→ 归纳模块 → 滤波模块 → 整理成 CompatibleBSVRMProxyARKit 等通用结构 → 驱动 VRMLive2DFBXAR头套TV 等模型。

面捕程序流程图

三条流程:

主程序流程:开始 → 各模块初始化 → 相机源捕获 → Mediapipe 引擎处理流 → MediapipeAdaptor out blendshapes → 驱动模块。

Mediapipe 引擎流程FaceMeshGraph PlayGraphRunner InitializeCalculatorGraph InitImageSource PlayTextureFrameTool → 取图像数据给 Mediapipe 处理 → 输出 Landmarks

归纳模块流程Adaptor 接收 Landmarks → 归纳模块 → 滤波模块 → 输出 blendshapes → 执行驱动操作。关键控制点:初始化是否完成、相机帧是否可用、Landmarks 是否有效、归纳/滤波后能否稳定输出。

公开版深化

案例定位

Mediapipe 面捕解算器不是孤立笔记,而是虚拟人技术能力下的一个可复用案例。它服务于“虚拟人技术与实时渲染”这条主线,公开版重点保留问题抽象、工程取舍和可复用方法,不暴露内部系统细节。

关键问题

基于 Mediapipe 478 点位数据,自研面部解算器,采用卡尔曼滤波与低通滤波,输出稳定可靠的 15 个 BlendShape。

这篇文章已经覆盖 背景、整体流程、关键技术难点、算法细节、效果、展望(当时)。后续阅读时应重点看三件事:问题如何被定义,方案如何在约束下落地,以及哪些经验可以迁移到下一次类似项目。

企业级产出

产出公开表达
问题定义用用户体验、性能、稳定性或交付效率描述影响
技术方案保留架构、流程、算法和工具链层面的抽象
指标证据只使用页面已有数字或经过脱敏审查的量级
复用方法沉淀为 SOP、检查清单、图谱关系或后续案例链接

指标与证据

  • 基于 Mediapipe 478 点位数据,自研面部解算器,采用卡尔曼滤波与低通滤波,输出稳定可靠的 15 个 BlendShape。
  • Mediapipe 引擎 → 输出 478 个面部关键点位
  • 面捕解算器(自研核心) → 将点位数据转换为 15 个 BlendShape
  • 15 个 BlendShape:眨眼(Blink)、张嘴(A)、微笑(I)、噘嘴(U)、嘟嘴(O)、噘嘴(E)、眼珠 X/Y、眉毛上下、特殊表情等。

复盘结论

这个案例的核心价值,是把一次具体工程处理沉淀成可检索、可复盘、可继续扩展的技术资产。没有公开证据支撑的细节继续留在私有材料池,不进入线上页面。

公开版深化

案例定位

Mediapipe 面捕解算器不是孤立笔记,而是虚拟人技术能力下的一个可复用案例。它服务于“虚拟人技术与实时渲染”这条主线,公开版重点保留问题抽象、工程取舍和可复用方法,不暴露内部系统细节。

关键问题

基于 Mediapipe 478 点位数据,自研面部解算器,采用卡尔曼滤波与低通滤波,输出稳定可靠的 15 个 BlendShape。

这篇文章已经覆盖 背景、整体流程、关键技术难点、算法细节、效果、展望(当时)。后续阅读时应重点看三件事:问题如何被定义,方案如何在约束下落地,以及哪些经验可以迁移到下一次类似项目。

企业级产出

产出公开表达
问题定义用用户体验、性能、稳定性或交付效率描述影响
技术方案保留架构、流程、算法和工具链层面的抽象
指标证据只使用页面已有数字或经过脱敏审查的量级
复用方法沉淀为 SOP、检查清单、图谱关系或后续案例链接

指标与证据

  • 基于 Mediapipe 478 点位数据,自研面部解算器,采用卡尔曼滤波与低通滤波,输出稳定可靠的 15 个 BlendShape。
  • Mediapipe 引擎 → 输出 478 个面部关键点位
  • 面捕解算器(自研核心) → 将点位数据转换为 15 个 BlendShape
  • 15 个 BlendShape:眨眼(Blink)、张嘴(A)、微笑(I)、噘嘴(U)、嘟嘴(O)、噘嘴(E)、眼珠 X/Y、眉毛上下、特殊表情等。

复盘结论

这个案例的核心价值,是把一次具体工程处理沉淀成可检索、可复盘、可继续扩展的技术资产。没有公开证据支撑的细节继续留在私有材料池,不进入线上页面。

公开版深化

案例定位

Mediapipe 面捕解算器不是孤立笔记,而是虚拟人技术能力下的一个可复用案例。它服务于“虚拟人技术与实时渲染”这条主线,公开版重点保留问题抽象、工程取舍和可复用方法,不暴露内部系统细节。

关键问题

基于 Mediapipe 478 点位数据,自研面部解算器,采用卡尔曼滤波与低通滤波,输出稳定可靠的 15 个 BlendShape。

这篇文章已经覆盖 背景、整体流程、关键技术难点、算法细节、效果、展望(当时)。后续阅读时应重点看三件事:问题如何被定义,方案如何在约束下落地,以及哪些经验可以迁移到下一次类似项目。

企业级产出

产出公开表达
问题定义用用户体验、性能、稳定性或交付效率描述影响
技术方案保留架构、流程、算法和工具链层面的抽象
指标证据只使用页面已有数字或经过脱敏审查的量级
复用方法沉淀为 SOP、检查清单、图谱关系或后续案例链接

指标与证据

  • 基于 Mediapipe 478 点位数据,自研面部解算器,采用卡尔曼滤波与低通滤波,输出稳定可靠的 15 个 BlendShape。
  • Mediapipe 引擎 → 输出 478 个面部关键点位
  • 面捕解算器(自研核心) → 将点位数据转换为 15 个 BlendShape
  • 15 个 BlendShape:眨眼(Blink)、张嘴(A)、微笑(I)、噘嘴(U)、嘟嘴(O)、噘嘴(E)、眼珠 X/Y、眉毛上下、特殊表情等。

复盘结论

这个案例的核心价值,是把一次具体工程处理沉淀成可检索、可复盘、可继续扩展的技术资产。没有公开证据支撑的细节继续留在私有材料池,不进入线上页面。

企业级技术案例库 · 内容先审计再发布