دليل اكتشاف المعالم يدويًا في Python

تتيح لك مهمة "وضع علامات على أيدي الأشخاص" من MediaPipe رصد معالم الأيدي في الصورة. توضّح لك هذه التعليمات كيفية استخدام أداة "وضع علامات على أجزاء اليد" مع Python. يتوفّر نموذج الرمز البرمجي الموضّح في هذه التعليمات على GitHub.

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

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

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

إذا كنت بصدد تنفيذ ميزة "وضع علامات على أجزاء اليد" لأجهزة Raspberry Pi، يُرجى الرجوع إلى مثال تطبيق Raspberry Pi.

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

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

الطرود

تتطلّب مهمة MediaPipe Hand Landmarker حزمة mediapipe PyPI. يمكنك تثبيت هذه التبعيات واستيرادها باستخدام ما يلي:

$ python -m pip install mediapipe

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

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

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

الطراز

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

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

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

استخدِم المَعلمة BaseOptions عنصر model_asset_path لتحديد مسار النموذج المطلوب استخدامه. للاطّلاع على مثال على الرمز، يُرجى الاطّلاع على القسم التالي.

إنشاء المهمة

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

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

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

صورة

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
HandLandmarker = mp.tasks.vision.HandLandmarker
HandLandmarkerOptions = mp.tasks.vision.HandLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a hand landmarker instance with the image mode:
options = HandLandmarkerOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.IMAGE)
with HandLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

فيديو

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
HandLandmarker = mp.tasks.vision.HandLandmarker
HandLandmarkerOptions = mp.tasks.vision.HandLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a hand landmarker instance with the video mode:
options = HandLandmarkerOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO)
with HandLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

بث مباشر

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
HandLandmarker = mp.tasks.vision.HandLandmarker
HandLandmarkerOptions = mp.tasks.vision.HandLandmarkerOptions
HandLandmarkerResult = mp.tasks.vision.HandLandmarkerResult
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a hand landmarker instance with the live stream mode:
def print_result(result: HandLandmarkerResult, output_image: mp.Image, timestamp_ms: int):
    print('hand landmarker result: {}'.format(result))

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

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

خيارات الضبط

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

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

IMAGE: وضع الإدخالات المكوّنة من صورة واحدة.

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

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

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

عليك إعداد الإدخال كملف صورة أو صفيفة 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)
    

تنفيذ المهمة

يستخدم Hand Landmarker الدوالّ detect وdetect_for_video وdetect_async لبدء الاستنتاجات. بالنسبة إلى ميزة "التعرّف على معالم اليد"، يشمل ذلك المعالجة المُسبَقة لبيانات الإدخال، ورصد الأيدي في الصورة، ورصد معالم اليد.

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

صورة

# Perform hand landmarks detection on the provided single image.
# The hand landmarker must be created with the image mode.
hand_landmarker_result = landmarker.detect(mp_image)
    

فيديو

# Perform hand landmarks detection on the provided single image.
# The hand landmarker must be created with the video mode.
hand_landmarker_result = landmarker.detect_for_video(mp_image, frame_timestamp_ms)
    

بث مباشر

# Send live image data to perform hand landmarks detection.
# The results are accessible via the `result_callback` provided in
# the `HandLandmarkerOptions` object.
# The hand landmarker must be created with the live stream mode.
landmarker.detect_async(mp_image, frame_timestamp_ms)
    

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

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

للحصول على مثال كامل لاستخدام علامة مميّزة لليد على صورة، اطّلِع على مثال الرمز البرمجي لمعرفة التفاصيل.

معالجة النتائج وعرضها

ينشئ "مُحدِّد معالم اليد" عنصر نتيجة "مُحدِّد معالم اليد" لكل عملية رصد. يحتوي عنصر النتيجة على معالِم اليد في إحداثيات الصورة ومعالِم اليد في إحداثيات العالم واتجاه اليد(اليد اليسرى/اليمنى) لليدين التي تم رصدها.

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

يحتوي الناتج HandLandmarkerResult على ثلاثة مكوّنات. يكون كل عنصر مصفوفة، حيث يشتمل كل عنصر على النتائج التالية ليد واحدة تم اكتشافها:

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

    يشير مقياس اليد المفضّلة إلى ما إذا كانت الأيدي التي تم رصدها هي اليد اليمنى أو اليسرى.

  • المعالم

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

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

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

HandLandmarkerResult:
  Handedness:
    Categories #0:
      index        : 0
      score        : 0.98396
      categoryName : Left
  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)

تعرض الصورة التالية عرضًا مرئيًا لمعدّل تكرار المهمة:

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