متعة تعلم الأله Machine Learning – الجزء 4

التعرف علي الوجوه بإستخدام الـ Deep Learning

1٬125

هل لاحظت قدرة Facebook في التعرف علي وجه أصدقائك؟ في السابق، كان عليك الضغط على وجه كل من زملائك وكتابة إسمه بنفسك لكن الآن يستطيع Facebook بالتعرف علي من في الصورة تلقائياً.

هذه التكنولوجيا تُسمى التعرف علي الوجه Face Recognition. يستطيع Facebook التعرف علي الأشخاص المشار إليهم في صور سابقة القليل من المرات حيث وصلت الكفاءة إلي 98% مما يعني أنها بنفس كفاءة الإنسان.

لنتعرف علي كيفية عمل ال Face Recognition. التعرف فقط علي أصدقائك يُعتبر سهل جداً ولكننا نستطيع إستخدام تلك التقنية في أمور أصعب كأن يلاحظ الفرق بين Will Ferrell الممثل المشهور و Chad Smith العازف المشهور.

كيف يُمكن إستخدام الـ Machine Learning مع مشاكل معقدة جداً

سابقاً في الأجزاء 1، 2، و3 إستخدمنا الـ machine learning مع بعض المشاكل التي بها خطوة واحدة فقط وهي تحديد سعر المنازل، إنتاج بيانات جديدة من أخري موجودة، وتحديد إذا كان هناك طائر موجود بالصورة أم لا. كل هذه المشاكل يُمكن حلها بإستخدام الخوارزمية الصحيحة، تغذيتها بالبيانات، والحصول علي النتائج.

لكن الـ face recognition يتكون من عدة مشاكل معقدة:

  1. أولاً، النظر إلي الصورة وتحديد أماكن الأشخاص بداخلها.
  2. ثانياً، التركيز مع كل وجه والقدر علي التعرف عليه حتي مع إختلاف دورانه أو درجة الإضاءة بالصورة.
  3. ثالثاً، إكتشاف features مميزة لكل وجه مثل أن يكون الوجه به عيون كبيرة، طول معين، وهكذا لكي نستطيع تفرقته من الآخرين.
  4. أخيراً، مقارنة الـ features المميزة لكل شخص مع مجموعة صور مخزنة لدينا لكى نتعرف على إسمه.

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

نريد حل كل خطوة للـ face recognition بشكل منفصل ونستخدم نتائج كل خطوة في الخطوة التالية لها. تعتبر أشبه بسلسلة من خوارزميات الـ machine learning:

الـ Face Recognition خطوة بخطوة

بكل خطوة، سنتعرف علي خوارزمية جديدة. سنتعلم علي الأفكار الرئيسية التي تُمكننا من فهم كيف يعمل الـ face recognition بلغة البرمجة بايثون بإستخدام OpenFace وdlib.

الخطوة 1: تحديد أماكن الوجوه

الخطوة الأولي هي الـ face detection. نريد تحديد أماكن الأشخاص داخل الصورة في البداية.

إذا إستخدمت أي كاميرا في العشر سنوات الماضية، إحتمال كبير أنك رأيت الـ face detection بشكل فعلي.

الـ face detection خاصية جيدة للكاميرات. إذا إستطاعت الكاميرا تحديد أماكن الأشخاص فإنها تستطيع التركيز أكثر عليهم قبل أن تلقط الصورة. لكننا سنستخدمها بشكل مختلف بأن نجد أماكن كل وجه ونعطى هذه المعلومات إلي الخطوة الأخري في الـ face recognition.

تم الإهتمام بالـ face detection في سنة 2000 جينما قام كل من Paul Viola وMichael Jones بإختراع طريقة للـ face detection بشكل سريع جداً لكي يعمل علي الكاميرات الرخيصة. لكن المزيد من المرونة موجودة حالياً. سنستخدم طريقة تم إختراعها في سنة 2005 تُسمى Histogram of Oriented Gradients أوHOG بشكل مختصر.

لإيجاد الوجوه داخل الصورة، سنحول الصورة إلي أبيض وأسود لأننا لن نحتاج إلي الألوان في شيئ:

بعد ذلك ننظر إلي كل pixel في الصورة. لكل pixel، سننظر إلي مجموعة الـ pixels المجاورة له:

