注: これは追跡ライブラリであり、スタンドアロンのアバター人形操作プログラムではありません。また、OpenSeeFace トラッキングを使用して VRM および VSFAvatar 3D モデルをアニメーション化できる VSeeFace にも取り組んでいます。 VTube Studio は、Live2D モデルをアニメーション化するための Web カメラ ベースのトラッキングに OpenSeeFace を使用します。 Godot エンジンのレンダラはここにあります。
このプロジェクトは、MobileNetV3 に基づいて顔のランドマーク検出モデルを実装します。
Windows 上の Pytorch 1.3 CPU 推論速度が非常に遅いため、モデルは ONNX 形式に変換されました。 onnxruntime を使用すると、単一の顔を追跡しながら 30 ~ 60 fps で実行できます。品質のトレードオフを追跡する速度が異なる 4 つのモデルがあります。
興味のある人がいるなら、その名前は外海と顔を見ることをもじったものであることを知っておいてください。深い意味はありません。
最新のサンプル ビデオはここにあり、さまざまな騒音レベルや光レベルの下でのデフォルトの追跡モデルのパフォーマンスを示しています。
OpenSeeFace で使用されるランドマークは、他のアプローチで使用されるランドマークとは少し異なるため (iBUG 68 に近く、口角の点が 2 つ少なく、目に見える輪郭に沿った顔の輪郭ではなく、準 3D の顔の輪郭が使用されます)、その精度を、科学文献で一般的に見られる他のアプローチの精度と数値的に比較することは困難です。また、トラッキング パフォーマンスは、顔画像を正確に適合させるよりも、アバターをアニメーション化するのに役立つランドマークを作成するために最適化されています。たとえば、目のランドマークが目が開いているか閉じているかを示す限り、位置が多少ずれていても、この目的には依然として役立ちます。
一般的な観察から、OpenSeeFace は悪条件 (低照度、高ノイズ、低解像度) においても良好に機能し、ランドマーク位置の比較的高い安定性を備えながら、非常に広範囲の頭姿勢を通して顔を追跡し続けます。 MediaPipe と比較して、OpenSeeFace ランドマークは困難な状況でもより安定しており、より広範囲の口のポーズを正確に表現します。ただし、目の領域の追跡は精度が低くなる可能性があります。
Wood らによる「密なランドマークを使用した 3D 顔再構成」のビデオ プレゼンテーションのサンプル クリップで OpenSeeFace を実行しました。 MediaPipe とそのアプローチを比較します。結果はここで見ることができます。
VRM ベースのアバター アニメーションのサンプル Unity プロジェクトは、ここにあります。
顔の追跡自体はfacetracker.py
Python 3.7 スクリプトによって行われます。これはコマンドライン プログラムであるため、cmd から手動で起動するか、バッチ ファイルを作成して起動する必要があります。リリースをダウンロードし、Windows を使用している場合は、Python をインストールしていなくても、 Binary
フォルダー内のfacetracker.exe
実行できます。トラッカーの基本的なデモンストレーションには、 Binary
フォルダー内のrun.bat
使用することもできます。
スクリプトは、Web カメラ入力またはビデオ ファイルの追跡を実行し、UDP 経由で追跡データを送信します。この設計により、追跡情報を使用する PC とは別の PC で追跡を行うこともできます。これは、パフォーマンスを向上させ、カメラ映像が誤って公開されることを避けるのに役立ちます。
提供されるOpenSee
Unity コンポーネントは、これらの UDP パケットを受信でき、受信した情報をtrackingData
と呼ばれるパブリック フィールドを通じて提供します。 OpenSeeShowPoints
コンポーネントは、検出された顔のランドマーク ポイントを視覚化できます。これは例としても役立ちます。 OpenSee
コンポーネントの適切な活用方法については、こちらをご覧ください。その他の例はExamples
フォルダーに含まれています。 UDP パケットは別のスレッドで受信されるため、 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 shell
から実行するか、 poetry run
プレフィックスを付ける必要があります。
このようにして、追跡スクリプトは独自の追跡視覚化を出力すると同時に、Unity への追跡データの送信も示します。
付属のOpenSeeLauncher
コンポーネントを使用すると、Unity からフェイス トラッカー プログラムを起動できます。これは、バイナリ リリース バンドルで配布される pyinstaller で作成された実行可能ファイルで動作するように設計されています。次の 3 つのパブリック API 関数が提供されます。
public string[] ListCameras()
使用可能なカメラの名前を返します。配列内のカメラのインデックスは、 cameraIndex
フィールドの ID に対応します。 cameraIndex
-1
に設定すると、Web カメラのキャプチャが無効になります。public bool StartTracker()
トラッカーを開始します。すでに実行中の場合は、実行中のインスタンスをシャットダウンし、現在の設定で新しいインスタンスを起動します。public void StopTracker()
トラッカーを停止します。アプリケーションが終了するか、 OpenSeeLauncher
オブジェクトが破棄されると、トラッカーは自動的に停止します。 OpenSeeLauncher
コンポーネントは WinAPI ジョブ オブジェクトを使用して、アプリケーションがクラッシュするか終了した場合に、最初にトラッカー プロセスを終了せずにトラッカーの子プロセスを確実に終了します。
追加のカスタム コマンドライン引数は、 commandlineArguments
配列の要素に 1 つずつ追加する必要があります。たとえば、 -v 1
2 つの要素として追加する必要があります。1 つの要素には-v
が含まれ、もう 1 つは1
含まれます。両方の部分を含む 1 つの要素ではありません。
付属のOpenSeeIKTarget
コンポーネントを FinalIK または他の IK ソリューションと組み合わせて使用すると、頭の動きをアニメーション化できます。
OpenSeeExpression
コンポーネントをOpenSeeFace
コンポーネントと同じコンポーネントに追加して、特定の表情を検出できます。ユーザーごとに調整する必要があります。 Unity エディターのチェックボックスを使用するか、ソース コードにある同等のパブリック メソッドを使用して制御できます。
このシステムを調整するには、式ごとにサンプル データを収集する必要があります。キャプチャ プロセスの速度が速すぎる場合は、 recordingSkip
オプションを使用して速度を下げることができます。
一般的なプロセスは次のとおりです。
キャプチャした式のデータを削除するには、その名前を入力し、「クリア」ボックスにチェックを入れます。
トレーニングされたモデルとキャプチャされたトレーニング データの両方を保存するには、[ファイル名] フィールドにフル パスを含むファイル名を入力し、[保存] ボックスにチェックを入れます。ロードするには、ファイル名を入力し、「ロード」ボックスにチェックを入れます。
--model 3
で選択され、最も低い追跡品質を持つ最速のモデルは--model 0
です。--scan-every
フレームごとに実行されます。これにより処理が遅くなる可能性があるため、 --faces
追跡している実際の顔の数よりも大きくしないように設定してください。4 つの事前トレーニングされた顔ランドマーク モデルが含まれています。 --model
スイッチを使用すると、追跡対象にそれらを選択できます。指定された fps 値は、単一の CPU コア上の単一の顔ビデオでモデルを実行するためのものです。フレーム レートを下げると、それに応じて CPU 使用率が減少します。
FPS の測定値は、CPU の 1 つのコアで実行したものです。
model.py
で使用する Pytorch 重みはここにあります。最適化されていない ONNX モデルの一部はここにあります。
その他のサンプル: Results3.png、Results4.png
ランドマーク モデルは顔のサイズと向きに関して非常に堅牢であるため、カスタム顔検出モデルは他のアプローチよりも粗い境界ボックスで問題を解決します。このプロジェクトの目的にとって、速度と精度の比率は良好です。
このリポジトリのリリース セクションのビルドには、 pyinstaller
使用してビルドされたBinary
フォルダー内にfacetracker.exe
含まれており、必要な依存関係がすべて含まれています。
これを実行するには、少なくともmodels
フォルダーをfacetracker.exe
と同じフォルダーに配置する必要があります。共通の親フォルダーに配置しても機能するはずです。
配布するときは、一部のサードパーティ ライブラリによって定められた要件に確実に準拠するために、 Licenses
フォルダも配布する必要があります。未使用のモデルは再配布パッケージから問題なく削除できます。
リリース ビルドには、テレメトリのない ONNX ランタイムのカスタム ビルドが含まれています。
必要なライブラリは pip を使用してインストールできます。
pip install onnxruntime opencv-python pillow numpy
あるいは、詩を使用して、このプロジェクトのすべての依存関係を別の仮想環境にインストールすることもできます。
poetry install
必要なライブラリは 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 ポイントに削減し、輪郭点と鼻の先端を、この時点までにトレーニングされたモデルによって予測されたポイントに置き換えた後、追加のトレーニングが WFLW データセットに対して行われました。この追加のトレーニングは、目と眉へのフィッティングを改善するために行われます。
@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}
}
視線および瞬き検出モデルのトレーニングには、MPIGaze データセットが使用されました。さらに、トレーニング中に UnityEyes で生成された約 125,000 個の合成目が使用されました。
追加のカスタム データもトレーニング プロセス中に使用され、元のデータセットからの参照ランドマークがさまざまな問題に対処するために特定の方法で変更されていることに注意してください。オリジナルの LS3D-W および WFLW データセットだけでこれらのモデルを再現することはおそらく不可能ですが、追加のデータは再配布できません。
ヒートマップ回帰ベースの顔検出モデルは、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}
}
このアルゴリズムは以下からインスピレーションを受けています。
MobileNetV3 コードはここから取得されました。
すべてのトレーニングでは、Adaptive Wing Loss の修正バージョンが使用されました。
発現検出には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 検出はこの実装に基づいています。事前トレーニングされたモデルは、不要なランドマーク検出を削除するように変更され、解像度 640x640 の ONNX 形式に変換されました。
テストに協力してくれた皆さんに感謝します。
コードとモデルは、BSD 2 条項ライセンスに基づいて配布されます。
バイナリ ビルドに使用されるサードパーティ ライブラリのライセンスは、 Licenses
フォルダにあります。