إعداد دليل كشف المَعلم في بايثون

تتيح لك مَهمّة MediaPipe Pose تجاهّرل رصد معالم الأجسام البشرية في صورة أو فيديو. يمكنك استخدام هذه المهمة لتحديد الأماكن الرئيسية للجسم وتحليل وضعية الجسم وتصنيف الحركات. تستعين هذه المهمة بنماذج تعلُّم الآلة التي تعمل مع الصور أو الفيديوهات الفردية. تُخرج المهمة معالم وضعية الجسم في إحداثيات الصور وفي إحداثيات العالم ثلاثية الأبعاد.

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

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

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

في حالة تنفيذ Pose Marker لـ Raspberry Pi، راجع مثال على تطبيق Raspberry Pi.

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

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

الطرود

تتطلب مهمة MediaPipe Pose Builderer حزمة Media تطابق PyPI. يمكنك تثبيت هذه التبعيات واستيرادها باستخدام ما يلي:

$ python -m pip install mediapipe

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

قم باستيراد الفئات التالية للوصول إلى وظائف مهمة Poseاخorer (أداة تحديد المواقع):

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

الطراز

تتطلب مهمة MediaPipe Pose Builderer نموذجًا مدرَّبًا متوافقًا مع هذه المهمة. لمزيد من المعلومات حول النماذج المدربة المتاحة من أجل Pose Marker، راجع نظرة عامة على المهمة في قسم النماذج.

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

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

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

إنشاء المهمة

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

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

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

صورة

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
PoseLandmarker = mp.tasks.vision.PoseLandmarker
PoseLandmarkerOptions = mp.tasks.vision.PoseLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = PoseLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.IMAGE)

with PoseLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

حملة فيديو

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
PoseLandmarker = mp.tasks.vision.PoseLandmarker
PoseLandmarkerOptions = mp.tasks.vision.PoseLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a pose landmarker instance with the video mode:
options = PoseLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.VIDEO)

with PoseLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

البث المباشر

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
PoseLandmarker = mp.tasks.vision.PoseLandmarker
PoseLandmarkerOptions = mp.tasks.vision.PoseLandmarkerOptions
PoseLandmarkerResult = mp.tasks.vision.PoseLandmarkerResult
VisionRunningMode = mp.tasks.vision.RunningMode

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

options = PoseLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.LIVE_STREAM,
    result_callback=print_result)

with PoseLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

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

خيارات الضبط

تتضمن هذه المهمة خيارات التهيئة التالية لتطبيقات بايثون:

اسم الخيار الوصف نطاق القيمة القيمة التلقائية
running_mode تحدِّد هذه السياسة وضع التشغيل للمهمة. هناك ثلاثة أوضاع:

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

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

البث المباشر: وضع بث مباشر لبيانات الإدخال، مثل الكاميرا. في هذا الوضع، يجب استدعاء resultsListener لإعداد أداة معالجة الصوت لكي تتلقى النتائج بشكل غير متزامن.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_poses تمثّل هذه السمة الحد الأقصى لعدد الأوضاع التي يمكن رصدها من خلال أداة Pose Builders. Integer > 0 1
min_pose_detection_confidence تمثّل هذه السمة الحد الأدنى لدرجة الثقة ليتم اعتبار ميزة اكتشاف الوضعية ناجحة. Float [0.0,1.0] 0.5
min_pose_presence_confidence الحد الأدنى لدرجة الثقة لنتيجة التواجد في الوضعية في رصد المَعلمات التي يتم رصدها. Float [0.0,1.0] 0.5
min_tracking_confidence تمثّل هذه السمة الحد الأدنى لدرجة الثقة ليتم اعتبار تتبُّع الوضعية ناجحًا. Float [0.0,1.0] 0.5
output_segmentation_masks ما إذا كانت أداة Pose تجاهُل تُظهر قناع تصنيف للوضع الذي تم رصده. Boolean False
result_callback تعمل هذه السياسة على ضبط أداة معالجة النتائج لكي تتلقّى نتائج المؤشر بشكل غير متزامن عندما تكون أداة Pose Builderer في وضع البث المباشر. لا يمكن استخدام هذا الخيار إلا عند ضبط وضع التشغيل على LIVE_STREAM. ResultListener N/A

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

جهِّز الإدخال كملف صورة أو صفيفة 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)
    

تنفيذ المهمة

يستخدم Pose Marker الدوال detect وdetect_for_video وdetect_async لعرض الاستنتاجات. بالنسبة لوضع المعالم، يتضمن ذلك المعالجة المسبقة لبيانات الإدخال واكتشاف الأوضاع في الصورة.

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

صورة

# Perform pose landmarking on the provided single image.
# The pose landmarker must be created with the image mode.
pose_landmarker_result = landmarker.detect(mp_image)
    

حملة فيديو

# Perform pose landmarking on the provided single image.
# The pose landmarker must be created with the video mode.
pose_landmarker_result = landmarker.detect_for_video(mp_image, frame_timestamp_ms)
    

البث المباشر

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

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

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

للحصول على مثال كامل لتشغيل Pose Builderer على صورة، راجع مثال الرمز البرمجي للحصول على التفاصيل.

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

تعرض أداة Pose Brander كائن poseLandmarkerResult لكل عملية اكتشاف. يحتوي كائن النتيجة على إحداثيات لكل مَعلم وضعية.

ويوضح ما يلي مثالاً على بيانات المخرجات من هذه المهمة:

PoseLandmarkerResult:
  Landmarks:
    Landmark #0:
      x            : 0.638852
      y            : 0.671197
      z            : 0.129959
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.634599
      y            : 0.536441
      z            : -0.06984
      visibility   : 0.999909
      presence     : 0.999958
    ... (33 landmarks per pose)
  WorldLandmarks:
    Landmark #0:
      x            : 0.067485
      y            : 0.031084
      z            : 0.055223
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.063209
      y            : -0.00382
      z            : 0.020920
      visibility   : 0.999976
      presence     : 0.999998
    ... (33 world landmarks per pose)
  SegmentationMasks:
    ... (pictured below)

يحتوي الناتج على كلٍّ من الإحداثيات التي تمت تسويتها (Landmarks) والإحداثيات العالمية (WorldLandmarks) لكل مَعلم.

يحتوي الناتج على الإحداثيات التالية التي تمت تسويتها (Landmarks):

  • x وy: إحداثيات مَعلم تمت تسويتها بين 0.0 و1.0 على عرض الصورة (x) وارتفاعها (y).

  • z: عمق المعالم، وعمق عند منتصف الوركين كلما كانت القيمة أصغر، اقترب المَعلم من الكاميرا. يستخدم مقدار z المقياس نفسه تقريبًا مثل x.

  • visibility: احتمالية ظهور المَعلَم داخل الصورة

يحتوي الناتج على الإحداثيات العالمية التالية (WorldLandmarks):

  • x وy وz: إحداثيات ثلاثية الأبعاد واقعية بالمتر مع منتصف الوركين باعتبارها نقطة الانطلاق

  • visibility: احتمالية ظهور المَعلَم داخل الصورة

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

ويمثل قناع التصنيف الاختياري احتمالية انتماء كل بكسل لشخص تم اكتشافه. الصورة التالية هي قناع تجزئة لناتج المهمة:

يوضح رمز نموذج Pose Builderer كيفية عرض النتائج التي يتم إرجاعها من المهمة، راجع مثال الرمز البرمجي للحصول على التفاصيل.