emilianavt/OpenSeeFace
Robust realtime face and facial landmark tracking on CPU with Unity integration
OpenSeeFace – アバターアニメーションのためのリアルタイム・フェイシャルランドマークトラッカー
概要 – OpenSeeFaceは、Webカメラやビデオストリームから66個の顔のランドマーク(および視線と瞬きの情報)を検出する、軽量でクロスプラットフォームなライブラリです。コアモデルはMobileNetV3ベースのニューラルネットワークをONNXにエクスポートしたもので、onnxruntimeを使用してCPU上で高速に動作します(シングルコアで30〜60 fps)。これは完全なアバター操作アプリではなく、追跡データをUDP経由でストリーミングすることで、他のプログラム(Unity、Godot、VSeeFace、VTube Studioなど)が3D/2Dアバターをアニメーション化できるようにするものです。
重要性 – リアルタイムのアバター操作には、ノイズの多い照明、低解像度、幅広い頭部のポーズ下でも動作する、安定した低遅延のフェイシャルランドマークが必要です。OpenSeeFaceは、ピンポイントの精度を多少犠牲にして堅牢性と速度を優先しており、ライブ配信、VTubing、その他CPUリソースが限られたインタラクティブメディアに適しています。
主な機能
| 機能 | 詳細 |
|---|---|
| フェイシャルランドマークモデル | 66点(iBUG-68に近い)および準3D輪郭点。目の開閉、視線、瞬きのキューを含みます。 |
| モデルバリエーション | 5つの事前学習済みモデル(-1 … 3)。超高速/低精度から低速/高精度まで(CPUコア1つで約213 fps → 44 fps)。 |
| ONNX Runtime推論 | GPUなしでWindows、Linux、macOS上で動作。Windows用にはビルド済みの facetracker.exe が提供されています。 |
| UDP出力 | フレームごとのランドマークデータをバイナリパケットとして送信。キャプチャPCを分離するために別のマシンで受信可能です。 |
| Unity統合 | OpenSee、OpenSeeShowPoints、OpenSeeLauncher、OpenSeeIKTarget、OpenSeeExpression コンポーネントが、パケット受信、可視化、IK駆動、ユーザーごとの表情トレーニングを処理します。 |
| クロス言語サポート | トラッカーはPython 3スクリプト (facetracker.py) であり、直接実行またはコンパイル済み実行ファイル経由で動作。依存関係は最小限 (onnxruntime, OpenCV, Pillow, NumPy)。 |
| 表情分類器 | オプションのSVMベースの表情検出器。ユーザーごとにキャリブレーションし、保存/読み込みが可能。 |
| 堅牢性 | 部分的な遮蔽、眼鏡、低照度、広い頭部ポーズ範囲に対応。顔検出にはカスタムヒートマップ回帰モデルまたはRetinaFaceを使用。 |
標準的なワークフロー
- トラッカーの起動 –
facetracker.exe(Windows) またはpython facetracker.py(任意のOS) を実行。カメラまたはビデオファイルを選択し、モデル (--model 0-3) を指定。必要に応じて--visualizeを有効にしてローカルでランドマークを確認します。 - データストリーミング – スクリプトはランドマーク座標(およびオプションの視線/瞬きフラグ)を含むUDPパケットを送信します。
- Unityでの利用 –
OpenSeeコンポーネントをGameObjectに追加。バックグラウンドスレッドでパケットを受信し、trackingDataを介して公開します。OpenSeeShowPointsでポイントを可視化するか、VRM/Live2Dアバターコントローラーにデータを供給します。 - オプションの表情トレーニング –
OpenSeeExpressionを追加し、表情ごとにいくつかの例を記録してSVMをトレーニングし、アバターロジック内でIsExpressionActive("smile")をクエリします。
強み
- CPUのみのリアルタイム性能 – GPU不要。低スペックのノートPCや配信環境に適しています。
- 悪条件下での堅牢性 – 低照度、ノイズ、部分的な遮蔽下において、多くのアバター向けソリューション(MediaPipeなど)よりも優れた性能を発揮します。
- モジュール設計 – UDPストリーミングにより、キャプチャとレンダリングを分離でき、遅延のスパイクを抑え、カメラのプライバシーを保護します。
- 複数のモデルサイズ – 多人数用には高速なモデル、一人用配信には高品質なモデルを選択可能です。
- オープンソースかつ寛容なライセンス – BSD-2-clauseライセンスで、商用プロジェクトへの組み込みが容易です。
制限事項
- 目元の精度 – 目周辺のランドマーク位置は、専用の視線トラッカーほど正確ではありません。瞬き検出は機能しますが、詳細な視線追跡はジッターが発生する可能性があります。
- CPU負荷 – 30 fpsで1つの顔を追跡すると、CPUコアをほぼ1つ占有します。フレームレートが高い場合や複数の顔を追跡する場合は、使用量が増加します。
- アバターレンダラー非搭載 – Unity/Unreal/Godotとの統合は自身で行う必要があります(サンプルプロジェクトは提供されていますが、完全なエンドユーザーアプリではありません)。
- Linuxでのonnxruntime読み込み – 一部のユーザーは、ライブラリを読み込むために実行ファイルのスタック調整 (
execstack -c …) が必要になる場合があります。
クイックスタート
# 依存関係のインストール (uvを推奨)
uv sync --locked # 仮想環境の作成
uv run facetracker.py --visualize 3 -c 0 # Webカメラ, モデル3, ランドマーク表示
Unityでの手順:
- 空のGameObjectを作成。
OpenSeeおよびOpenSeeShowPointsコンポーネントを追加。- Playを押すとトラッカーが起動します(または
OpenSeeLauncherで手動起動)。
ライセンス
コードと事前学習済みモデルは BSD 2-clause ライセンスの下でリリースされています。サードパーティライブラリのライセンスは、リリースバイナリの Licenses フォルダに含まれています。
詳細情報
- Unityサンプルプロジェクト – https://github.com/emilianavt/OpenSeeFaceSample
- デモ動画 – https://www.youtube.com/watch?v=AaNap_ud_3I
- 関連アバター操作アプリ – VSeeFace (https://www.vseeface.icu/) はOpenSeeFaceのデータを利用します。
関連
- プロジェクト
- プロジェクト
- プロジェクト
- プロジェクト