ملاحظة : هذه مكتبة تتبع، وليست برنامجًا مستقلاً لتحريك الدمى. أنا أعمل أيضًا على VSeeFace، الذي يسمح بتحريك نماذج VRM وVSFAvatar ثلاثية الأبعاد باستخدام تتبع OpenSeeFace. يستخدم VTube Studio OpenSeeFace للتتبع المعتمد على كاميرا الويب لتحريك نماذج Live2D. يمكن العثور على عارض لمحرك Godot هنا.
يطبق هذا المشروع نموذجًا للكشف عن معالم الوجه استنادًا إلى MobileNetV3.
نظرًا لأن سرعة استنتاج وحدة المعالجة المركزية Pytorch 1.3 على نظام التشغيل Windows منخفضة جدًا، فقد تم تحويل النموذج إلى تنسيق ONNX. باستخدام onnxruntime يمكن تشغيله بمعدل 30 - 60 إطارًا في الثانية لتتبع وجه واحد. هناك أربعة نماذج، بسرعات مختلفة لتتبع مقايضات الجودة.
إذا كان أي شخص لديه فضول، فإن الاسم هو تورية سخيفة في البحار المفتوحة ورؤية الوجوه. ليس هناك معنى أعمق.
يمكن العثور على نموذج فيديو محدث هنا، يوضح أداء نموذج التتبع الافتراضي في ظل مستويات مختلفة من الضوضاء والضوء.
نظرًا لأن المعالم المستخدمة بواسطة OpenSeeFace تختلف قليلاً عن تلك المستخدمة بواسطة الأساليب الأخرى (فهي قريبة من iBUG 68، مع وجود نقطتين أقل في زوايا الفم وخطوط الوجه شبه ثلاثية الأبعاد بدلاً من ملامح الوجه التي تتبع المخطط المرئي) من الصعب مقارنة دقتها عدديًا مع دقة الأساليب الأخرى الموجودة بشكل شائع في الأدبيات العلمية. تم أيضًا تحسين أداء التتبع لإنشاء معالم مفيدة لتحريك الصورة الرمزية بدلاً من ملاءمة صورة الوجه تمامًا. على سبيل المثال، طالما أن معالم العين توضح ما إذا كانت العيون مفتوحة أم مغلقة، حتى لو كان موقعها بعيدًا إلى حد ما، فلا يزال من الممكن أن تكون مفيدة لهذا الغرض.
من الملاحظة العامة، يعمل OpenSeeFace بشكل جيد في الظروف المعاكسة (الإضاءة المنخفضة، والضوضاء العالية، والدقة المنخفضة) ويستمر في تتبع الوجوه من خلال مجموعة واسعة جدًا من أوضاع الرأس مع ثبات عالٍ نسبيًا في المواضع التاريخية. بالمقارنة مع MediaPipe، تظل معالم OpenSeeFace أكثر استقرارًا في الظروف الصعبة وتمثل بدقة نطاقًا أوسع من أوضاع الفم. ومع ذلك، فإن تتبع منطقة العين يمكن أن يكون أقل دقة.
قمت بتشغيل OpenSeeFace على مقطع عينة من عرض الفيديو الخاص بـ 3D Face Reconstruction with Dense Landmarks بواسطة Wood et al. لمقارنتها بـ MediaPipe ونهجهم. يمكنك مشاهدة النتيجة هنا.
يمكن العثور على نموذج لمشروع Unity للرسوم المتحركة الرمزية المستندة إلى VRM هنا.
يتم تتبع الوجه نفسه بواسطة البرنامج النصي facetracker.py
Python 3.7. إنه برنامج سطر أوامر، لذا يجب عليك تشغيله يدويًا من cmd أو كتابة ملف دفعي لبدء تشغيله. إذا قمت بتنزيل إصدار وكنت تستخدم نظام التشغيل Windows، فيمكنك تشغيل ملف facetracker.exe
داخل المجلد Binary
دون الحاجة إلى تثبيت Python. يمكنك أيضًا استخدام run.bat
داخل المجلد Binary
للحصول على عرض توضيحي أساسي للمتعقب.
سيقوم البرنامج النصي بإجراء التتبع على إدخال كاميرا الويب أو ملف الفيديو وإرسال بيانات التتبع عبر UDP. يسمح هذا التصميم أيضًا بإجراء التتبع على جهاز كمبيوتر منفصل عن الشخص الذي يستخدم معلومات التتبع. يمكن أن يكون هذا مفيدًا لتحسين الأداء وتجنب الكشف عن لقطات الكاميرا عن طريق الخطأ.
يمكن لمكون OpenSee
Unity المقدم تلقي حزم UDP هذه وتوفير المعلومات المستلمة من خلال حقل عام يسمى trackingData
. يمكن لمكون OpenSeeShowPoints
تصور النقاط المميزة للوجه المكتشف. كما أنه بمثابة مثال. يرجى الاطلاع عليه لمعرفة كيفية الاستفادة بشكل صحيح من مكون OpenSee
. يتم تضمين المزيد من الأمثلة في مجلد Examples
. يتم تلقي حزم UDP في سلسلة رسائل منفصلة، لذا يجب على أي مكونات تستخدم حقل trackingData
الخاص بمكون OpenSee
أولاً نسخ الحقل والوصول إلى هذه النسخة، وإلا فقد تتم الكتابة فوق المعلومات أثناء المعالجة. ويعني هذا التصميم أيضًا أن الحقل سيستمر في التحديث، حتى إذا تم تعطيل مكون OpenSee
.
قم بتشغيل البرنامج النصي python باستخدام --help
للتعرف على الخيارات الممكنة التي يمكنك تعيينها.
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 الذي تم إنشاؤه قابلاً للتنفيذ وموزعًا في حزم الإصدار الثنائية. يوفر ثلاث وظائف عامة لواجهة برمجة التطبيقات:
public string[] ListCameras()
تُرجع أسماء الكاميرات المتوفرة. يتوافق فهرس الكاميرا الموجود في المصفوفة مع معرفها الخاص بحقل cameraIndex
. سيؤدي ضبط cameraIndex
على -1
إلى تعطيل التقاط كاميرا الويب.public bool StartTracker()
سيبدأ عملية التعقب. إذا كان قيد التشغيل بالفعل، فسيتم إيقاف تشغيل المثيل قيد التشغيل وبدء مثيل جديد بالإعدادات الحالية.public void StopTracker()
سيوقف المتعقب. يتم إيقاف المتعقب تلقائيًا عند إنهاء التطبيق أو تدمير كائن OpenSeeLauncher
. يستخدم مكون OpenSeeLauncher
كائنات مهمة WinAPI للتأكد من إنهاء عملية التعقب الفرعية في حالة تعطل التطبيق أو إغلاقه دون إنهاء عملية التعقب أولاً.
يجب إضافة وسيطات سطر الأوامر المخصصة الإضافية واحدة تلو الأخرى إلى عناصر مصفوفة commandlineArguments
. على سبيل المثال، يجب إضافة -v 1
كعنصرين، عنصر يحتوي على -v
وعنصر آخر يحتوي على 1
، وليس عنصرًا واحدًا يحتوي على كلا الجزأين.
يمكن استخدام مكون OpenSeeIKTarget
المتضمن مع FinalIK أو حلول IK الأخرى لتحريك حركة الرأس.
يمكن إضافة مكون OpenSeeExpression
إلى نفس المكون مثل مكون OpenSeeFace
لاكتشاف تعبيرات وجه معينة. ويجب معايرته على أساس كل مستخدم. يمكن التحكم فيه إما من خلال مربعات الاختيار الموجودة في Unity Editor أو من خلال الطرق العامة المكافئة التي يمكن العثور عليها في كود المصدر الخاص به.
لمعايرة هذا النظام، عليك جمع البيانات النموذجية لكل تعبير. إذا كانت عملية الالتقاط تسير بسرعة كبيرة، فيمكنك استخدام خيار recordingSkip
لإبطائها.
العملية العامة هي كما يلي:
لحذف البيانات التي تم التقاطها لأحد التعبيرات، اكتب اسمه وحدد المربع "مسح".
لحفظ كل من النموذج المُدرب وبيانات التدريب التي تم التقاطها، اكتب اسم ملف بما في ذلك مساره الكامل في حقل "اسم الملف" ثم ضع علامة في مربع "حفظ". لتحميله، أدخل اسم الملف وحدد مربع "تحميل".
--model 3
، وأسرع نموذج بأقل جودة تتبع هو --model 0
.--scan-every
الإطارات. يمكن أن يؤدي هذا إلى إبطاء الأمور، لذا حاول ضبط --faces
على ألا يزيد عن العدد الفعلي للوجوه التي تتتبعها. تم تضمين أربعة نماذج مميزة للوجه مُدربة مسبقًا. باستخدام مفتاح --model
، من الممكن تحديدها للتتبع. قيم الإطارات في الثانية المحددة مخصصة لتشغيل النموذج على فيديو ذو وجه واحد على نواة وحدة المعالجة المركزية (CPU) واحدة. سيؤدي خفض معدل الإطارات إلى تقليل استخدام وحدة المعالجة المركزية بدرجة مقابلة.
يتم تشغيل قياسات FPS على أحد نواة وحدة المعالجة المركزية الخاصة بي.
يمكن العثور على أوزان Pytorch للاستخدام مع model.py
هنا. يمكن العثور على بعض نماذج ONNX غير المحسنة هنا.
المزيد من العينات: Results3.png، Results4.png
يعتبر النموذج التاريخي قويًا جدًا فيما يتعلق بحجم الوجوه واتجاهها، لذا فإن نموذج اكتشاف الوجه المخصص يتخلص من المربعات المحيطة الأكثر خشونة من الطرق الأخرى. لديها نسبة سرعة إلى دقة مناسبة لأغراض هذا المشروع.
تحتوي الإصدارات الموجودة في قسم الإصدار بهذا المستودع على ملف facetracker.exe
داخل مجلد Binary
تم إنشاؤه باستخدام pyinstaller
ويحتوي على جميع التبعيات المطلوبة.
لتشغيله، يجب على الأقل وضع مجلد models
في نفس المجلد مثل facetracker.exe
. يجب أن يعمل وضعه في مجلد أصل مشترك أيضًا.
عند توزيعه، يجب عليك أيضًا توزيع مجلد Licenses
معه للتأكد من توافقك مع المتطلبات المنصوص عليها من قبل بعض مكتبات الطرف الثالث. يمكن إزالة النماذج غير المستخدمة من الحزم المعاد توزيعها دون مشكلة.
تحتوي إصدارات الإصدار على بنية مخصصة لـ ONNX Runtime بدون القياس عن بعد.
يمكن تثبيت المكتبات المطلوبة باستخدام النقطة:
pip install onnxruntime opencv-python pillow numpy
وبدلاً من ذلك، يمكن استخدام الشعر لتثبيت جميع التبعيات لهذا المشروع في بيئة افتراضية منفصلة:
poetry install
يمكن تثبيت المكتبات المطلوبة باستخدام النقطة:
pip install onnxruntime opencv-python pillow numpy
تم تدريب النموذج على نسخة مكونة من 66 نقطة من مجموعة البيانات LS3D-W.
@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. بالإضافة إلى ذلك، تم استخدام حوالي 125000 عين صناعية تم إنشاؤها باستخدام UnityEyes أثناء التدريب.
تجدر الإشارة إلى أنه تم أيضًا استخدام بيانات مخصصة إضافية أثناء عملية التدريب وأنه تم تعديل المعالم المرجعية من مجموعات البيانات الأصلية بطرق معينة لمعالجة المشكلات المختلفة. ومن غير المحتمل إعادة إنتاج هذه النماذج باستخدام مجموعات البيانات الأصلية LS3D-W وWFLW فقط، إلا أن البيانات الإضافية غير قابلة لإعادة التوزيع.
تم تدريب نموذج اكتشاف الوجه القائم على انحدار الخريطة الحرارية على محاصيل عشوائية مقاس 224 × 224 من مجموعة بيانات 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}
}
الخوارزمية مستوحاة من:
تم أخذ رمز 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 على هذا التنفيذ. تم تعديل النموذج المُدرب مسبقًا لإزالة اكتشاف المعالم غير الضروري وتحويله إلى تنسيق ONNX للحصول على دقة تبلغ 640 × 640.
شكرا جزيلا لكل من ساعدني في اختبار الأشياء!
يتم توزيع الكود والنماذج بموجب ترخيص BSD المكون من فقرتين.
يمكنك العثور على تراخيص مكتبات الجهات الخارجية المستخدمة للإصدارات الثنائية في مجلد Licenses
.