هدفنا هو معرفة كيف للـ pixel الحالة أن تكون أغمق من الـ pixels المجاورة لها بشكل مباشر وبعد ذلك نرسم سهم يتجه إلي هذا المكان:

إذا كررت هذه الخطوة علي كل pixel، ستقوم في النهاية بتبديل كل pixel بسهم. السهم يُدعي gradient ويوضح إتجاه تغيير اللون من اللون الفاتح إلي الغامق علي كل الصورة:

يوجد سبب مهم لإستبدال كل pixel ب gradient. إذا قمنا بمقارنة صورتان لنفس الشخص أحدهما فاتحة والأخري غامقة، سنجد أن قيم الـ pixels تتغير بشدة مع أنه نفس الشخص. لكن بإستخدام إتجاه تغيير الإضاءة بالصورة، نجد أن الصورة الفاتحة والأخري الغمقة لديهم نفس الإتجاهات. هذا يجعل الأمر أسهل.

لكن حفظ بيانات الـ gradient لكل pixel يجعلنا نُخزن عدد كبير من البيانات. من الأفضل رؤية تغيير درجة الإضاءة من مستوي أعلي كي يسهل التعرف علي النمط الرئيسي داخل الصورة.

لنفعل ذلك، سنقوم بتقسيم الصورة إلي مربعات صغيرة بحجم 16×16. في كل مربع، سنعد عدد المرات التي يُشير فيها الـ gradients لكل إتجاه. بعد ذلك نستبدل كل مربع بأعلي عدد يُشير إليهم الـ gradients في نفس الإتجاه.

الناتج النهائي أننا حولنا الصورة إلي شكل آخر كي يسهل الأمر في معرفة الهيكل الرئيسى للوجه بشكل بسيط:

لتحديد أماكن الوجوه بإستخدام صورة ال HOG، نريد معرفة أي جزء في الصورة لديه HOG Pattern أشبه بآخر تم إستخلاصه من بيانات التدريب:

بإستخدام هذه الطريقة، يمكننا بسهولة تحديد أماكن الوجوه:

للقيام بهذه الخطوة بإستخدام مكتبة dlib في البايثون، الكود المسئول عن إستخراج ال HOG من الصور موجود هنا.

 

الخطوة 2: أوضاع الوجوه

قمنا بفصل الأوجه من الصورة. لنتعامل مع مشكلة أن دوران نفس الوجو يجعله مختلفا تماماً بالنسبة للحاسوب::

للتعامل مع تلك المشكلة، نريد أن نجعل العيون والشفايف في كل صورة موجودة في نفس المكان. هذا سيجعل الأمر أسهر عند مقارنتهم ببعض في الخطوات القادمة.

سنستخدم خوارزمية تُسمي face landmark estimation. هناك العديد من الطرق للقيام بذلك لكننا سنستخدم طريقة تم إختراعها سنة 2014 عن طريق Vahid Kazemi وJosephine Sullivan.

الفكرة الأساسية هو أن نأتي ب 68 نقطة تُسمي landmarks والتي توجد في كل صورة مثل أعلي الذقن، خارج حافة كل عين، الحافة الداخلية لرمش العين، وغير ذلك. بعد ذلك نقوم بتدريب خوارزمية machine learning لإيجاد تلك الـ 68 نقطة لكل وجه:

ها هو ناتج تحديد الـ 68 landmarks في أحد الصور:

يتم عمل بعض التحويلات علي الصورة مثل الدوران حتى نجعل كل من العيون والفم موجودين فى وسط الصورة. سنستخدم التحويلات البسيطة مثل rotation وscale للحفاظ على الخطوط المتوازية التي تُسمي affine transformations:

الآن مهما كان وضع الوجه، نستطيع أن نجعل العيون والفم موجودين في نفس المكان في تقريباً كل الصور. هذا يجعل الأمر أكثر دقة.

لإختبار هذه الخطوة بإستخدام مكتبة dlib، سنستخدم الكود المسئول عن تحديد face landmarks وها هو الكود المسئول عن تحويل الصورة بإستخدام تلك الـ landmarks.

 

الخطوة 3: Face Encoding

