OpenSeeFace
OpenSeeFace 是一款基于 CPU 的实时面部及关键点追踪库,旨在为虚拟形象驱动提供稳定的面部数据输入。它解决了在普通硬件环境下,如何低成本且高效地完成高精度面部动作捕捉的难题。即使在光线昏暗或背景嘈杂的场景中,OpenSeeFace 依然能保持较高的追踪稳定性,并能准确还原多种嘴型变化。
这款库非常适合 Unity 游戏开发者、虚拟主播技术团队以及计算机视觉研究人员。事实上,许多知名软件如 VSeeFace 和 VTube Studio 的核心追踪功能都源自 OpenSeeFace。
技术层面,OpenSeeFace 采用 MobileNetV3 模型并优化为 ONNX 格式,确保在 Windows 系统上能达到 30 至 60 帧的流畅运行。其独特的 UDP 数据传输设计,允许将追踪计算与图形渲染分离到不同设备,既提升了整体性能,也有效保护了用户的摄像头隐私。对于需要集成面部动捕功能的开发者而言,OpenSeeFace 是一个可靠且灵活的基础选择。
使用场景
一位独立游戏开发者正在为他的虚拟主播角色搭建实时面部捕捉系统,但受限于笔记本电脑的硬件配置,无法负担高性能显卡带来的功耗和发热问题。
没有 OpenSeeFace 时
- 依赖 GPU 加速的模型导致笔记本风扇狂转,游戏运行时画面严重卡顿掉帧。
- 在室内灯光不足的环境下,面部特征点频繁丢失或剧烈抖动,模型表情显得僵硬。
- 需要编写复杂的中间件代码才能将摄像头数据传入 Unity 引擎驱动 3D 模型。
- 高延迟传输导致虚拟角色的口型与语音不同步,严重影响直播互动体验。
使用 OpenSeeFace 后
- OpenSeeFace 基于 CPU 运行,完全释放了显卡资源,确保游戏后台流畅度不受影响。
- 即使在昏暗房间也能稳定追踪,面部关键点位置保持平滑,准确还原细微表情变化。
- 通过 UDP 协议直接发送数据给 Unity 组件,集成过程简单快捷,无需额外安装 Python 环境。
- 低延迟传输让虚拟角色的表情反应几乎与真人动作同步,显著提升了观众的沉浸感。
OpenSeeFace 以轻量级 CPU 方案解决了低配设备下虚拟形象实时驱动的稳定性难题。
运行环境要求
- 未说明
不需要 GPU,基于 CPU 运行
未说明

快速开始

