Catatan : Ini adalah perpustakaan pelacakan, bukan program dalang avatar yang berdiri sendiri. Saya juga sedang mengerjakan VSeeFace, yang memungkinkan animasi model VRM dan VSFAvatar 3D dengan menggunakan pelacakan OpenSeeFace. VTube Studio menggunakan OpenSeeFace untuk pelacakan berbasis webcam untuk menganimasikan model Live2D. Penyaji untuk mesin Godot dapat ditemukan di sini.
Proyek ini mengimplementasikan model deteksi landmark wajah berdasarkan MobileNetV3.
Karena kecepatan inferensi CPU Pytorch 1.3 di Windows sangat rendah, model diubah ke format ONNX. Menggunakan onnxruntime dapat berjalan pada 30 - 60 fps melacak satu wajah. Ada empat model, dengan kecepatan berbeda untuk melacak trade-off kualitas.
Kalau ada yang penasaran, namanya adalah plesetan konyol di laut lepas dan melihat wajah. Tidak ada makna yang lebih dalam.
Contoh video terbaru dapat ditemukan di sini, menunjukkan kinerja model pelacakan default di bawah tingkat kebisingan dan cahaya yang berbeda.
Karena penanda yang digunakan oleh OpenSeeFace sedikit berbeda dari yang digunakan oleh pendekatan lain (dekat dengan iBUG 68, dengan dua titik lebih sedikit di sudut mulut dan kontur wajah kuasi-3D daripada kontur wajah yang mengikuti garis luar yang terlihat), maka penanda tersebut adalah sulit untuk membandingkan keakuratannya secara numerik dengan pendekatan lain yang umum ditemukan dalam literatur ilmiah. Performa pelacakannya juga lebih optimal untuk membuat landmark yang berguna untuk menganimasikan avatar dibandingkan untuk menyesuaikan gambar wajah secara tepat. Misalnya, selama penanda mata menunjukkan apakah mata sedang terbuka atau tertutup, meskipun lokasinya agak melenceng, penanda tersebut masih dapat berguna untuk tujuan ini.
Dari pengamatan umum, OpenSeeFace bekerja dengan baik dalam kondisi buruk (cahaya redup, kebisingan tinggi, resolusi rendah) dan terus melacak wajah melalui berbagai pose kepala dengan stabilitas posisi landmark yang relatif tinggi. Dibandingkan dengan MediaPipe, landmark OpenSeeFace tetap lebih stabil dalam kondisi menantang dan secara akurat mewakili rentang pose mulut yang lebih luas. Namun, pelacakan wilayah mata bisa jadi kurang akurat.
Saya menjalankan OpenSeeFace pada klip sampel dari presentasi video untuk Rekonstruksi Wajah 3D dengan Landmark Padat oleh Wood dkk. untuk membandingkannya dengan MediaPipe dan pendekatannya. Anda dapat melihat hasilnya di sini.
Contoh proyek Unity untuk animasi avatar berbasis VRM dapat ditemukan di sini.
Pelacakan wajah sendiri dilakukan dengan skrip facetracker.py
Python 3.7. Ini adalah program baris perintah, jadi Anda harus memulainya secara manual dari cmd atau menulis file batch untuk memulainya. Jika Anda mengunduh rilis dan menggunakan Windows, Anda dapat menjalankan facetracker.exe
di dalam folder Binary
tanpa menginstal Python. Anda juga dapat menggunakan run.bat
di dalam folder Binary
untuk demonstrasi dasar pelacak.
Script akan melakukan pelacakan pada input webcam atau file video dan mengirimkan data pelacakan melalui UDP. Desain ini juga memungkinkan pelacakan dilakukan pada PC terpisah dari orang yang menggunakan informasi pelacakan. Hal ini dapat berguna untuk meningkatkan kinerja dan menghindari pengungkapan rekaman kamera secara tidak sengaja.
Komponen OpenSee
Unity yang disediakan dapat menerima paket UDP ini dan menyediakan informasi yang diterima melalui bidang publik yang disebut trackingData
. Komponen OpenSeeShowPoints
dapat memvisualisasikan titik-titik landmark dari wajah yang terdeteksi. Ini juga berfungsi sebagai contoh. Silakan melihatnya untuk mengetahui cara menggunakan komponen OpenSee
dengan benar. Contoh lebih lanjut disertakan dalam folder Examples
. Paket UDP diterima dalam thread terpisah, sehingga komponen apa pun yang menggunakan bidang trackingData
pada komponen OpenSee
harus terlebih dahulu menyalin bidang tersebut dan mengakses salinan ini, karena jika tidak, informasi tersebut mungkin akan ditimpa selama pemrosesan. Desain ini juga berarti bahwa kolom tersebut akan terus diperbarui, meskipun komponen OpenSee
dinonaktifkan.
Jalankan skrip python dengan --help
untuk mempelajari kemungkinan opsi yang dapat Anda atur.
python facetracker.py --help
Demonstrasi sederhana dapat dilakukan dengan membuat scene baru di Unity, menambahkan objek game kosong dan komponen OpenSee
dan OpenSeeShowPoints
ke dalamnya. Saat adegan diputar, jalankan pelacak wajah pada file video:
python facetracker.py --visualize 3 --pnp-points 1 --max-threads 4 -c video.mp4
Catatan : Jika dependensi dipasang menggunakan puisi, perintah harus dijalankan dari poetry shell
atau harus diawali dengan poetry run
.
Dengan cara ini skrip pelacakan akan mengeluarkan visualisasi pelacakannya sendiri sekaligus mendemonstrasikan transmisi data pelacakan ke Unity.
Komponen OpenSeeLauncher
yang disertakan memungkinkan memulai program pelacak wajah dari Unity. Ini dirancang untuk bekerja dengan pyinstaller yang dibuat dapat dieksekusi dan didistribusikan dalam bundel rilis biner. Ini menyediakan tiga fungsi API publik:
public string[] ListCameras()
mengembalikan nama kamera yang tersedia. Indeks kamera dalam array sesuai dengan ID-nya untuk bidang cameraIndex
. Menyetel indeks cameraIndex
ke -1
akan menonaktifkan pengambilan webcam.public bool StartTracker()
akan memulai pelacak. Jika sudah berjalan, instance yang sedang berjalan akan dimatikan dan memulai instance baru dengan pengaturan saat ini.public void StopTracker()
akan menghentikan pelacak. Pelacak dihentikan secara otomatis ketika aplikasi dihentikan atau objek OpenSeeLauncher
dimusnahkan. Komponen OpenSeeLauncher
menggunakan objek pekerjaan WinAPI untuk memastikan bahwa proses anak pelacak dihentikan jika aplikasi mengalami crash atau ditutup tanpa menghentikan proses pelacak terlebih dahulu.
Argumen baris perintah khusus tambahan harus ditambahkan satu per satu ke dalam elemen array commandlineArguments
. Misalnya -v 1
harus ditambahkan sebagai dua elemen, satu elemen berisi -v
dan satu lagi berisi 1
, bukan satu elemen pun yang berisi kedua bagian.
Komponen OpenSeeIKTarget
yang disertakan dapat digunakan bersama dengan FinalIK atau solusi IK lainnya untuk menganimasikan gerakan kepala.
Komponen OpenSeeExpression
dapat ditambahkan ke komponen yang sama dengan komponen OpenSeeFace
untuk mendeteksi ekspresi wajah tertentu. Itu harus dikalibrasi berdasarkan per pengguna. Itu dapat dikontrol baik melalui kotak centang di Unity Editor atau melalui metode publik setara yang dapat ditemukan di kode sumbernya.
Untuk mengkalibrasi sistem ini, Anda harus mengumpulkan contoh data untuk setiap ekspresi. Jika proses pengambilan berjalan terlalu cepat, Anda dapat menggunakan opsi recordingSkip
untuk memperlambatnya.
Proses umumnya adalah sebagai berikut:
Untuk menghapus data yang diambil untuk suatu ekspresi, ketikkan namanya dan centang kotak "Hapus".
Untuk menyimpan model yang dilatih dan data pelatihan yang diambil, ketikkan nama file termasuk jalur lengkapnya di bidang "Nama File" dan centang kotak "Simpan". Untuk memuatnya, masukkan nama file dan centang kotak "Muat".
--model 3
, model tercepat dengan kualitas pelacakan terendah adalah --model 0
.--scan-every
frame. Hal ini dapat memperlambat segalanya, jadi cobalah untuk mengatur --faces
tidak lebih tinggi dari jumlah wajah sebenarnya yang Anda lacak. Empat model landmark wajah yang telah dilatih sebelumnya disertakan. Dengan menggunakan tombol --model
, dimungkinkan untuk memilihnya untuk dilacak. Nilai fps yang diberikan adalah untuk menjalankan model pada video wajah tunggal pada inti CPU tunggal. Menurunkan kecepatan bingkai akan mengurangi penggunaan CPU hingga tingkat tertentu.
Pengukuran FPS berasal dari berjalan pada satu inti CPU saya.
Bobot Pytorch untuk digunakan dengan model.py
dapat ditemukan di sini. Beberapa model ONNX yang belum dioptimalkan dapat ditemukan di sini.
Sampel lainnya: Hasil3.png, Hasil4.png
Model landmark cukup kuat dalam hal ukuran dan orientasi wajah, sehingga model deteksi wajah kustom dapat mengatasi kotak pembatas yang lebih kasar dibandingkan pendekatan lainnya. Ini memiliki rasio kecepatan dan akurasi yang menguntungkan untuk keperluan proyek ini.
Build di bagian rilis repositori ini berisi facetracker.exe
di dalam folder Binary
yang dibuat menggunakan pyinstaller
dan berisi semua dependensi yang diperlukan.
Untuk menjalankannya, setidaknya folder models
harus ditempatkan di folder yang sama dengan facetracker.exe
. Menempatkannya di folder induk umum juga bisa berfungsi.
Saat mendistribusikannya, Anda juga harus mendistribusikan folder Licenses
bersamanya untuk memastikan Anda mematuhi persyaratan yang ditetapkan oleh beberapa perpustakaan pihak ketiga. Model yang tidak digunakan dapat dihapus dari paket yang didistribusikan ulang tanpa masalah.
Versi rilis berisi versi kustom ONNX Runtime tanpa telemetri.
Perpustakaan yang diperlukan dapat diinstal menggunakan pip:
pip install onnxruntime opencv-python pillow numpy
Atau puisi dapat digunakan untuk menginstal semua dependensi untuk proyek ini dalam virtual env terpisah:
poetry install
Perpustakaan yang diperlukan dapat diinstal menggunakan pip:
pip install onnxruntime opencv-python pillow numpy
Model dilatih pada set data LS3D-W versi 66 poin.
@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}
}
Pelatihan tambahan telah dilakukan pada dataset WFLW setelah dikurangi menjadi 66 titik dan mengganti titik kontur dan ujung hidung dengan titik yang diprediksi oleh model yang dilatih hingga saat ini. Pelatihan tambahan ini dilakukan untuk meningkatkan kesesuaian pada mata dan alis.
@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}
}
Untuk melatih model deteksi tatapan dan kedipan, dataset MPIIGaze digunakan. Selain itu, sekitar 125.000 mata sintetis yang dihasilkan dengan UnityEyes digunakan selama pelatihan.
Perlu dicatat bahwa data khusus tambahan juga digunakan selama proses pelatihan dan bahwa acuan referensi dari kumpulan data asli telah dimodifikasi dengan cara tertentu untuk mengatasi berbagai masalah. Kemungkinan besar model ini tidak dapat direproduksi hanya dengan kumpulan data LS3D-W dan WFLW asli, namun data tambahan tidak dapat didistribusikan ulang.
Model deteksi wajah berbasis regresi peta panas dilatih pada pemotongan acak 224x224 dari kumpulan data WIDER FACE.
@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}
}
Algoritma ini terinspirasi oleh:
Kode MobileNetV3 diambil dari sini.
Untuk semua pelatihan, versi modifikasi dari Adaptive Wing Loss digunakan.
Untuk deteksi ekspresi, LIBSVM digunakan.
Deteksi wajah dilakukan menggunakan model deteksi wajah berbasis regresi peta panas khusus atau 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}
}
Deteksi RetinaFace didasarkan pada implementasi ini. Model yang telah dilatih sebelumnya telah dimodifikasi untuk menghilangkan deteksi landmark yang tidak perlu dan dikonversi ke format ONNX untuk resolusi 640x640.
Terima kasih banyak kepada semua orang yang membantu saya menguji berbagai hal!
Kode dan model didistribusikan di bawah lisensi 2-klausul BSD.
Anda dapat menemukan lisensi perpustakaan pihak ketiga yang digunakan untuk build biner di folder Licenses
.