وظیفه MediaPipe Pose Landmarker به شما امکان می دهد نشانه های بدن انسان را در یک تصویر یا ویدیو تشخیص دهید. شما می توانید از این کار برای شناسایی مکان های کلیدی بدن، تجزیه و تحلیل وضعیت بدن و دسته بندی حرکات استفاده کنید. این کار از مدلهای یادگیری ماشینی (ML) استفاده میکند که با تصاویر یا ویدیوهای منفرد کار میکنند. وظیفه خروجی نقاط عطف ژست بدن در مختصات تصویر و در مختصات جهان سه بعدی است.
نمونه کد شرح داده شده در این دستورالعمل ها در GitHub موجود است. برای اطلاعات بیشتر در مورد قابلیتها، مدلها و گزینههای پیکربندی این کار، به نمای کلی مراجعه کنید.
نمونه کد
کد مثال برای Pose Landmarker اجرای کامل این کار در پایتون را برای مرجع شما فراهم می کند. این کد به شما کمک می کند این کار را آزمایش کنید و شروع به ساختن نشانگر ژست خود کنید. میتوانید کد نمونه Pose Landmarker را فقط با استفاده از مرورگر وب خود مشاهده، اجرا و ویرایش کنید.
اگر از Pose Landmarker برای Raspberry Pi استفاده می کنید، به برنامه نمونه Raspberry Pi مراجعه کنید.
راه اندازی
این بخش مراحل کلیدی را برای راه اندازی محیط توسعه و پروژه های کد به طور خاص برای استفاده از Pose Landmarker توضیح می دهد. برای اطلاعات کلی در مورد تنظیم محیط توسعه خود برای استفاده از وظایف MediaPipe، از جمله الزامات نسخه پلت فرم، به راهنمای راه اندازی برای Python مراجعه کنید.
بسته ها
وظیفه MediaPipe Pose Landmarker به بسته mediapipe PyPI نیاز دارد. شما می توانید این وابستگی ها را با موارد زیر نصب و وارد کنید:
$ python -m pip install mediapipe
واردات
برای دسترسی به توابع وظیفه Pose Landmarker، کلاسهای زیر را وارد کنید:
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
مدل
وظیفه MediaPipe Pose Landmarker به یک مدل آموزش دیده نیاز دارد که با این کار سازگار باشد. برای اطلاعات بیشتر در مورد مدلهای آموزشدیده موجود برای 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. # ...
برای مثال کامل ایجاد Pose Landmarker برای استفاده با یک تصویر، به مثال کد مراجعه کنید.
گزینه های پیکربندی
این کار دارای گزینه های پیکربندی زیر برای برنامه های پایتون است:
نام گزینه | توضیحات | محدوده ارزش | مقدار پیش فرض |
---|---|---|---|
running_mode | حالت اجرا را برای کار تنظیم می کند. سه حالت وجود دارد: IMAGE: حالت برای ورودی های تک تصویر. VIDEO: حالت برای فریم های رمزگشایی شده یک ویدیو. LIVE_STREAM: حالت پخش زنده داده های ورودی، مانند دوربین. در این حالت، resultListener باید فراخوانی شود تا شنونده ای را برای دریافت نتایج به صورت ناهمزمان تنظیم کند. | { IMAGE, VIDEO, LIVE_STREAM } | IMAGE |
num_poses | حداکثر تعداد پوزی که می تواند توسط Pose Landmarker شناسایی شود. | 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 Landmarker یک ماسک تقسیمبندی را برای ژست شناسایی شده خروجی میدهد یا خیر. | Boolean | False |
result_callback | شنونده نتیجه را طوری تنظیم می کند که وقتی Pose Landmarker در حالت پخش زنده است، نتایج نشانگر را به صورت ناهمزمان دریافت کند. فقط زمانی قابل استفاده است که حالت اجرا روی LIVE_STREAM تنظیم شده باشد | ResultListener | N/A |
داده ها را آماده کنید
ورودی خود را به عنوان یک فایل تصویری یا یک آرایه numpy آماده کنید، سپس آن را به یک شی mediapipe.Image
تبدیل کنید. اگر ورودی شما یک فایل ویدیویی یا پخش زنده از یک وب کم است، می توانید از یک کتابخانه خارجی مانند OpenCV برای بارگیری فریم های ورودی خود به عنوان آرایه های ناتوان استفاده کنید.
تصویر
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 Landmarker از توابع 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 Landmarker مهر زمانی فریم ورودی را نیز ارائه دهید.
- هنگامی که در تصویر یا مدل ویدیو اجرا می شود، وظیفه Pose Landmarker رشته فعلی را مسدود می کند تا زمانی که پردازش تصویر یا فریم ورودی به پایان برسد.
- هنگامی که در حالت پخش زنده اجرا می شود، وظیفه Pose Landmarker بلافاصله برمی گردد و رشته فعلی را مسدود نمی کند. هر بار که پردازش یک فریم ورودی را تمام می کند، شنونده نتیجه را با نتیجه تشخیص فراخوانی می کند. اگر زمانی که وظیفه Pose Landmarker مشغول پردازش فریم دیگری است، تابع تشخیص فراخوانی شود، این کار کادر ورودی جدید را نادیده می گیرد.
برای مثال کامل اجرای Pose Landmarker بر روی یک تصویر، برای جزئیات به مثال کد مراجعه کنید.
کنترل و نمایش نتایج
Pose Landmarker یک شی 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 Landmarker نحوه نمایش نتایج بازگشتی از کار را نشان می دهد، برای جزئیات به مثال کد مراجعه کنید.