دليل رصد علامات الوجه في نظام Android

تتيح لك مهمة "تحديد معالم الوجه" في MediaPipe رصد معالم الوجه وتعبيرات الوجه في الصور والفيديوهات. يمكنك استخدام هذه المهمة لتحديد تعابير الوجه البشرية، وتطبيق فلاتر الوجه والتأثيرات، وإنشاء صور رمزية افتراضية. تستخدِم هذه المهمة نماذج تعلُّم الآلة التي يمكنها العمل مع صور فردية أو مع تدفق مصوّر مستمر. تُخرج المهمة معالم الوجه الثلاثية الأبعاد، ونتائج منحنيات التمويه (المعاملات التي تمثّل تعابير الوجه) لاستنتاج مساحات الوجه المفصّلة في الوقت الفعلي، ومصفّفات التحويل لإجراء عمليات التحويل المطلوبة لعرض التأثيرات.

يتوفّر نموذج الرمز البرمجي الموضّح في هذه التعليمات على GitHub. لمزيد من المعلومات عن الإمكانات والنماذج وخيارات الضبط لهذه المهمة، اطّلِع على نظرة عامة.

مثال على الرمز البرمجي

مثال رمز MediaPipe Tasks هو تطبيق بسيط لتحديد معالم الوجه على نظام التشغيل Android. يستخدم المثال الكاميرا على جهاز Android مادي لرصد الوجوه في بث فيديو مستمر. يمكن للتطبيق أيضًا رصد الوجوه في الصور والفيديوهات من معرض الصور على الجهاز.

يمكنك استخدام التطبيق كنقطة بداية لتطبيق Android الخاص بك، أو الرجوع إليه عند تعديل تطبيق حالي. يتم استضافة مثال رمز "عيون وآذان الوجه" على GitHub.

تنزيل الرمز

توضِّح لك التعليمات التالية كيفية إنشاء نسخة محلية من مثال الرمز البرمجي باستخدام أداة سطر الأوامر git.

لتنزيل نموذج الرمز البرمجي:

  1. استنسِخ مستودع git باستخدام الأمر التالي:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. يمكنك اختياريًا ضبط مثيل git لاستخدام ميزة "الفحص الخفيف"، بحيث تتوفّر لديك فقط ملفات مثال تطبيق "وضع علامات على ملامح الوجه":
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/face_landmarker/android
    

بعد إنشاء نسخة محلية من رمز المثال، يمكنك استيراد المشروع إلى Android Studio وتشغيل التطبيق. للحصول على التعليمات، اطّلِع على دليل الإعداد لنظام Android.

المكونات الرئيسية

تحتوي الملفات التالية على الرمز البرمجي المهم لهذا المثال على تطبيق ميزة "تحديد معالم الوجه":

  • FaceLandmarkerHelper.kt: لإعداد علامة معالم الوجه ومعالجة النموذج وتفويض الاختيار
  • CameraFragment.kt: تعالج بيانات إدخال الصور والفيديوهات وتتعامل مع كاميرا الجهاز.
  • GalleryFragment.kt: تتفاعل مع OverlayView لعرض الصورة أو الفيديو الناتج.
  • OverlayView.kt: تُنفِّذ العرض باستخدام شبكة للوجه للوجوه التي تم رصدها.

ضبط إعدادات الجهاز

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

التبعيات

تستخدِم مهمة "تحديد معالم الوجه" مكتبة com.google.mediapipe:tasks-vision. أضِف هذه التبعية إلى ملف build.gradle لتطبيق Android:

dependencies {
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

الطراز

تتطلّب مهمة "تحديد معالم الوجه" في MediaPipe حِزمة نموذج مدرَّب متوافقة مع هذه المهمة. لمزيد من المعلومات عن النماذج المدربة المتاحة لميزة "تحديد معالم الوجه"، اطّلِع على قسم النظرة العامة على المهمة قسم "النماذج".

اختَر النموذج ونزِّله واحفظه في دليل مشروعك:

<dev-project-root>/src/main/assets

حدِّد مسار النموذج ضمن المَعلمة ModelAssetPath. في المثال التالي على الرمز، يتم تحديد التصميم في ملف FaceLandmarkerHelper.kt:

baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)

