7.3. مرحباً BlazeFace¶
إن BlazeFace شبكة عصبية لكشف الوجوه من مجموعة MediaPipe من Google. يُرجع استدعاء استدلال واحد مستطيل إحاطة حول كل وجه مكتشف إلى جانب ست معالم وجهية -- العين اليمنى، والعين اليسرى، والأنف، والفم، والأذن اليمنى، والأذن اليسرى. كل OpenMV Cam تُشحن بدعم الشبكات العصبية تحمل نموذج blazeface_front_128.tflite على ذاكرة الفلاش، لذا فإن تشغيل كاشف وجوه متكامل من البداية إلى النهاية يتطلب بضعة أسطر من Python.
7.3.1. البرنامج النصي الكامل¶
import csi
import ml
from ml.postprocessing.mediapipe import BlazeFace
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
csi0.window((400, 400))
model = ml.Model("/rom/blazeface_front_128.tflite",
postprocess=BlazeFace(threshold=0.4))
while True:
img = csi0.snapshot()
for (x, y, w, h), score, keypoints in model.predict([img]):
img.draw_rectangle((x, y, w, h), color=(0, 255, 0))
ml.utils.draw_keypoints(img, keypoints, color=(255, 0, 0))
هذا هو كاشف الوجوه بأكمله. لا شيء آخر فيه؛ فالبرنامج النصي يلتقط إطاراً، ويسلّمه إلى النموذج، ويمر على قائمة الكشوفات المُرجَعة، ويرسم مستطيل الإحاطة لكل وجه إضافةً إلى معالمه الستة عائداً إلى الإطار. وتُظهر معاينة IDE المربعات والمعالم في الوقت الفعلي.
7.3.2. ماذا يفعل كل سطر¶
تستورد الأسطر الثلاثة الأولى الوحدات التي يحتاجها البرنامج النصي. csi هي واجهة مستشعر الكاميرا؛ وml هي وحدة تعلم الآلة التي يدور حولها بقية هذا الفصل؛ وBlazeFace هي المعالج اللاحق الذي يحوّل موترات الإخراج الخام لـ BlazeFace إلى قائمة مربع الإحاطة والمعالم التي يمر عليها البرنامج النصي.
تضبط الأسطر الخمسة التالية المستشعر. تُعاد الكاميرا إلى حالة معروفة، وتُضبط على لون RGB565، وتُضبط على دقة VGA، ثم تُؤطَّر في نافذة (windowed) إلى مربع بأبعاد 400 في 400. النافذة مهمة: فقد دُرّب BlazeFace على اقتطاعات مربعة، وإعطاؤه إدخالاً مربعاً يوائم نسبة العرض إلى الارتفاع المتوقعة للشبكة مع ما تراه في الإطار الملتقط.
يفتح سطر تحميل النموذج ملف النموذج:
model = ml.Model("/rom/blazeface_front_128.tflite",
postprocess=BlazeFace(threshold=0.4))
يقرأ ml.Model الملف في المسار المعطى -- /rom/ هو نظام ملفات مقيم في الفلاش يُغطَّى لاحقاً -- ويُرجع كائن نموذج سيجري البرنامج النصي الاستدلالات مقابله. تسجّل الكلمة المفتاحية postprocess= المعالج اللاحق لـ BlazeFace؛ وبدونها يُرجع predict موترات الإخراج الخام للشبكة وكان على التطبيق فك ترميزها يدوياً. ومعها يُرجع predict النتيجة المفكوكة مباشرة. تضبط الوسيطة threshold=0.4 على المعالج اللاحق الحد الأدنى للثقة التي يجب أن تبلغ عنها الشبكة قبل الإبقاء على كشف؛ والقيم الأدنى تلتقط الوجوه الأخفت على حساب مزيد من الإيجابيات الكاذبة.
الأسطر الأربعة المتبقية هي الحلقة الرئيسية. كل تمريرة خلالها تلتقط إطاراً واحداً وتسأل النموذج عما يراه:
img = csi0.snapshot()
for (x, y, w, h), score, keypoints in model.predict([img]):
img.draw_rectangle((x, y, w, h), color=(0, 255, 0))
ml.utils.draw_keypoints(img, keypoints, color=(255, 0, 0))
يأخذ predict() قائمة من المدخلات (هنا، صورة ملتقطة واحدة) ويُرجع قائمة من صفوف الكشف (tuples). يحمل كل صف مستطيل الإحاطة (x, y, w, h)، ودرجة ثقة score بين الصفر والواحد، وndarray بأبعاد (6, 2) لإحداثيات المعالم -- العين اليمنى، والعين اليسرى، والأنف، والفم، والأذن اليمنى، والأذن اليسرى بهذا الترتيب. يستخدم استدعاء الرسم draw_rectangle() -- وهو الأولية نفسها التي انتهى بها كل كاشف كلاسيكي في فصل الصور -- لتحديد محيط الوجه. وml.utils.draw_keypoints() دالة مساعدة صغيرة من أدوات ml تعلّم كل نقطة مفتاحية بعلامة زائد عند موضعها (x, y).
7.3.3. ما لا يقوله البرنامج النصي¶
البرنامج النصي هو سبعة أسطر قابلة للتشغيل من عمل الاستدلال بعد الاستيرادات وإعداد المستشعر، لكن قدراً كبيراً من العمليات الحسابية يحدث داخل تلك الأسطر السبعة. يصبح الإطار الملتقط بأبعاد 400 في 400 من نوع RGB565 موتراً مكمَّماً بـ 8 بت بأبعاد 128 في 128 قبل أن يصل إلى الشبكة؛ وتشغّل الشبكة مئات العمليات مقابل عشرات الآلاف من الأوزان؛ وتصبح موترات درجات الثقة وإزاحات المربعات الناتجة قائمة مرتبة من مربعات الإحاطة غير المتداخلة مع معالم مرفقة قبل أن يُرجع predict. كل واحد من تلك التحويلات هو شيء يمكن للتطبيق التحكم فيه إذا احتاج، والعديد منها يجب ضبطه لأي نموذج غير افتراضي.
تشرح الأقسام الفرعية الأربعة التالية تلك التحويلات بالتفصيل. بالترتيب:
وحدة ml -- ما تكشفه
ml.Modelبمجرد تحميل نموذج، وأين يعيش ملف النموذج فعلياً على الكاميرا.خط أنابيب الاستدلال -- المراحل الأربع لكل استدعاء
predict().محركات الاستدلال -- مسارا وحدة المعالجة المركزية ووحدة المعالجة العصبية اللذان يشغّلان عمليات الشبكة الحسابية.
فك ترميز الإخراج -- المعالجات اللاحقة التي تحوّل موترات الإخراج الخام إلى الكشوفات التي مرّ عليها هذا البرنامج النصي.
بحلول نهاية الفصل سيتمكن القارئ من كتابة البرنامج النصي المكافئ لنموذج لم يُشحن مع الكاميرا، وفك ترميز موتر لا يوجد له معالج لاحق بعد، والتفكير في سبب تشغيل نموذج معين بمعدل 30 إطاراً في الثانية على كاميرا و3 إطارات في الثانية على أخرى.