الطريقة الأسهل للـ face recognition هو أن نقارن الوجه الغير معروف حتي الآن في الخطوة 2 بكل الصور الموجود بها أشخاص تمت الإشارة لهم سابقاً. إذا وجدنا شخصاً قمنا بالإشارة إليه مسبقاً يشبه صفات الوجه الذي نعمل عليه حالياً، فلابد أن يكون هو هذا الشخص.

يوجد مشكلة كبيرة مع هذه الطريقة. الـ Facebook لدية أعداد ضخمة من الصور ولا نستطيع المرور علي كل صورة ومقارنتها لأن هذا سيأخذ وقتاً كبيراً جداً. نريد أن نتعرف علي الوجه في أقل من ثانية وليس في ساعات.

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

الطريقة الفعالة لقياس وجه

أي القياسات يجب علينا إستخراجها من كل وجه لبناء قاعدة البيانات؟ حجم الأذن؟ طول الأنف؟ لون العين؟ شيئاً آخر؟

يبدو أن القياسات التي تبدو واضحة للإنسان تعتبر صعب التعرف عليها بإستخدام الحاسوب. الطريقة الأفضل هو أن تدع للحاسوب المجال بإختيار أفضل القياسات بنفسه. الـ deep learning يستطيع إيجاد أفضل المناطق التي يمكننا إستخدامها لإستخراج قياسات.

الفكرة هي تدريب deep convolutional neural network مثل ما فعلنا في درس 3. لكن في هذه المرة ستتدرب الشبكة لإستخراج 128 قياس لكل وجه بدلاً من التعرف علي الصور كما تم في السابق.

عملية التدريب تعمل بأن نستخدم 3 صور في نفس المرة:

  1. إستخدام صورة لشخص معروف.
  2. إستخدام صورة أخري لنفس الشخص.
  3. إستخدام صورة أخري لشخص مختلف.

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

بتكرار تلك الخطوة ملايين المرات على آلاف من الصور المختلفة، الشبكة تتعلم تلقائياً ما هي أفضل 128 قياس. أي 10 صور لنفس الشخص يجب أن يُعطوا نفس القياسات.

تُسمي الـ machine learning تلك ال 128 قياس لكل وجه embedding. الفكرة هو إختزال الصورة ببياناتها الكثيرة في بعض الأرقام التي يُنتجها الحاسوب وتجعل من معالجتها أسهل بعد ذلك. الطريقة التي نستخدمها تم إختراعها في سنة 2015 عن طريق باحثين جوجل.

 

Encoding صورة الوجه

عملية تدريب الشبكة لإستخراج الـ embeddings تتطلب الكثير من البيانات. حتي مع الأجهزة السريعة، سيستغرق الأمر حوالي 24 ساعة متواصلة للوصول إلي دقة جيدة.

لكن بمجرد تدريب الشبكة، ستُنتج القياسات لأي وجه حتي وإن لم تراه مسبقاً في بيانات التدريب. الـ OpenFace تقوم بذلك بالفعل ولديها بعض الشبكات المدربة مسبقاً والتي يمكننا إستخدامها مباشرة.

كل ما علينا القيام به هو تشغيل الشبكة المدربة مسبقاً للحصول علي الـ 128 قياس لكل وجه. ها هي القياسات لصورة:

لكن ما هي الأجزاء من الوجه التي تم إستخراج تلك القياسات منها؟ ليس لدينا فكرة لأنه هذا ليس مهماً لنا. كل ما يهمنا هو الحصول علي قياسات تستطيع التفرقة بين كل صورتين بدقة عالية.

لإختبار هذا بنفسك، الـ OpenFace يدعم مخطوطات بلغة Lua والتي بدورها تُنتج الـ embeddings لكل الصور في مجلد واحد وكتابتهم في ملف CSV. يمكنك التشغيل كما هو موجود في هذا الرابط.

 

الخطوة 4: الحصول علي إسم الشخص

الخطوة الأخيرة هي الأسهل. علينا فقط معرفة إسم الشخص بتاءً علي قاعدة بيانات بالأشخاص المعروفة والتي هو أقرب للقياسات التي إستخرجناها من الصورة التي نعمل عليها.

يمكننا القيام بذلك من خلال خوارزميات الـ classification. لا نحتاج إلي خوارزميات deep learning. علي سبيل المثال، SVM classifier يكفي للقيام بهذه المهمة.

