القليل من الجبر الخطي للرياضيات / الخطي وراء مرشحات Instagram Face 3D

أعتقد اعتقادًا راسخًا بأننا جميعًا قد استخدمنا فلاتر Snapchat / Instagram أو على الأقل نرى أصدقاءنا يستخدمونه وشاركه على قصص وسائل التواصل الاجتماعي أو المشاركة.

نبدأ في معرفة مصطلح "الفلاتر" كمُضيف أو خلفية تضيف الزخارف ، وبعد ذلك أصبحت أكثر شيوعًا كما تظهر في كل وجه على الكاميرا مثل تضمين النظارات الشمسية ورأس الأرنب وتحويل العمر وما إلى ذلك. وجه خاص

على وجه التحديد في هذا المنشور ، سنناقش ما سيفعله هاتفنا / Instagram عندما نقوم بعمل مرشحات للوجه حتى يتم وضع النظارات في المكان الصحيح وقادرة على متابعة وضع رأسنا.

باختصار ، يتم تقسيم العملية الرئيسية لمرشح الوجه ثلاثي الأبعاد على 3 مراحل بالتسلسل:

  1. كشف الوجوه
  2. كشف معالم الوجه
  3. إسقاط البند

يعد الكشف عن الوجوه وكشف المعالم جزءًا من التعلم الآلي / التعلم العميق الذي يقوم بالكشف عن الأشياء من الصورة بأكملها وإجراء التراجع على التوالي. لكل وجه مكتشف ، سيتم إرساله إلى خوارزمية المرحلة الثانية لتقدير مكان الأنف والعينين والفم وما إلى ذلك حتى الآن ، يغطي الكثير من الخوارزميات ومجموعات البيانات 68 معالم وجه. هنا مصدر كبير لمزيد من القراءة.

معلم الوجه بواسطة pyimagesearch.com

ومع ذلك ، سنركز على المرحلة الثالثة (إسقاط البند) لأننا نتحدث عن تحويل الرياضيات / الجبر الخطي / المصفوفة حول ذلك. بالطبع ، تحتوي المرحلتان الأوليان على الكثير من الرياضيات التي يجب تغطيتها ولكن كل منهما يحتوي على لوحة كبيرة ليُناقشها.

إسقاط البند

نتيجة الكشف عن المعالم هي مجموعة إحداثيات x و y لكل معلم ، وهي معلومات ثنائية الأبعاد فقط وفي الوقت نفسه نحتاج إلى معرفة الإحداثيات z سواء كانت العين اليسرى أبعد من العين اليمنى من الكاميرا حتى نتمكن من القول أن الوجه النظر إلى الجانب الأيسر لأن النظارات ستتبع الطريقة التي ننظر بها.

المشكلة / الطريقة التي نستخدمها لإجراء مثل هذا الإسقاط تسمى "Perspective-n-Point (PnP)" أو "طراز الكاميرا ذات الثقب". إنها طريقة منذ عقود ولكنها لا تزال تستخدم بشكل متكرر في العديد من حالات رؤية الكمبيوتر بما في ذلك الروبوتات والواقع المعزز ومناقشتنا. لجعل هذه الطريقة تعمل ، تحتاج إلى 3 عناصر:

1. 3D نقاط العالم تنسيق الفضاء كمرجع

المصطلح رائع للغاية "مساحة إحداثيات العالم" ، فهي بعض نقاط الإصلاح التي يمكن أن نقولها كنقاط مرجعية أو في حالة طبيعية كما يعلم العالم أنها صحيحة !!!. في هذه الحالة ، نستخدم هذه النقاط 14.

يشبه موضع هذه النقاط إحداثيات معلم الوجه البشري مع وجود أنف في مقدمة ووسط الوجه والذقن في الأسفل وما إلى ذلك.

2. 2D نقاط الإسقاط ، والمراسلات الفردية مع مساحة إحداثيات العالم

تأتي نقاط الإسقاط من نموذج التعلم العميق في المرحلة الثانية ، وهو النموذج التاريخي للوجه ونستخدم 14 نقطة فقط من 68 نقطة من النموذج.

3. مصفوفة الكاميرا

تحتوي المصفوفة على معلومات عن البعد البؤري للكاميرا والنقطة الرئيسية التي تم استبدالها عمليًا بإحداثيات مركز الصورة. بينما يكون البعد البؤري هو نفسه عادةً مع إجمالي وحدات البكسل لعرض الصورة.

منظور الكاميرا ونقطة (PnP) / نموذج الكاميرا ذات الثقب

باستخدام 3 معلومات أعلاه ، نود الحصول على مصفوفة دوران (R) وناقل ترجمة (t) من هذه الصيغة.

المصدر: توثيق OpenCV

إنه يطابق 14 نقطة من مساحة الإحداثيات في العالم إلى 14 نقطة من الوجه المكتشف الفعلي للحصول على مقدار تدوير الوجه وترجمته في كل بُعد.

إسقاط نقطة جديدة

المصدر: توثيق OpenCV

بعد معرفة مصفوفة التناوب ومتجه الترجمة ، نود أن نعرض نقاط جديدة (قد تكون بخلاف 14 نقطة إدخال). الإدخال هو تنسيق ثلاثي الأبعاد (X ، Y ، Z) يشبه إحداثيات الفضاء العالمية إلى إحداثيات ثنائية الأبعاد (u ، v) والتي في النهاية نعرض الصورة فقط في ثنائي الأبعاد.

المصدر: نظارات ونظارات

على سبيل المثال ، إذا كنت تريد إسقاط نقطة جديدة للعدسة إلى ثنائية الأبعاد ، فاختر إدخال ثلاثي الأبعاد حول العالم لإحداثيات العين بالإضافة إلى القليل من إحداثيات Z ، لأن العدسة أقرب من احترام العين للكاميرا. وبالمثل ، وسادة الأنف ، اختر الموقع حول العالم إحداثيات الأنف.

لتطبيق المرشح ، تحتاج إلى تحديد بعض النقاط الثلاثية الأبعاد لكائنك مثل النظارات أو القبعة أو الشارب ، فيما يتعلق بـ 14 نقطة من مساحة إحداثيات العالم ثم الإسقاط يحول تلك النقاط الثلاثية الأبعاد إلى نقاط ثنائية الأبعاد تأخذ في الاعتبار وضع رأس الوجه.

خلاصة القول ، إن عملية إظهار الفلاتر هي: Detect Face -> Estimate 2D face المعالم -> Get rotation matrix and translation vector -> Project 3D item points to 2D -> Visualize. يحدث ذلك في كل إطار تلتقطه الكاميرا.

الرموز في python / C ++ لتحقيق ذلك

إذا كنت ترغب في تطبيق هذا المفهوم ، يرجى الرجوع إلى وثائق OpenCV في هذه المناقشة.

وظيفة الحصول على مصفوفة التناوب ومتجه الترجمة: C ++: projectPoints Python: cv2.projectPoints

تشير وظيفة عرض العنصر ثلاثي الأبعاد إلى 2D: C ++: projectPoints Python: cv2.projectPoints

كلاهما داخل حزمة OpenCV !!

تنصل

أنا لست مهندسًا في Snapchat / Instagram ، ولا أقول أنهم يستخدمون هذا المفهوم الذي لا أعرف ماذا يفعلون في الداخل ، وأنا أدرك أنهم يفعلون أكثر تعقيدًا مما قرأته في هذه المقالة. الرسالة الرئيسية التي أود إيصالها إليك ، يمكنك استخدام المفهوم للقيام بهذا الشيء!

شكرا للقراءة!!! هتاف