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

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

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

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

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

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

تنزيل الرمز

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

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

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

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

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

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

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

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

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

التبعيات

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

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

الطراز

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

حدد النموذج ونزّله وخزّنه في دليل المشروع:

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

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

baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)

إنشاء المهمة

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

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

صورة

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)
    

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

خيارات الضبط

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

اسم الخيار الوصف نطاق القيمة القيمة التلقائية
runningMode تحدِّد هذه السياسة وضع التشغيل للمهمة. هناك ثلاثة أوضاع:

IMAGE: وضع إدخالات الصورة الفردية.

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

البث المباشر: وضع بث مباشر لبيانات الإدخال، مثل الكاميرا. في هذا الوضع، يجب استدعاء resultsListener لإعداد أداة معالجة الصوت لكي تتلقى النتائج بشكل غير متزامن.
{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

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

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

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

صورة

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()
    

في مثال رمز Face Brander، تتم معالجة عملية إعداد البيانات في ملف FaceLandmarkerHelper.kt.

تنفيذ المهمة

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

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

صورة

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)
    

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

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

في مثال رمز Face Brander، يتم تحديد الدوال 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 Brander كيفية عرض النتائج التي تم إرجاعها من المهمة. يمكنك الاطّلاع على الفئة OverlayView للحصول على مزيد من التفاصيل.