دليل "التعرّف على الوجوه" على أجهزة Android

تتيح لك مهمة "أداة رصد الوجوه" من MediaPipe رصد الوجوه في صورة أو فيديو. يمكنك استخدام هذه المهمة لتحديد الوجوه وملامح الوجه داخل إطار. تستخدم هذه المهمة للتعلم الآلي (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_detector/android
    

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

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

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

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

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

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

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

val modelName = "face_detection_short_range.tflite"
baseOptionsBuilder.setModelAssetPath(modelName)

إنشاء المهمة

تستخدم مهمة "أداة رصد الوجوه MediaPipe" الوظيفة createFromOptions() لإعداد المهمة. تقبل الدالة createFromOptions() قيم الإعدادات. الخيارات. لمزيد من المعلومات حول خيارات الضبط، يُرجى الاطّلاع على خيارات الإعداد:

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

صورة

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

val optionsBuilder =
    FaceDetector.FaceDetectorOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinDetectionConfidence(threshold)
        .setRunningMode(RunningMode.IMAGE)

val options = optionsBuilder.build()

FaceDetector =
    FaceDetector.createFromOptions(context, options)
    

فيديو

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

val optionsBuilder =
    FaceDetector.FaceDetectorOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinDetectionConfidence(threshold)
        .setRunningMode(RunningMode.VIDEO)

val options = optionsBuilder.build()

FaceDetector =
    FaceDetector.createFromOptions(context, options)
    

بث مباشر

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

val optionsBuilder =
    FaceDetector.FaceDetectorOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinDetectionConfidence(threshold)
        .setResultListener(this::returnLivestreamResult)
        .setErrorListener(this::returnLivestreamError)
        .setRunningMode(RunningMode.LIVE_STREAM)

val options = optionsBuilder.build()

FaceDetector =
    FaceDetector.createFromOptions(context, options)
    

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

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

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

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

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

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

LIVE_STREAM: وضع البث المباشر للإدخال البيانات، مثل تلك الواردة من الكاميرا. في هذا الوضع، يجب أن يكون resultListener يتم استدعاءها لإعداد مستمع للحصول على النتائج بشكل غير متزامن.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
minDetectionConfidence يشير ذلك إلى الحد الأدنى لنتيجة الثقة التي يتم اعتبارها لرصد الوجوه بنجاح. Float [0,1] 0.5
minSuppressionThreshold الحد الأدنى للإلغاء بدون الحد الأقصى ليتم اعتبار الوجه متداخلاً. Float [0,1] 0.3
resultListener تعيين أداة معالجة النتيجة لتلقي نتائج الرصد بشكل غير متزامن عندما تكون ميزة "التعرّف على الوجوه" في البث المباشر الحالي. لا يمكن استخدام هذا الإعداد إلا عند ضبط "وضع التشغيل" على LIVE_STREAM. N/A Not set
errorListener تضبط هذه السياسة أداة معالجة للأخطاء اختيارية. N/A Not set

تجهيز البيانات

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

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

صورة

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

في جلسة المعمل، مثال على رمز أداة كشف الوجه، يتم التعامل مع إعداد البيانات في FaceDetectorHelper.kt الملف.

تنفيذ المهمة

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

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

صورة

val result = faceDetector.detect(mpImage)
    

فيديو

val timestampMs = i * inferenceIntervalMs

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

بث مباشر

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

faceDetector.detectAsync(mpImage, frameTime)
    

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

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

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

التعامل مع العملاء وعرض النتائج

تعرض ميزة "رصد الوجوه" عنصر FaceDetectorResult لكل عملية رصد. الجري. يحتوي كائن النتيجة على مربّعات إحاطة للوجوه التي تم اكتشافها درجة الثقة لكل وجه يتم رصده

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

FaceDetectionResult:
  Detections:
    Detection #0:
      BoundingBox:
        origin_x: 126
        origin_y: 100
        width: 463
        height: 463
      Categories:
        Category #0:
          index: 0
          score: 0.9729152917861938
      NormalizedKeypoints:
        NormalizedKeypoint #0:
          x: 0.18298381567001343
          y: 0.2961040139198303
        NormalizedKeypoint #1:
          x: 0.3302789330482483
          y: 0.29289937019348145
        ... (6 keypoints for each face)
    Detection #1:
      BoundingBox:
        origin_x: 616
        origin_y: 193
        width: 430
        height: 430
      Categories:
        Category #0:
          index: 0
          score: 0.9251380562782288
      NormalizedKeypoints:
        NormalizedKeypoint #0:
          x: 0.6151331663131714
          y: 0.3713381886482239
        NormalizedKeypoint #1:
          x: 0.7460576295852661
          y: 0.38825345039367676
        ... (6 keypoints for each face)

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

بالنسبة إلى الصورة التي لا تحتوي على مربّعات إحاطة، يمكنك الاطّلاع على الصورة الأصلية.

يوضح مثال الرمز البرمجي لميزة "التعرّف على الوجوه" طريقة عرض التي تم إرجاعها من المهمة، يمكنك الاطلاع على OverlayView لمزيد من التفاصيل.