دليل التعرف على الإيماءات في بايثون

تتيح لك مهمة التعرّف على الإيماءة MediaPipe التعرف على إيماءات اليد في الوقت الفعلي تعمل هذه الميزة على إظهار نتائج إيماءة اليد المعروفة ومعالم اليد التي تم رصدها. يَدَان توضّح لك هذه التعليمات كيفية استخدام "أداة التعرّف على الإيماءة". باستخدام تطبيقات بايثون.

يمكنك رؤية هذه المهمة وهي قيد التنفيذ من خلال عرض صفحة الويب تجريبي بالنسبة إلى مزيد من المعلومات حول الإمكانات والنماذج وخيارات التهيئة هذه المهمة، راجع نظرة عامة.

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

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

في حال تطبيق أداة التعرّف على الإيماءة لتطبيق Raspberry Pi، يمكنك الرجوع إلى مثال على Raspberry Pi التطبيق.

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

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

الطرود

تتطلب مهمة أداة التعرّف على الإيماءة MediaPipe حزمة MediaPI pyPI. يمكنك تثبيت استيراد هذه التبعيات مع ما يلي:

$ python -m pip install mediapipe

عمليات الاستيراد

عليك استيراد الفئات التالية للوصول إلى وظائف "أداة التعرّف على الإيماءة":

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

الطراز

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

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

model_path = '/absolute/path/to/gesture_recognizer.task'

حدّد مسار النموذج ضمن معلمة اسم النموذج، كما هو موضح أدناه:

base_options = BaseOptions(model_asset_path=model_path)

إنشاء المهمة

تستخدم مهمة التعرّف على إيماءة MediaPipe الوظيفة create_from_options لإعداد المهمة. تقبل الدالة create_from_options قيم الإعداد. المتاحة للتعامل معها. لمزيد من المعلومات حول خيارات الضبط، يُرجى الاطّلاع على خيارات الإعداد:

يوضح الرمز التالي كيفية إنشاء هذه المهمة وإعدادها.

تُظهر هذه العينات أيضًا صيغ إنشاء المهمة للصور، وملفات الفيديو وأحداث الفيديو المباشرة.

صورة

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
GestureRecognizer = mp.tasks.vision.GestureRecognizer
GestureRecognizerOptions = mp.tasks.vision.GestureRecognizerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a gesture recognizer instance with the image mode:
options = GestureRecognizerOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.IMAGE)
with GestureRecognizer.create_from_options(options) as recognizer:
  # The detector is initialized. Use it here.
  # ...
    

فيديو

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
GestureRecognizer = mp.tasks.vision.GestureRecognizer
GestureRecognizerOptions = mp.tasks.vision.GestureRecognizerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a gesture recognizer instance with the video mode:
options = GestureRecognizerOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO)
with GestureRecognizer.create_from_options(options) as recognizer:
  # The detector is initialized. Use it here.
  # ...
    

بث مباشر

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
GestureRecognizer = mp.tasks.vision.GestureRecognizer
GestureRecognizerOptions = mp.tasks.vision.GestureRecognizerOptions
GestureRecognizerResult = mp.tasks.vision.GestureRecognizerResult
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a gesture recognizer instance with the live stream mode:
def print_result(result: GestureRecognizerResult, output_image: mp.Image, timestamp_ms: int):
    print('gesture recognition result: {}'.format(result))

options = GestureRecognizerOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.LIVE_STREAM,
    result_callback=print_result)
with GestureRecognizer.create_from_options(options) as recognizer:
  # The detector is initialized. Use it here.
  # ...
    

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

تشتمل هذه المهمة على خيارات الإعداد التالية لتطبيقات بايثون:

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

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

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

