دليل التعرّف على الإيماءات لنظام التشغيل Android

تتيح لك مهمة التعرّف على الإيماءة MediaPipe التعرف على إيماءات اليد في الوقت الفعلي نتائج إيماءة اليد المعروفة ومعالم اليد الأيدي المرصودة. توضّح لك هذه التعليمات كيفية استخدام "أداة التعرّف على الإيماءة". من خلال تطبيقات Android. يتوفر نموذج التعليمة البرمجية الموضح في هذه التعليمات على 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/gesture_recognizer/android
    

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

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

تتضمن الملفات التالية الرمز المهم لإيماءة اليد هذه مثال على التعرف على الكلام:

  • GestureRecognizerHelper.kt - يؤدي هذا الإعداد إلى إعداد أداة التعرّف على الإيماءات والتعامل مع النموذج والتفويض. التحديد.
  • MainActivity.kt - لتنفيذ التطبيق، بما في ذلك طلب الرقم GestureRecognizerHelper GestureRecognizerResultsAdapter
  • GestureRecognizerResultsAdapter.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. في جلسة المعمل، مثال التعليمة البرمجية، يتم تحديد النموذج في GestureRecognizerHelper.kt الملف:

baseOptionBuilder.setModelAssetPath(MP_RECOGNIZER_TASK)

إنشاء المهمة

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

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

صورة

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

val optionsBuilder =
    GestureRecognizer.GestureRecognizerOptions.builder()
        .setBaseOptions(baseOptions)
        .setMinHandDetectionConfidence(minHandDetectionConfidence)
        .setMinTrackingConfidence(minHandTrackingConfidence)
        .setMinHandPresenceConfidence(minHandPresenceConfidence)
        .setRunningMode(RunningMode.IMAGE)

val options = optionsBuilder.build()
gestureRecognizer =
    GestureRecognizer.createFromOptions(context, options)
    

فيديو

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

val optionsBuilder =
    GestureRecognizer.GestureRecognizerOptions.builder()
        .setBaseOptions(baseOptions)
        .setMinHandDetectionConfidence(minHandDetectionConfidence)
        .setMinTrackingConfidence(minHandTrackingConfidence)
        .setMinHandPresenceConfidence(minHandPresenceConfidence)
        .setRunningMode(RunningMode.VIDEO)

val options = optionsBuilder.build()
gestureRecognizer =
    GestureRecognizer.createFromOptions(context, options)
    

بث مباشر

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

val optionsBuilder =
    GestureRecognizer.GestureRecognizerOptions.builder()
        .setBaseOptions(baseOptions)
        .setMinHandDetectionConfidence(minHandDetectionConfidence)
        .setMinTrackingConfidence(minHandTrackingConfidence)
        .setMinHandPresenceConfidence(minHandPresenceConfidence)
        .setResultListener(this::returnLivestreamResult)
        .setErrorListener(this::returnLivestreamError)
        .setRunningMode(RunningMode.LIVE_STREAM)

val options = optionsBuilder.build()
gestureRecognizer =
    GestureRecognizer.createFromOptions(context, options)
    

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

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

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

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

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

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

