تتيح لك مهمة MediaPipe Pose Landmarker رصد معالم أجسام البشر في صورة أو فيديو. يمكنك استخدام هذه المهمة لتحديد مواضع الجسم الرئيسية وتحليل الوضع و تصنيف الحركات. تستخدِم هذه المهمة نماذج تعلُّم الآلة التي تعمل مع الصور أو الفيديوهات الفردية. تُخرج المهمة معالم وضع الجسم في إحداثيات الصورة وفي إحداثيات العالم الثلاثية الأبعاد.
يتوفّر نموذج الرمز البرمجي الموضّح في هذه التعليمات على GitHub. لمزيد من المعلومات عن الإمكانات والنماذج وخيارات الضبط لهذه المهمة، اطّلِع على نظرة عامة.
مثال على الرمز البرمجي
يقدّم مثال الرمز البرمجي لميزة "وضع علامات على نقاط الالتقاط في الجسم" تنفيذًا كاملاً لهذه مهمة باستخدام Python، ويمكنك الرجوع إليه. يساعدك هذا الرمز في اختبار هذه المهمة والبدء في إنشاء علامة لتحديد الوضع. يمكنك عرض نموذج رمز ميزة "موضع الجسم" وتشغيله وتعديله باستخدام متصفّح الويب فقط.
إذا كنت بصدد تنفيذ ميزة "وضع علامات على المعالم" في Raspberry Pi، يُرجى الرجوع إلى مثال على تطبيق Raspberry Pi.
ضبط إعدادات الجهاز
يوضّح هذا القسم الخطوات الرئيسية لإعداد بيئة التطوير و مشاريع الرموز البرمجية لاستخدام أداة "وضع علامات على العناصر في اللقطة" خصيصًا. للحصول على معلومات عامة حول إعداد بيئة التطوير لاستخدام مهام MediaPipe، بما في ذلك requirements لإصدار النظام الأساسي، يُرجى الاطّلاع على دليل الإعداد لاستخدام لغة بايثون.
الطرود
تتطلّب مهمة MediaPipe Pose Landmarker حزمة mediapipe PyPI. يمكنك تثبيت هذه التبعيات واستيرادها باستخدام ما يلي:
$ python -m pip install mediapipe
عمليات الاستيراد
استورِد الفئات التالية للوصول إلى دوال مهمة علامة موضع الجسم:
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
الطراز
تتطلّب مهمة MediaPipe Pose Landmarker استخدام نموذج مدرَّب متوافق مع هذه المهمة. لمزيد من المعلومات عن النماذج المدربة المتاحة لميزة "وضع علامات على العناصر في اللقطة"، يُرجى الاطّلاع على قسم النماذج ضمن النظرة العامة على المهمة.
اختَر النموذج ونزِّله، ثم احفظه في دليل على الجهاز:
model_path = '/absolute/path/to/pose_landmarker.task'
استخدِم المَعلمة BaseOptions
عنصر model_asset_path
لتحديد مسار
النموذج المطلوب استخدامه. للاطّلاع على مثال على الرمز، يُرجى الاطّلاع على القسم التالي.
إنشاء المهمة
تستخدِم مهمة MediaPipe Pose Landmarker الدالة 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. # ...
للحصول على مثال كامل لإنشاء علامة مميّزة للوضع لاستخدامها مع صورة، اطّلِع على مثال على الرمز البرمجي.
خيارات الضبط
تتضمّن هذه المهمة خيارات الضبط التالية لتطبيقات Python:
اسم الخيار | الوصف | نطاق القيمة | القيمة التلقائية |
---|---|---|---|
running_mode |
لضبط وضع التشغيل للمهمة هناك ثلاثة
أوضاع: IMAGE: وضع الإدخالات باستخدام صورة واحدة. VIDEO: وضع الإطارات التي تم فك ترميزها في الفيديو 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 |
ما إذا كان عنصر وضع المَعلمات يُخرج قناعًا لتقسيم العناصر للوضع الذي تم رصده | Boolean |
False |
result_callback |
يضبط مستمع النتائج لتلقّي نتائج علامة المَعلمة
بشكل غير متزامن عندما تكون علامة مَعلمة الوضع في وضع البث المباشر.
لا يمكن استخدامها إلا عند ضبط وضع التشغيل على 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)
تنفيذ المهمة
يستخدِم عنصر وضع العلامات على نقاط المعالم الدالة 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)
يُرجى ملاحظة ما يلي:
- عند التشغيل في وضع الفيديو أو وضع البث المباشر، يجب أيضًا تزويد مهمة "وضع علامات على موضع الجسم" بالطوابع الزمنية لإطار الإدخال.
- عند التشغيل في نموذج الصورة أو الفيديو، تحظر مهمة علامة موضع الجسم سلسلة المهام الحالية إلى أن تنتهي من معالجة الصورة أو الإطار المُدخل.
- عند التشغيل في وضع البث المباشر، تُرجع مهمة علامة موضع الجسم على الفور ولا تحظر سلسلة المحادثات الحالية. سيستدعي المُستمع للنتائج نتيجة الكشف في كل مرة تنتهي فيها عملية معالجة إطار الإدخال. إذا تمّ استدعاء دالة الكشف عندما تكون مهمة "وضع علامات على نقاط الالتقاط" مشغولة في معالجة إطار آخر، ستتجاهل المهمة إطار الإدخال الجديد.
للحصول على مثال كامل لاستخدام ميزة "وضع علامة على موضع الجسم" في صورة، اطّلِع على مثال الرمز البرمجي للحصول على التفاصيل.
معالجة النتائج وعرضها
يعرض عنصر وضع علامة على معالم الجسم عنصرًا من النوع 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
: احتمال ظهور المَعلمة في الصورة
تعرض الصورة التالية عرضًا مرئيًا لمعدّل تكرار المهمة:
يمثّل قناع التقسيم الاختياري احتمالية أن تنتمي كل بكسل إلى شخص تم رصده. الصورة التالية هي قناع تقسيم لمخرجات المهمة:
يوضّح مثال رمز علامة موضع الجسم كيفية عرض النتائج التي تم إرجاعها من المهمة، اطّلِع على مثال الرمز لمعرفة التفاصيل.