كل ما نحتاجه هو تدريب الـ classifier بناءً على القياسات بحث يمكنه التعرف علي إسم الشخص الموجود في صورة جديدة. تشغيل الـ classifier يستغرق أقل من ثانية.

لنقوم بتجربة النظام. أولاً، تدريب الـ classifier علي الـ embeddings من 20 صورة لكل من Will Ferrell، Chad Smith ، و Jimmy Falon.

بعد ذلك نقوم بتشغيل الـ classifier علي صور من فيديو لهم:

الأمر يعمل جيداً ويستطيع الوصول للوجوه في أوضاع مختلفة.

جرب بنفسك

لنراجع علي الخطوات:

عبر عن الصورة بإستخدام الـ HOG لإنشاء نسخة مبسطة من الصورة. إستخدم تلك الصورة المبسطة لإستخراج أكثر الأمكان تشابهاً مع نمط HOG معروف للوجه.

قم بمعرفة وضعية الوجه بإستخدام الـ landmarks. بعد ذلك إستخدمها حتي تجعل العيون والفم في وسط الصورة.

مرر تلك الصورة إلي neural network والتي تتعرف علي أفضل 128 قياس.

قم بمعرفة إسم الشخص بمعرفة أكثر الأشخاص تشابهاً مع تلك القياسات.

الآن تعلم كيف للأمر أن يعمل، وهذه بعض الإرشادات لتساعدك في تنفيذ هذا نظام علي حاسوبك.

 

قبل أن تبدأ

تأكد من أن كل من Python، dlib، وOpenFace موجودين بالفعل. أو قم بإستخدام docker image.

docker pull bamos/openface

docker run -p 9000:9000 -p 8000:8000 -t -i bamos/openface /bin/bash

cd /root/openface

 

الخطوة 1

قم بإنشاء مجلد لبيانات التدريب

mkdir training-images

 

الخطوة 2

قم بإنشاء مجلد لكل شخص

mkdir ./training-images/will-ferrell/mkdir ./training-images/chad-smith/mkdir ./training-images/jimmy-fallon/

 

الخطوة 3

ضع صور كل شخص في المجلد الخاص به. تأكد من أنه يوجد فقط وجه واحد موجود بالصورة. لا تحتاج لقص الوجه داخل الصورة لأن الـ OpenFace سيفعل ذلك بالفعل.

 

الخطوة 4

قم بتشغيل مخطوطات الـ OpenfFace من داخل المسار الرئيسي لـ OpenFace.

قم بإيجاد وضع الوجه

./util/align-dlib.py ./training-images/ align outerEyesAndNose ./aligned-images/ –size 96

هذه سيقوم بعمل مجلد جديد بإسم aligned-images فيه الصور بعد قصها وضبط وضعها.

ثانياً، قم بإنتاج الـ embeddings للصور

./batch-represent/main.lua -outDir ./generated-embeddings/ -data ./aligned-images/

المجلد generated-embeddings سيتحتوي علي ملف CSV والذي به الـ embedding لكل صورة.

ثالثاً، قم بتدريب نموذج الـ face detection:

./demos/classifier.py train ./generated-embeddings/

سينتج ملف بإسم classifier.pkl والذي يحتوي علي الـ SVM classifier.

الآن لديك face recognizier يعمل.

 

الخطوة 5: التعرف علي الوجوه

قم بتمرير صورة جديدة للـ classifier:

./demos/classifier.py infer ./generated-embeddings/classifier.pkl your_test_image.jpg

ستحصل علي الشخص المتوقع:

=== /test-images/will-ferrel-1.jpg ===

Predict will-ferrell with 0.73 confidence.


ملحوظات:

إذا حصلت علي دقة ضعيفة، يمكنك زيادة عدد الصور في التدريب.

الـ Script سيتوقع دائماً حتي وإن لم يكن الشخص موجود في بيانات التدريب. في الواقع، يجب أن يكون هناك confidence score لتتأكد أن التوقع يتعدي نسبة معينة حتي نتفادي هذا الخطأ.


تم ترجمة هذا المقال بواسطة أحمد جاد.

المقال الأصلي موجود في هذا الرابط لصاحبه (Adam Geitgey).

https://medium.com/@ageitgey/machine-learning-is-fun-part-4-modern-face-recognition-with-deep-learning-c3cffc121d78

تعليقات