إنشاء المهمة

تستخدِم مهمة MediaPipe Face Landmarker الدالة createFromOptions() لإعداد المهمة. تقبل الدالة createFromOptions() قيمًا لإعدادات options. لمزيد من المعلومات حول خيارات الضبط، يُرجى الاطّلاع على خيارات الضبط.

تتيح ميزة "تحديد معالم الوجه" أنواع بيانات الإدخال التالية: الصور الثابتة وملفات الفيديو وأحداث البث المباشر للفيديو. عليك تحديد وضع التشغيل المتوافق مع نوع بيانات الإدخال عند إنشاء المهمة. اختَر علامة التبويب لنوع بيانات الإدخال لمعرفة كيفية إنشاء المهمة وتنفيذ عملية الاستنتاج.

صورة

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setRunningMode(RunningMode.IMAGE)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

فيديو

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setRunningMode(RunningMode.VIDEO)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

بث مباشر

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setResultListener(this::returnLivestreamResult)
        .setErrorListener(this::returnLivestreamError)
        .setRunningMode(RunningMode.LIVE_STREAM)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

يسمح مثال تطبيق رمز Face Landmarker للمستخدم بالتبديل بين أوضاع المعالجة. تؤدي هذه الطريقة إلى جعل رمز إنشاء المهام أكثر تعقيدًا، وقد لا يكون مناسبًا لحالة الاستخدام. يمكنك الاطّلاع على هذا الرمز في دالة setupFaceLandmarker() في ملف FaceLandmarkerHelper.kt.

خيارات الضبط

تتضمّن هذه المهمة خيارات الضبط التالية لتطبيقات Android:

اسم الخيار الوصف نطاق القيمة القيمة التلقائية
runningMode لضبط وضع التشغيل للمهمة هناك ثلاثة أوضاع:

IMAGE: وضع الإدخالات باستخدام صورة واحدة.

‫VIDEO: وضع الإطارات التي تم فك ترميزها في الفيديو

LIVE_STREAM: وضع البث المباشر لبيانات الإدخال ، مثل بيانات الكاميرا في هذا الوضع، يجب استدعاء resultListener لإعداد مستمع لتلقّي النتائج بشكل غير متزامن.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
numFaces الحد الأقصى لعدد الوجوه التي يمكن رصدها باستخدام الFaceLandmarker لا يتم تطبيق التمويه إلا عند ضبط num_faces على 1. Integer > 0 1
minFaceDetectionConfidence الحد الأدنى لنتيجة الثقة ليعتبر رصد الوجه ناجحًا Float [0.0,1.0] 0.5
minFacePresenceConfidence الحد الأدنى لنتيجة الثقة في توفّر الوجه نتيجة في ميزة "اكتشاف معالم الوجه" Float [0.0,1.0] 0.5
minTrackingConfidence الحد الأدنى لنتيجة الثقة لتتبُّع الوجوه ليكون ناجحاً Float [0.0,1.0] 0.5
outputFaceBlendshapes ما إذا كان "مُحدِّد معالم الوجه" يُخرج أشكالًا ممزوجة للوجه تُستخدَم أشكال مزج الوجه لعرض نموذج الوجه الثلاثي الأبعاد. Boolean False
outputFacialTransformationMatrixes ما إذا كان FaceLandmarker يُخرج مصفوفة التحويل للوجه. يستخدم FaceLandmarker مصفوفة لتحويل معالم الوجه من نموذج وجه أساسي إلى الوجه الذي تم رصده، حتى يتمكّن المستخدمون من تطبيق تأثيرات على معالم الوجه التي تم رصدها. Boolean False
resultListener ضبط مستمع النتائج لتلقّي نتائج علامة المَعلم بشكل غير متزامن عندما يكون FaceLandmarker في وضع البث المباشر لا يمكن استخدامها إلا عند ضبط وضع التشغيل على LIVE_STREAM ResultListener N/A
errorListener تُستخدَم لضبط مستمع أخطاء اختياري. ErrorListener N/A

