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

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

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

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

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

إذا كنت تقوم بتطبيق Pose Lookerer على Raspberry Pi، راجع مثال على Raspberry Pi التطبيق.

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

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

الطرود

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

$ python -m pip install mediapipe

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

عليك استيراد الفئات التالية للوصول إلى وظائف PoseMarker:

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

الطراز

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

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

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

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

إنشاء المهمة

تستخدم مهمة MediaPipe Pose Insightser الدالة 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 Insightser لاستخدامه مع صورة، راجع مثال الرمز البرمجي.

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

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

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

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

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

LIVE_STREAM: وضع البث المباشر للإدخال البيانات، مثل تلك الواردة من الكاميرا. في هذا الوضع، يجب أن يكون resultListener يتم استدعاءها لإعداد مستمع للحصول على النتائج بشكل غير متزامن.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_poses الحد الأقصى لعدد الوضعيات التي يمكن رصدها بواسطة أداة جذب الصور 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 Markdown يُخرج قناع تجزئة للجهاز الذي تم رصده وضعية. Boolean False
result_callback تعيين أداة معالجة النتيجة لتلقي نتائج المعلم بشكل غير متزامن عندما يكون Pose Insights في وضع البث المباشر لا يمكن استخدام الإذن إلا عند ضبط "وضع التشغيل" على 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 Recorder العناصر 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 Insightser.
  • عند التشغيل في الصورة أو نموذج الفيديو، يجب أن تكون مهمة Pose Insightser تحظر سلسلة التعليمات الحالية إلى أن تنتهي من معالجة صورة الإدخال أو الإطار.
  • عند تفعيل وضع البث المباشر، يتم عرض مهمة Pose Metricser. على الفور ولا تحظر سلسلة المحادثات الحالية سيؤدي إلى استدعاء النتيجة المستمع مع نتيجة الرصد في كل مرة ينتهي فيها من معالجة إطار الإدخال. إذا تم استدعاء وظيفة الاكتشاف عند استخدام مهمة Pose Markdown مشغولاً بمعالجة إطار آخر، فستتجاهل المهمة إطار الإدخال الجديد.

للحصول على مثال كامل لتشغيل Pose Insights على صورة، يمكنك الاطّلاع على مثال على الرمز البرمجي لمزيد من التفاصيل.

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

يعرض Pose Markdown كائنًا 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 Scroller طريقة عرض التي تم إرجاعها من المهمة، يمكنك الاطلاع على مثال على الرمز البرمجي لمزيد من التفاصيل.