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

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

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

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

رمز مثال "مهام MediaPipe" هو تنفيذ بسيط لمحدِّد الوجه. تطبيق 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 وتشغيل التطبيق. للحصول على إرشادات، راجع دليل إعداد Android

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

تحتوي الملفات التالية على الرمز المهم لهذا المثال على ترميز الوجه. app:

  • 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 Premierer حزمة نموذج مدرّبة ومتوافقة مع هذه المهمة. للحصول على مزيد من المعلومات حول النماذج المدرَّبة المتاحة لأداة التعرّف على الوجه، راجِع نظرة عامة على المهام في قسم "النماذج".

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

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

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

baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)

إنشاء المهمة

تستخدم مهمة MediaPipe Face Premierer الوظيفة 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)
    

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

خيارات الإعداد

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

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

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

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

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]
    ...

تُظهر الصورة التالية تصورًا لنتج المهمة:

يوضح مثال رمز "أداة ترميز الوجه" طريقة عرض النتائج التي تم عرضها. من المهمة، راجع OverlayView لمزيد من التفاصيل.