Appearance
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 Solution、Holistic Solution、FaceMeshSolution 做面部/姿态识别)→ 归纳模块 → 滤波模块 → 整理成 CompatibleBS、VRMProxy、ARKit 等通用结构 → 驱动 VRM、Live2D、FBX、AR头套TV 等模型。
面捕程序流程图
三条流程:
主程序流程:开始 → 各模块初始化 → 相机源捕获 → Mediapipe 引擎处理流 → MediapipeAdaptor out blendshapes → 驱动模块。
Mediapipe 引擎流程:FaceMeshGraph Play → GraphRunner Initialize → CalculatorGraph Init → ImageSource Play → TextureFrameTool → 取图像数据给 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、眉毛上下、特殊表情等。
复盘结论
这个案例的核心价值,是把一次具体工程处理沉淀成可检索、可复盘、可继续扩展的技术资产。没有公开证据支撑的细节继续留在私有材料池,不进入线上页面。