참고 : 이것은 독립형 아바타 인형극 프로그램이 아닌 추적 라이브러리입니다. 또한 OpenSeeFace 추적을 사용하여 VRM 및 VSFAvatar 3D 모델에 애니메이션을 적용할 수 있는 VSeeFace 작업도 진행 중입니다. VTube Studio는 웹캠 기반 추적을 위해 OpenSeeFace를 사용하여 Live2D 모델에 애니메이션을 적용합니다. Godot 엔진용 렌더러는 여기에서 찾을 수 있습니다.
이 프로젝트는 MobileNetV3를 기반으로 얼굴 랜드마크 감지 모델을 구현합니다.
Windows에서 Pytorch 1.3 CPU 추론 속도가 매우 낮기 때문에 모델을 ONNX 형식으로 변환했습니다. onnxruntime을 사용하면 단일 얼굴을 추적하여 30 - 60fps로 실행할 수 있습니다. 품질 균형을 추적하는 속도가 다른 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
사용할 수도 있습니다.
스크립트는 웹캠 입력 또는 비디오 파일에 대한 추적을 수행하고 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
추적하는 실제 얼굴 수보다 높지 않게 설정하십시오. 사전 훈련된 얼굴 랜드마크 모델 4개가 포함되어 있습니다. --model
스위치를 사용하면 추적용으로 선택할 수 있습니다. 주어진 fps 값은 단일 CPU 코어의 단일 얼굴 비디오에서 모델을 실행하기 위한 것입니다. 프레임 속도를 낮추면 해당 수준만큼 CPU 사용량이 줄어듭니다.
FPS 측정은 내 CPU의 한 코어에서 실행됩니다.
model.py
와 함께 사용하기 위한 Pytorch 가중치는 여기에서 찾을 수 있습니다. 최적화되지 않은 일부 ONNX 모델은 여기에서 찾을 수 있습니다.
추가 샘플: Results3.png, Results4.png
랜드마크 모델은 얼굴의 크기와 방향과 관련하여 매우 강력하므로 사용자 지정 얼굴 감지 모델은 다른 접근 방식보다 더 거친 경계 상자를 사용합니다. 이 프로젝트의 목적에 맞는 속도 대 정확도 비율이 좋습니다.
이 리포지토리의 릴리스 섹션에 있는 빌드에는 pyinstaller
사용하여 빌드되고 모든 필수 종속성을 포함하는 Binary
폴더 내에 facetracker.exe
가 포함되어 있습니다.
실행하려면 최소한 models
폴더가 facetracker.exe
와 같은 폴더에 있어야 합니다. 공통 상위 폴더에 배치해도 작동합니다.
배포할 때 일부 타사 라이브러리에서 정한 요구 사항을 준수하는지 확인하기 위해 Licenses
폴더도 함께 배포해야 합니다. 사용하지 않는 모델은 문제 없이 재배포된 패키지에서 제거될 수 있습니다.
릴리스 빌드에는 원격 분석이 없는 ONNX Runtime의 사용자 지정 빌드가 포함되어 있습니다.
필요한 라이브러리는 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개 포인트로 줄이고 윤곽 포인트와 코끝을 지금까지 훈련된 모델에서 예측한 포인트로 대체한 후 추가 훈련이 수행되었습니다. 이 추가 훈련은 눈과 눈썹의 피팅을 개선하기 위해 수행됩니다.
@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 코드는 여기에서 가져왔습니다.
모든 훈련에는 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
폴더에서 바이너리 빌드에 사용되는 타사 라이브러리의 라이선스를 찾을 수 있습니다.