概述
注意:这是一个跟踪库(tracking library),并非独立的虚拟角色操控程序(stand-alone avatar puppeteering program)。我也正在开发 VSeeFace,它允许使用 OpenSeeFace 跟踪来动画化 VRM 和 VSFAvatar 3D 模型。VTube Studio 使用 OpenSeeFace 进行基于网络摄像头的跟踪以动画化 Live2D 模型。Godot 引擎的渲染器可以在 这里 找到。
本项目实现了一个基于 MobileNetV3 的面部关键点检测模型(facial landmark detection model)。
由于 Pytorch 1.3 在 Windows 上的 CPU 推理速度(CPU inference speed)非常低,该模型已转换为 ONNX 格式(ONNX format)。使用 onnxruntime,它可以以 30 - 60 fps(帧每秒)的速度跟踪单张人脸。有四个模型,具有不同的速度与跟踪质量权衡。
如果有人好奇,这个名字是对“开阔海洋”(open seas)和“看见面孔”(seeing faces)的一个无厘头双关语。没有更深层的含义。
最新的示例视频可以在 这里 找到,展示了默认跟踪模型在不同噪声和光照水平下的性能。
跟踪质量
由于 OpenSeeFace 使用的关键点(landmarks)与其他方法略有不同(它们接近 iBUG 68,嘴角少了两个点,并且是准 3D 面部轮廓而不是跟随可见轮廓的面部轮廓),很难将其精度与科学文献中常见的其他方法进行数值比较。跟踪性能也更多地优化为生成对动画化虚拟角色有用的关键点,而不是精确拟合面部图像。例如,只要眼部关键点能显示眼睛是睁开还是闭合,即使位置有些偏差,它们仍然可以用于此目的。
从一般观察来看,OpenSeeFace 在恶劣条件下(低光、高噪声、低分辨率)表现良好,并且在很宽的头姿势范围内保持跟踪人脸,同时关键点位置具有较高的相对稳定性。与 MediaPipe 相比,OpenSeeFace 的关键点在挑战性条件下保持更稳定,并且能更准确地表示更广泛的面部表情。然而,眼部区域的跟踪可能不够准确。
我在 Wood 等人关于 3D Face Reconstruction with Dense Landmarks 的视频演示中的样本片段上运行了 OpenSeeFace,以将其与 MediaPipe 及其方法进行比较。你可以在 这里 观看结果。
使用方法
一个用于基于 VRM 的虚拟角色动画的示例 Unity 项目可以在 这里 找到。
面部跟踪本身由 facetracker.py Python 3.7 脚本完成。它是一个命令行程序(commandline program),因此你应该手动从 cmd 启动它或编写批处理文件(batch file)来启动它。如果你下载了发行版并在 Windows 上,你可以运行 Binary 文件夹内的 facetracker.exe,而无需安装 Python。你也可以使用 Binary 文件夹内的 run.bat 来演示跟踪器的基本功能。
该脚本将在网络摄像头输入或视频文件上执行跟踪,并通过 UDP 发送跟踪数据。这种设计还允许在与使用跟踪信息的计算机不同的另一台计算机上进行跟踪。这对于增强性能和避免意外泄露摄像头画面很有用。
提供的 OpenSee Unity 组件(Unity component)可以接收这些 UDP 数据包,并通过名为 trackingData 的公共字段(public field)提供接收到的信息。OpenSeeShowPoints 组件可以可视化检测到的人脸的关键点。它也作为一个示例。请查看它以了解如何正确使用 OpenSee 组件。更多示例包含在 Examples 文件夹中。UDP 数据包是在单独的线程(thread)中接收的,因此任何使用 OpenSee 组件 trackingData 字段的组件都应首先复制该字段并访问此副本,否则信息可能在处理过程中被覆盖。这种设计也意味着,即使 OpenSee 组件被禁用,该字段也会继续更新。
使用 --help 运行 python 脚本以了解可设置的选项。
python facetracker.py --help
可以通过在 Unity 中创建一个新场景,添加一个空的游戏对象并将 OpenSee 和 OpenSeeShowPoints 组件都添加到其中来实现简单的演示。当场景播放时,在视频文件上运行面部跟踪器:
python facetracker.py --visualize 3 --pnp-points 1 --max-threads 4 -c video.mp4
注意:如果使用 poetry 安装了依赖项,则命令必须从 poetry shell 执行,或者必须以 poetry run 开头。
这样跟踪脚本将输出其自己的跟踪可视化,同时演示跟踪数据传输到 Unity。
包含的 OpenSeeLauncher 组件允许从 Unity 启动面部跟踪程序。它是专为配合二进制发布包中分发的 pyinstaller 创建的可执行文件而设计的。它提供了三个公共 API 函数:
public string[] ListCameras()返回可用摄像头的名称。数组中摄像头的索引对应于cameraIndex字段的 ID。将cameraIndex设置为-1将禁用网络摄像头捕获。public bool StartTracker()将启动跟踪器。如果它已经在运行,它将关闭当前运行的实例并使用当前设置启动一个新实例。public void StopTracker()将停止跟踪器。当应用程序终止或OpenSeeLauncher对象被销毁时,跟踪器会自动停止。
OpenSeeLauncher 组件使用 WinAPI 作业对象(WinAPI job objects)以确保如果应用程序崩溃或在未先终止跟踪进程的情况下关闭,跟踪器子进程将被终止。
额外的自定义命令行参数(commandline arguments)应逐个添加到 commandlineArguments 数组的元素中。例如 -v 1 应作为两个元素添加,一个元素包含 -v,另一个包含 1,而不是包含两部分的一个单一元素。
包含的 OpenSeeIKTarget 组件可与 FinalIK 或其他 IK(反向动力学)解决方案结合使用,以动画化头部运动。
表情检测
OpenSeeExpression 组件可以添加到与 OpenSeeFace 组件相同的组件中,以检测特定的面部表情。它必须针对每个用户进行校准。可以通过 Unity Editor 中的复选框或源代码中可用的等效公共方法进行控制。
要校准此系统,您需要为每种表情收集示例数据。如果捕获过程太快,可以使用 recordingSkip 选项来减慢速度。
一般流程如下:
- 输入您要校准的表情名称。
- 做出该表情并保持住,然后勾选录制框。
- 保持表情并四处移动头部,将其转向各个方向。
- 过一会儿,如果该表情应与说话兼容,则在保持的同时开始说话。
- 这样做一段时间后,取消勾选录制框并开始捕获另一种表情。
- 勾选训练框,查看您收集数据的表情是否被准确检测。
- 您还应该会在组件的下半部分获得一些统计数据。
- 如果任何表情的检测有问题,请继续向其添加数据。
要删除表情的捕获数据,输入其名称并勾选“Clear”框。
要保存训练模型和捕获的训练数据,在“Filename”字段中输入包含完整路径的文件名,并勾选“Save”框。要加载它,输入文件名并勾选“Load”框。
提示
- 合理的表情数量是六个,包括中性表情。
- 在开始捕获表情之前,做一些面部动作并摆动眉毛,以预热跟踪器的特征检测部分。
- 一旦您有了一个工作良好的检测模型,在使用它时花点时间检查所有表情是否按预期工作,如果不是则添加少量数据。
通用说明
- 即使存在面部部分遮挡、眼镜或光照条件不佳的情况,跟踪似乎也相当稳健。
- 最高质量的模型通过
--model 3选择,最快但跟踪质量最低的模型是--model 0。 - 较低的跟踪质量主要意味着更刚性的跟踪,使得检测眨眼和眉毛运动更加困难。
- 取决于帧率,人脸跟踪很容易占用整个 CPU 核心。对于单张人脸 30fps,在不错的 CPU 上仍应使用不到一个核心的 100%。如果跟踪使用过多 CPU,请尝试降低帧率。20 的帧率可能没问题,高于 30 的情况很少需要。
- 当将跟踪的人脸数量设置为高于实际可见的人脸数量时,人脸检测模型将每
--scan-every帧运行一次。这可能会减慢速度,因此尝试将--faces设置为不超过您实际跟踪的人脸数量。
模型
包含了四个预训练的人脸关键点模型。使用 --model 开关,可以选择它们进行跟踪。给定的 fps 值是在单核 CPU 上运行单张人脸视频的模型性能。降低帧率会相应减少 CPU 使用量。
- 模型 -1:此模型专为烤面包机等设备运行设计,因此是一个非常非常快且精度很低的模型。(213fps,无视线跟踪)
- 模型 0:这是一个非常快、精度低的模型。(68fps)
- 模型 1:这是一个稍慢但精度更好的模型。(59fps)
- 模型 2:这是一个较慢但精度好的模型。(50fps)
- 模型 3 (默认):这是最慢但精度最高的模型。(44fps)
FPS 测量值来自在我的 CPU 的一个核心上运行。
可用于 model.py 的 Pytorch 权重可在 此处 找到。一些未优化的 ONNX 模型可在 此处 找到。
结果
关键点


