注意:這是一個追蹤庫,而不是獨立的頭像操縱程式。我還在開發 VSeeFace,它允許使用 OpenSeeFace 追蹤對 VRM 和 VSFAvatar 3D 模型進行動畫處理。 VTube Studio 使用 OpenSeeFace 進行基於網路攝影機的追蹤來製作 Live2D 模型動畫。可以在此處找到 Godot 引擎的渲染器。
該專案實現了基於MobileNetV3的臉部標誌偵測模型。
由於Pytorch 1.3 CPU在Windows上的推理速度很低,因此將模型轉換為ONNX格式。使用 onnxruntime,它可以以 30 - 60 fps 的速度運行,追蹤單個臉部。有四種模型,以不同的速度來追蹤品質權衡。
如果有人好奇的話,這個名字是一個愚蠢的雙關語,指的是公海和看到面孔。沒有什麼更深層的意義。
您可以在此處找到最新的範例視頻,其中顯示了預設追蹤模型在不同噪音和光照水平下的性能。
由於 OpenSeeFace 使用的標誌與其他方法使用的標誌有點不同(它們接近 iBUG 68,嘴角少了兩個點,並且是準 3D 面部輪廓,而不是遵循可見輪廓的面部輪廓),因此很難將其準確性與科學文獻中常見的其他方法進行數值比較。追蹤性能也針對製作對動畫化身動畫有用的地標進行了更優化,而不是精確擬合臉部圖像。例如,只要眼睛標誌顯示眼睛是睜開還是閉上,即使它們的位置有些偏離,它們仍然可以用於此目的。
從一般觀察來看,OpenSeeFace 在不利條件下(弱光、高噪音、低解析度)表現良好,並且透過非常廣泛的頭部姿勢持續追蹤人臉,並且地標位置的穩定性相對較高。與 MediaPipe 相比,OpenSeeFace 地標在具有挑戰性的條件下保持更穩定,並且它準確地代表了更廣泛的嘴部姿勢。然而,眼睛區域的追蹤可能不太準確。
我在 Wood 等人的 3D Face Reconstruction with Dense Landmarks 影片示範中的範例剪輯上執行了 OpenSeeFace。將其與 MediaPipe 及其方法進行比較。您可以在此處查看結果。
您可以在此處找到基於 VRM 的頭像動畫的 Unity 範例專案。
臉部追蹤本身是由facetracker.py
Python 3.7 腳本完成的。它是一個命令列程序,因此您應該從cmd手動啟動它或編寫批次檔來啟動它。如果您下載了一個版本並且使用的是 Windows,則可以在Binary
資料夾中執行facetracker.exe
,而無需安裝 Python。您也可以使用Binary
資料夾中的run.bat
來進行追蹤器的基本示範。
該腳本將對網路攝影機輸入或視訊檔案執行跟踪,並透過 UDP 發送追蹤資料。這種設計還允許在與使用追蹤資訊的電腦不同的 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 創建的可執行檔一起使用,該執行檔分佈在二進位發行包中。它提供了三個公開API函數:
public string[] ListCameras()
傳回可用攝影機的名稱。陣列中相機的索引對應於它的cameraIndex
欄位的ID。將cameraIndex
設定為-1
將停用網路攝影機擷取。public bool StartTracker()
將啟動追蹤器。如果它已經在運行,它將關閉正在運行的實例並使用當前設定啟動新實例。public void StopTracker()
將停止追蹤器。當應用程式終止或OpenSeeLauncher
物件被銷毀時,追蹤器會自動停止。 OpenSeeLauncher
元件使用 WinAPI 作業物件來確保如果應用程式崩潰或關閉而未先終止追蹤器進程,則追蹤器子進程也會終止。
其他自訂命令列參數應一一加入到commandlineArguments
數組的元素中。例如, -v 1
應作為兩個元素添加,一個元素包含-v
,另一個元素包含1
,而不是單個元素包含這兩個部分。
隨附的OpenSeeIKTarget
組件可與 FinalIK 或其他 IK 解決方案結合使用,以製作頭部運動動畫。
可以將OpenSeeExpression
組件添加到與OpenSeeFace
組件相同的組件中,以檢測特定的面部表情。它必須針對每個用戶進行校準。它可以透過 Unity 編輯器中的複選框或透過其原始程式碼中的等效公共方法進行控制。
要校準該系統,您必須收集每個表達式的範例資料。如果捕捉過程進行得太快,您可以使用recordingSkip
選項來減慢速度。
大致流程如下:
若要刪除表達式擷取的數據,請輸入其名稱並勾選「清除」方塊。
若要儲存經過訓練的模型和擷取的訓練數據,請在「檔案名稱」欄位中輸入包含完整路徑的檔案名,然後勾選「儲存」方塊。要載入它,請輸入檔案名稱並勾選“載入”方塊。
--model 3
選擇最高品質的模型,追蹤品質最低的最快模型是--model 0
。--scan-every
畫面中運行。這可能會減慢速度,因此請嘗試將--faces
設定為不高於您正在追蹤的實際臉孔數量。包括四個預先訓練的臉部標誌模型。使用--model
開關,可以選擇它們進行追蹤。給定的 fps 值適用於在單一 CPU 核心上的單面視訊上運行模型。降低幀率會相應減少CPU使用率。
FPS 測量是在我的 CPU 的一個核心上運行的。
可以在此處找到與model.py
一起使用的 Pytorch 權重。可以在此處找到一些未優化的 ONNX 模型。
更多範例:Results3.png、Results4.png
地標模型在臉部的大小和方向方面非常穩健,因此自訂臉部偵測模型比其他方法更粗糙的邊界框。就該專案而言,它具有良好的速度與準確率。
此儲存庫的發佈部分中的建置在Binary
資料夾中包含一個facetracker.exe
,該資料夾是使用pyinstaller
的,並包含所有必需的依賴項。
要運行它,至少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}
}
為了訓練凝視和眨眼偵測模型,使用了 MPIIGaze 資料集。此外,訓練期間使用了 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 程式碼取自此處。
所有訓練均使用自適應翼損的修改版本。
對於表達檢測,使用 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
夾中找到用於二進位建置的第三方程式庫的授權。