إعداد البيانات

تعمل ميزة "تحديد معالم الوجه" مع الصور وملفات الفيديو وأحداث البث المباشر للفيديوهات. تعالج المهمة المعالجة المُسبَقة لإدخال البيانات، بما في ذلك تغيير الحجم والدوران ومعالجة قيم البيانات.

يوضّح الرمز البرمجي التالي كيفية تسليم البيانات لمعالجتها. تتضمّن هذه النماذج تفاصيل عن كيفية التعامل مع البيانات من الصور وملفات الفيديو وعمليات البث المباشر للفيديو.

صورة

import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage

// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(image).build()
    

فيديو

import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage

val argb8888Frame =
    if (frame.config == Bitmap.Config.ARGB_8888) frame
    else frame.copy(Bitmap.Config.ARGB_8888, false)

// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(argb8888Frame).build()
    

بث مباشر

import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage

// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(rotatedBitmap).build()
    

في مثال التعليمات البرمجية لميزة "تحديد معالم الوجه"، تتم معالجة إعداد البيانات في ملف FaceLandmarkerHelper.kt.

تنفيذ المهمة

استنادًا إلى نوع البيانات التي تعمل معها، استخدِم طريقة FaceLandmarker.detect...() الخاصة بهذا النوع من البيانات. استخدِم detect() للصور الفردية وdetectForVideo() للإطارات في ملفات الفيديو وdetectAsync() لأحداث بث الفيديو. عند إجراء عمليات رصد في مجرى فيديو، تأكَّد من تشغيل عمليات الرصد في سلسلة محادثات منفصلة لتجنُّب حظر سلسلة محادثات واجهة المستخدم.

تعرض عيّنات الرموز البرمجية التالية أمثلة بسيطة على كيفية تشغيل ميزة "وضع علامات على ملامح الوجه" في أوضاع البيانات المختلفة التالية:

صورة

val result = FaceLandmarker.detect(mpImage)
    

فيديو

val timestampMs = i * inferenceIntervalMs

FaceLandmarker.detectForVideo(mpImage, timestampMs)
    .let { detectionResult ->
        resultList.add(detectionResult)
    }
    

بث مباشر

val mpImage = BitmapImageBuilder(rotatedBitmap).build()
val frameTime = SystemClock.uptimeMillis()

FaceLandmarker.detectAsync(mpImage, frameTime)
    

يُرجى ملاحظة ما يلي:

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

في مثال التعليمات البرمجية لميزة "تحديد معالم الوجه"، تم تحديد الدوال detect وdetectForVideo و detectAsync في ملف FaceLandmarkerHelper.kt.

معالجة النتائج وعرضها

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

في ما يلي مثال على بيانات الإخراج من هذه المهمة:

FaceLandmarkerResult:
  face_landmarks:
    NormalizedLandmark #0:
      x: 0.5971359014511108
      y: 0.485361784696579
      z: -0.038440968841314316
    NormalizedLandmark #1:
      x: 0.3302789330482483
      y: 0.29289937019348145
      z: -0.09489090740680695
    ... (478 landmarks for each face)
  face_blendshapes:
    browDownLeft: 0.8296722769737244
    browDownRight: 0.8096957206726074
    browInnerUp: 0.00035583582939580083
    browOuterUpLeft: 0.00035752105759456754
    ... (52 blendshapes for each face)
  facial_transformation_matrixes:
    [9.99158978e-01, -1.23036895e-02, 3.91213447e-02, -3.70770246e-01]
    [1.66496094e-02,  9.93480563e-01, -1.12779640e-01, 2.27719707e+01]
    ...

تعرض الصورة التالية عرضًا مرئيًا لمعدّل تكرار المهمة:

رجل تمّ تخطيط مناطق وجهه بشكل هندسي للإشارة إلى شكل وجهه وأبعاده

يوضّح مثال رمز Face Landmarker كيفية عرض النتائج المعروضة من المهمة، اطّلِع على فئة OverlayView لمزيد من التفاصيل.