LIVE_STREAM: وضع البث المباشر للإدخال البيانات، مثل تلك الواردة من الكاميرا. في هذا الوضع، يجب أن يكون resultListener يتم استدعاءها لإعداد مستمع للحصول على النتائج بشكل غير متزامن.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
numHands يمكن اكتشاف الحد الأقصى لعدد الأيدي من خلال GestureRecognizer. Any integer > 0 1
minHandDetectionConfidence الحد الأدنى لنتيجة الثقة لرصد اليد تُعد ناجحة في نموذج اكتشاف راحة اليد. 0.0 - 1.0 0.5
minHandPresenceConfidence الحد الأدنى لدرجة الثقة في نتيجة التواجد باليد نموذج اكتشاف المعالم. في وضع "الفيديو" ووضع البث المباشر في "أداة التعرّف على الإيماءة"، إذا كانت نتيجة الثقة باليد من خلال نموذج المعالم على اليد أقل من هذا الحد، فإنها تؤدي إلى نموذج اكتشاف راحة اليد. بخلاف ذلك، استخدام خوارزمية تتبع اليد البسيطة لتحديد موقع اليد(الأيدي) لاكتشاف المعالم لاحقًا. 0.0 - 1.0 0.5
minTrackingConfidence يشير ذلك المصطلح إلى الحد الأدنى لدرجة الثقة التي يجب أن يراعيها تتبُّع اليد. وناجح. هذا هو الحد الأدنى لحجم صندوق الإحاطة بين اليدين في الإطار الحالي والإطار الأخير. في وضع الفيديو ووضع البث في أداة التعرّف على الإيماءة، إذا تعذَّر التتبُّع، تعمل ميزة التعرّف على الإيماءة على تشغيل اليد الرصد. وبخلاف ذلك، يتم تخطي اكتشاف اليد. 0.0 - 1.0 0.5
cannedGesturesClassifierOptions خيارات تهيئة سلوك مصنف الإيماءات الجاهزة. الإيماءات الجاهزة هي ["None", "Closed_Fist", "Open_Palm", "Pointing_Up", "Thumb_Down", "Thumb_Up", "Victory", "ILoveYou"]
  • لغة الأسماء المعروضة: اللغة المراد استخدامها للأسماء المعروضة المحددة من خلال البيانات الوصفية لنموذج TFLite، إن توفرت.
  • الحد الأقصى للنتائج: الحد الأقصى لعدد نتائج التصنيف الأعلى تقييمًا المطلوب عرضها. إذا كانت قيمة 0، سيتم عرض جميع النتائج المتاحة.
  • الحد الأدنى للنتيجة: النتيجة التي رُفضت النتائج التي تكون دونها. في حال ضبط هذه السياسة على 0، سيتم عرض جميع النتائج المتاحة.
  • القائمة المسموح بها للفئات: القائمة المسموح بها لأسماء الفئات. إذا كانت غير فارغة، فسيتم تصفية نتائج التصنيف التي لا توجد فئتها في هذه المجموعة. الأحداث المتنافية مع قائمة الحظر.
  • قائمة حظر الفئات: قائمة حظر أسماء الفئات إذا لم يكن الحقل فارغًا، فستتم فلترة نتائج التصنيف التي تحتوي على فئتها في هذه المجموعة. يمكن استخدام القائمة المسموح بها بشكل تبادلي.
    • لغة الأسماء المعروضة: any string
    • الحد الأقصى للنتائج: any integer
    • الحد الأدنى للنتيجة: 0.0-1.0
    • القائمة المسموح بها للفئات: vector of strings
    • قائمة حظر الفئات: vector of strings
    • لغة الأسماء المعروضة: "en"
    • الحد الأقصى للنتائج: -1
    • الحد الأدنى للنتيجة: 0
    • القائمة المسموح بها للفئات: فارغة
    • قائمة حظر الفئات: فارغة
    customGesturesClassifierOptions خيارات ضبط سلوك مصنِّف الإيماءات المخصّصة
  • لغة الأسماء المعروضة: اللغة المراد استخدامها للأسماء المعروضة المحددة من خلال البيانات الوصفية لنموذج TFLite، إن توفرت.
  • الحد الأقصى للنتائج: الحد الأقصى لعدد نتائج التصنيف الأعلى تقييمًا المطلوب عرضها. إذا كانت قيمة 0، سيتم عرض جميع النتائج المتاحة.
  • الحد الأدنى للنتيجة: النتيجة التي رُفضت النتائج التي تكون دونها. في حال ضبط هذه السياسة على 0، سيتم عرض جميع النتائج المتاحة.
  • القائمة المسموح بها للفئات: القائمة المسموح بها لأسماء الفئات. إذا كانت غير فارغة، فسيتم تصفية نتائج التصنيف التي لا توجد فئتها في هذه المجموعة. الأحداث المتنافية مع قائمة الحظر.
  • قائمة حظر الفئات: قائمة حظر أسماء الفئات إذا لم يكن الحقل فارغًا، فستتم فلترة نتائج التصنيف التي تحتوي على فئتها في هذه المجموعة. يمكن استخدام القائمة المسموح بها بشكل تبادلي.
    • لغة الأسماء المعروضة: any string
    • الحد الأقصى للنتائج: any integer
    • الحد الأدنى للنتيجة: 0.0-1.0
    • القائمة المسموح بها للفئات: vector of strings
    • قائمة حظر الفئات: vector of strings
    • لغة الأسماء المعروضة: "en"
    • الحد الأقصى للنتائج: -1
    • الحد الأدنى للنتيجة: 0
    • القائمة المسموح بها للفئات: فارغة
    • قائمة حظر الفئات: فارغة
    resultListener تعمل هذه السياسة على ضبط أداة معالجة النتائج لتلقّي نتائج التصنيف. بشكل غير متزامن عندما تكون أداة التعرّف على الإيماءات في وضع البث المباشر لا يمكن استخدام الإذن إلا عند ضبط "وضع التشغيل" على LIVE_STREAM ResultListener لا ينطبق لا ينطبق
    errorListener تضبط هذه السياسة أداة معالجة للأخطاء اختيارية. ErrorListener لا ينطبق لا ينطبق

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

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

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

    صورة

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

    في جلسة المعمل، مثال على رمز أداة التعرّف على الإيماءة، يتم التعامل مع إعداد البيانات في GestureRecognizerHelper.kt الملف.

    تنفيذ المهمة

    تستخدم ميزة "التعرُّف على الإيماءة" recognize وrecognizeForVideo وrecognizeAsync. الدوال لإثارة الاستنتاجات. للتعرف على الإيماءات، فإن ذلك يتضمن المعالجة المسبقة لبيانات الإدخال، اكتشاف الأيدي في الصورة، اكتشاف اليد والمعالم والتعرف على إيماءة اليد من المعالم.

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

    صورة

    val result = gestureRecognizer?.recognize(mpImage)
        

    فيديو

    val timestampMs = i * inferenceIntervalMs
    
    gestureRecognizer?.recognizeForVideo(mpImage, timestampMs)
        ?.let { recognizerResult ->
            resultList.add(recognizerResult)
        }
        

    بث مباشر

    val mpImage = BitmapImageBuilder(rotatedBitmap).build()
    val frameTime = SystemClock.uptimeMillis()
    
    gestureRecognizer?.recognizeAsync(mpImage, frameTime)
        

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

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

    في جلسة المعمل، مثال على الرمز البرمجي الخاص بميزة "التعرّف على الإيماءة"، وهو recognize وrecognizeForVideo يتم تحديد دوال recognizeAsync في GestureRecognizerHelper.kt الملف.

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

    تُنشئ أداة التعرّف على الإيماءة كائن نتيجة لاكتشاف الإيماءة لكل تشغيل التعرف. يحتوي كائن النتيجة على معالم يدوية في إحداثيات الصورة، معالم لليد في إحداثيات العالم واستخدام اليد(اليد اليسرى أو اليمنى) واليد وفئات الإيماءات للأيدي المرصودة.

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

    تحتوي GestureRecognizerResult الناتجة على أربعة مكوّنات، وكل مكوّن هو مصفوفة يحتوي كل عنصر فيها على النتيجة التي تم رصدها بيد واحدة.

    • استخدام إحدى اليدين

      ويشير مقياس "استخدام اليدين" إلى ما إذا كانت الأيدي اليسرى أو اليمنى.

    • الإيماءات

      فئات الإيماءات التي يتم التعرّف عليها للأيدي المرصودة.

    • المعالم

      هناك 21 مَعلمًا لليد، ويتألف كلّ منها من إحداثيات x وy وz. تشير رسالة الأشكال البيانية تتم تسوية إحداثيات x وy إلى [0.0، 1.0] حسب عرض الصورة الارتفاع، على التوالي. ويمثل الإحداثي z عمق المَعلم، مع العمق في المعصم هو المنشأ. كلما كانت القيمة أصغر، اقتربت هو أمام الكاميرا. يستخدم المقدار z تقريبًا نفس المقياس مثل x

    • معالم عالمية

      يتم أيضًا عرض المعالم البالغ عددها 21 يدًا في الإحداثيات العالمية. كل مَعلم تتكون من x وy وz، وتمثل الإحداثيات الثلاثية الأبعاد في العالم الحقيقي في مترًا مع نقطة الأصل في مركز اليد الهندسي.

    GestureRecognizerResult:
      Handedness:
        Categories #0:
          index        : 0
          score        : 0.98396
          categoryName : Left
      Gestures:
        Categories #0:
          score        : 0.76893
          categoryName : Thumb_Up
      Landmarks:
        Landmark #0:
          x            : 0.638852
          y            : 0.671197
          z            : -3.41E-7
        Landmark #1:
          x            : 0.634599
          y            : 0.536441
          z            : -0.06984
        ... (21 landmarks for a hand)
      WorldLandmarks:
        Landmark #0:
          x            : 0.067485
          y            : 0.031084
          z            : 0.055223
        Landmark #1:
          x            : 0.063209
          y            : -0.00382
          z            : 0.020920
        ... (21 world landmarks for a hand)
    

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

    في جلسة المعمل، مثال على رمز أداة التعرّف على الإيماءة، وهي الفئة GestureRecognizerResultsAdapter في GestureRecognizerResultsAdapter.kt معالجة النتائج.