راهنمای تشخیص نقطه عطف برای پایتون

وظیفه 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 نحوه نمایش نتایج بازگشتی از کار را نشان می دهد، برای جزئیات به مثال کد مراجعه کنید.