更多样本:Results3.png, Results4.png
人脸检测
关键点模型对于人脸的大小和方向相当稳健,因此自定义人脸检测模型可以使用比其他方法更粗糙的边界框。它在本项目的目的中具有有利的速度与精度比。

发布构建
本仓库发布部分中的构包含一个位于 Binary 文件夹内的 facetracker.exe,该文件夹是使用 pyinstaller 构建的,并包含所有必需的依赖项。
要运行它,至少需要将 models 文件夹放置在 facetracker.exe 所在的同一文件夹中。将其放在公共父文件夹中也可以。
分发时,还应同时分发 Licenses 文件夹,以确保符合某些第三方库提出的要求。未使用的模型可以从重新分发的包中移除而不引起问题。
发布构建包含一个没有遥测功能的自定义版本 ONNX Runtime。
依赖项 (Python 3.6 - 3.9)
- ONNX Runtime
- OpenCV
- Pillow
- Numpy
所需的库可以使用 pip 安装:
pip install onnxruntime opencv-python pillow numpy
或者可以使用 poetry 在单独的虚拟环境中安装此项目的所有依赖项:
poetry install
依赖项
- onnxruntime
- OpenCV
- Pillow
- Numpy
所需的库可以使用 pip 安装:
pip install onnxruntime opencv-python pillow numpy
参考文献
训练数据集
该模型是在 LS3D-W 数据集的 66 点版本上进行训练的。
@inproceedings{bulat2017far,
title={How far are we from solving the 2D \& 3D Face Alignment problem? (and a dataset of 230,000 3D facial landmarks)},
author={Bulat, Adrian and Tzimiropoulos, Georgios},
booktitle={International Conference on Computer Vision},
year={2017}
}
在将 WFLW 数据集缩减为 66 个点,并用此前训练好的模型预测的轮廓点和鼻尖点替换原有对应点后,进行了额外的训练。进行此项额外训练是为了提高对眼睛和眉毛的拟合效果。
@inproceedings{wayne2018lab,
author = {Wu, Wayne and Qian, Chen and Yang, Shuo and Wang, Quan and Cai, Yici and Zhou, Qiang},
title = {Look at Boundary: A Boundary-Aware Face Alignment Algorithm},
booktitle = {CVPR},
month = June,
year = {2018}
}
用于训练眼动和眨眼检测模型的是 MPIIGaze 数据集。此外,训练过程中还使用了约 125000 个使用 UnityEyes 生成的合成眼睛图像。
需要注意的是,训练过程中还使用了额外的自定义数据,并且原始数据集中的参考关键点 (landmarks) 经过了一定程度的修改以解决各种问题。仅使用原始的 LS3D-W 和 WFLW 数据集可能无法复现这些模型,然而额外数据不可重新分发。
基于热力图回归 (heatmap regression) 的面部检测模型是在 WIDER FACE 数据集的随机 224x224 裁剪区域上训练的。
@inproceedings{yang2016wider,
Author = {Yang, Shuo and Luo, Ping and Loy, Chen Change and Tang, Xiaoou},
Booktitle = {IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},
Title = {WIDER FACE: A Face Detection Benchmark},
Year = {2016}
}
算法
该算法灵感来源于:
- 设计针对不同应用的神经网络架构:从面部关键点追踪到车道偏离预警系统 by YiTa Wu, ULSee 工程副总裁
- 浏览器中的实时人体姿态估计与 TensorFlow.js
- U-Net:用于生物医学图像分割的卷积网络 by Olaf Ronneberger, Philipp Fischer, Thomas Brox
- MobileNets:面向移动视觉应用的高效卷积神经网络 by Andrew G. Howard, Menglong Zhu, Bo Chen, Dmitry Kalenichenko, Weijun Wang, Tobias Weyand, Marco Andreetto, Hartwig Adam
- 搜索 MobileNetV3 by Andrew Howard, Mark Sandler, Grace Chu, Liang-Chieh Chen, Bo Chen, Mingxing Tan, Weijun Wang, Yukun Zhu, Ruoming Pang, Vijay Vasudevan, Quoc V. Le, Hartwig Adam
MobileNetV3 代码取自 此处。
所有训练均使用了修改版的 自适应翼损失 (Adaptive Wing Loss)。
- 自适应翼损失用于通过热力图回归实现鲁棒的面部对齐 by Xinyao Wang, Liefeng Bo, Li Fuxin
表情检测使用了 LIBSVM。
面部检测使用自定义的热力图回归面部检测模型或 RetinaFace 完成。
@inproceedings{deng2019retinaface,
title={RetinaFace: Single-stage Dense Face Localisation in the Wild},
author={Deng, Jiankang and Guo, Jia and Yuxiang, Zhou and Jinke Yu and Irene Kotsia and Zafeiriou, Stefanos},
booktitle={arxiv},
year={2019}
}
RetinaFace 检测基于 此 实现。预训练模型经过修改,移除了不必要的关键点检测,并转换为 ONNX 格式,分辨率为 640x640。
致谢!
非常感谢所有帮助我测试的人!
- @Virtual_Deat,他也激励我开始这项工作。
- @ENiwatori 及其家人。
- @ArgamaWitch
- @AngelVayuu
- @DapperlyYours
- @comdost_art
- @Ponoki_Chan
许可证
代码和模型均在 BSD 2-Clause 许可证下分发。
你可以在 Licenses 文件夹中找到用于二进制构建的第三方库的许可证。
版本历史
v1.20.42021/09/17v1.20.32021/08/07v1.20.22020/12/13v1.20.12020/12/07v1.20.02020/11/28v1.19.02020/10/16v1.18.32020/10/08v1.18.22020/10/05v1.17.02020/09/29v1.16.02020/09/05v1.15.32020/08/21v1.15.22020/08/17v1.15.12020/08/11v1.15.02020/08/10v1.14.22020/08/08v1.14.02020/08/06v1.13.02020/03/30v1.12.02020/03/28v1.11.02020/03/22v1.10.02020/03/08常见问题
相似工具推荐
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
NextChat
NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。
ML-For-Beginners
ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。
ragflow
RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。