LIVE_STREAM: وضع البث المباشر للإدخال البيانات، مثل تلك الواردة من الكاميرا. في هذا الوضع، يجب أن يكون resultListener يتم استدعاءها لإعداد مستمع للحصول على النتائج بشكل غير متزامن.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_hands يمكن اكتشاف الحد الأقصى لعدد الأيدي من خلال GestureRecognizer. Any integer > 0 1
min_hand_detection_confidence الحد الأدنى لنتيجة الثقة لرصد اليد تُعد ناجحة في نموذج اكتشاف راحة اليد. 0.0 - 1.0 0.5
min_hand_presence_confidence الحد الأدنى لدرجة الثقة في نتيجة التواجد باليد نموذج اكتشاف المعالم. في وضع "الفيديو" ووضع البث المباشر في "أداة التعرّف على الإيماءة"، إذا كانت نتيجة الثقة باليد من خلال نموذج المعالم على اليد أقل من هذا الحد، فإنها تؤدي إلى نموذج اكتشاف راحة اليد. بخلاف ذلك، استخدام خوارزمية تتبع اليد البسيطة لتحديد موقع اليد(الأيدي) لاكتشاف المعالم لاحقًا. 0.0 - 1.0 0.5
min_tracking_confidence يشير ذلك المصطلح إلى الحد الأدنى لدرجة الثقة التي يجب أن يراعيها تتبُّع اليد. وناجح. هذا هو الحد الأدنى لحجم صندوق الإحاطة بين اليدين في الإطار الحالي والإطار الأخير. في وضع الفيديو ووضع البث في أداة التعرّف على الإيماءة، إذا تعذَّر التتبُّع، تعمل ميزة التعرّف على الإيماءة على تشغيل اليد الرصد. وبخلاف ذلك، يتم تخطي اكتشاف اليد. 0.0 - 1.0 0.5
canned_gestures_classifier_options خيارات تهيئة سلوك مصنف الإيماءات الجاهزة. الإيماءات الجاهزة هي ["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
    • القائمة المسموح بها للفئات: فارغة
    • قائمة حظر الفئات: فارغة
    custom_gestures_classifier_options خيارات ضبط سلوك مصنِّف الإيماءات المخصّصة
  • لغة الأسماء المعروضة: اللغة المراد استخدامها للأسماء المعروضة المحددة من خلال البيانات الوصفية لنموذج TFLite، إن توفرت.
  • الحد الأقصى للنتائج: الحد الأقصى لعدد نتائج التصنيف الأعلى تقييمًا المطلوب عرضها. إذا كانت قيمة 0، سيتم عرض جميع النتائج المتاحة.
  • الحد الأدنى للنتيجة: النتيجة التي رُفضت النتائج التي تكون دونها. في حال ضبط هذه السياسة على 0، سيتم عرض جميع النتائج المتاحة.
  • القائمة المسموح بها للفئات: القائمة المسموح بها لأسماء الفئات. إذا كانت غير فارغة، فسيتم تصفية نتائج التصنيف التي لا توجد فئتها في هذه المجموعة. الأحداث المتنافية مع قائمة الحظر.
  • قائمة حظر الفئات: قائمة حظر أسماء الفئات إذا لم يكن الحقل فارغًا، فستتم فلترة نتائج التصنيف التي تحتوي على فئتها في هذه المجموعة. يمكن استخدام القائمة المسموح بها بشكل تبادلي.
    • لغة الأسماء المعروضة: any string
    • الحد الأقصى للنتائج: any integer
    • الحد الأدنى للنتيجة: 0.0-1.0
    • القائمة المسموح بها للفئات: vector of strings
    • قائمة حظر الفئات: vector of strings
    • لغة الأسماء المعروضة: "en"
    • الحد الأقصى للنتائج: -1
    • الحد الأدنى للنتيجة: 0
    • القائمة المسموح بها للفئات: فارغة
    • قائمة حظر الفئات: فارغة
    result_callback تعمل هذه السياسة على ضبط أداة معالجة النتائج لتلقّي نتائج التصنيف. بشكل غير متزامن عندما تكون أداة التعرّف على الإيماءات في وضع البث المباشر لا يمكن استخدام الإذن إلا عند ضبط "وضع التشغيل" على LIVE_STREAM ResultListener لا ينطبق لا ينطبق

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

    قم بإعداد الإدخال كملف صورة أو صفيفة numpy، ثم قم بتحويله إلى عنصر mediapipe.Image. إذا كان الإدخال هو ملف فيديو أو بث مباشر من كاميرا ويب، يمكنك استخدام مكتبة خارجية مثل OpenCV لتحميل إطارات الإدخال بتنسيق numpy الصفائف.

    صورة

    import mediapipe as mp
    
    # Load the input image from an image file.
    mp_image = mp.Image.create_from_file('/path/to/image')
    
    # Load the input image from a numpy array.
    mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_image)
        

    فيديو

    import mediapipe as mp
    
    # Use OpenCV’s VideoCapture to load the input video.
    
    # Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
    # You’ll need it to calculate the timestamp for each frame.
    
    # Loop through each frame in the video using VideoCapture#read()
    
    # Convert the frame received from OpenCV to a MediaPipe’s Image object.
    mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
        

    بث مباشر

    import mediapipe as mp
    
    # Use OpenCV’s VideoCapture to start capturing from the webcam.
    
    # Create a loop to read the latest frame from the camera using VideoCapture#read()
    
    # Convert the frame received from OpenCV to a MediaPipe’s Image object.
    mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
        

    تنفيذ المهمة

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

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

    صورة

    # Perform gesture recognition on the provided single image.
    # The gesture recognizer must be created with the image mode.
    gesture_recognition_result = recognizer.recognize(mp_image)
        

    فيديو

    # Perform gesture recognition on the provided single image.
    # The gesture recognizer must be created with the video mode.
    gesture_recognition_result = recognizer.recognize_for_video(mp_image, frame_timestamp_ms)
        

    بث مباشر

    # Send live image data to perform gesture recognition.
    # The results are accessible via the `result_callback` provided in
    # the `GestureRecognizerOptions` object.
    # The gesture recognizer must be created with the live stream mode.
    recognizer.recognize_async(mp_image, frame_timestamp_ms)
        

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

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

    للاطّلاع على مثال كامل لتشغيل "أداة التعرّف على الإيماءة" على صورة، يمكنك الاطّلاع على الرمز مثال لمزيد من التفاصيل.

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

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

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

    تحتوي 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)
    

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

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