Python के लिए लैंडमार्क का पता लगाने वाली गाइड

MediaPipe Pose लैंडमार्क टास्क की मदद से, किसी इमेज या वीडियो में मानव शरीर की लैंडमार्क का पता लगाया जा सकता है. इस टास्क का इस्तेमाल, शरीर के मुख्य जगहों की पहचान करने, पॉस्चर का विश्लेषण करने, और शरीर की गतिविधियों को कैटगरी में बांटने के लिए किया जा सकता है. यह टास्क मशीन लर्निंग (एमएल) मॉडल का इस्तेमाल करता है, जो एक इमेज या वीडियो के साथ काम करता है. इस टास्क में, इमेज को निर्देशांकों और 3-डाइमेंशन वाले दुनिया के निर्देशांकों में शरीर की जगहों को दिखाने की सुविधा मिलती है.

इन निर्देशों में दिया गया कोड सैंपल, GitHub पर उपलब्ध है. इस टास्क की क्षमताओं, मॉडल, और कॉन्फ़िगरेशन विकल्पों के बारे में ज़्यादा जानकारी के लिए, खास जानकारी देखें.

कोड का उदाहरण

पोज़ लैंडमार्कर के लिए उदाहरण कोड में आपके रेफ़रंस के लिए, Python में इस टास्क को पूरी तरह से लागू किया जा सकता है. इस कोड से आपको इस टास्क को टेस्ट करने और अपना पोज़ लैंडमार्क बनाने में मदद मिलेगी. वेब ब्राउज़र का इस्तेमाल करके, पोज़ लैंडमार्कर के उदाहरण कोड को देखा जा सकता है, चलाया जा सकता है, और उसमें बदलाव किया जा सकता है.

अगर रैज़बेरी पाई के लिए पोज़ लैंडमार्क का इस्तेमाल किया जा रहा है, तो Raspबेरी Pi के उदाहरण वाला ऐप्लिकेशन देखें.

सेटअप

इस सेक्शन में, डेवलपमेंट एनवायरमेंट को सेट अप करने और खास तौर पर पोज़ लैंडमार्क का इस्तेमाल करने के लिए कोड प्रोजेक्ट सेट अप करने के मुख्य चरणों के बारे में बताया गया है. MediaPipe टास्क का इस्तेमाल करने के लिए अपने डेवलपमेंट एनवायरमेंट को सेट अप करने से जुड़ी सामान्य जानकारी के लिए, Python के लिए सेटअप गाइड देखें. इसमें प्लैटफ़ॉर्म के वर्शन की ज़रूरी शर्तों के साथ-साथ काम करने के तरीके भी शामिल हैं.

पैकेज

MediaPipe Pose लैंडमार्क टास्क के लिए, MediaPipe PyPI पैकेज की ज़रूरत होती है. इन डिपेंडेंसी को इंस्टॉल और इंपोर्ट करने के लिए, इनका इस्तेमाल करें:

$ python -m pip install mediapipe

इंपोर्ट

'पोज़ लैंडमार्क' टास्क फ़ंक्शन को ऐक्सेस करने के लिए, इन क्लास को इंपोर्ट करें:

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

मॉडल

MediaPipe Pose लैंडमार्कर टास्क के लिए, एक प्रशिक्षित मॉडल की ज़रूरत होती है, जो इस टास्क के साथ काम कर सके. पोज़ लैंडमार्कर के लिए उपलब्ध ट्रेनिंग मॉडल के बारे में ज़्यादा जानने के लिए, टास्क की खास जानकारी मॉडल सेक्शन देखें.

मॉडल चुनें और उसे डाउनलोड करें. इसके बाद, उसे किसी लोकल डायरेक्ट्री में सेव करें:

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

इस्तेमाल किए जाने वाले मॉडल का पाथ तय करने के लिए, BaseOptions ऑब्जेक्ट model_asset_path पैरामीटर का इस्तेमाल करें. कोड के उदाहरण के लिए, अगला सेक्शन देखें.

टास्क बनाएं

MediaPipe Pose लैंडमार्क टास्क, टास्क सेट अप करने के लिए create_from_options फ़ंक्शन का इस्तेमाल करता है. create_from_options फ़ंक्शन, कॉन्फ़िगरेशन के विकल्पों को हैंडल करने के लिए, वैल्यू स्वीकार करता है. ज़्यादा जानकारी के लिए, कॉन्फ़िगरेशन के विकल्प देखें.

नीचे दिया गया कोड इस टास्क को बनाने और कॉन्फ़िगर करने का तरीका बताता है.

ये सैंपल, इमेज, वीडियो फ़ाइलों, और लाइव स्ट्रीम के लिए, टास्क बनाने के तरीके को भी दिखाते हैं.

Image

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 टास्क के लिए, रनिंग मोड सेट करता है. इसके तीन मोड होते हैं:

इमेज: सिंगल इमेज इनपुट के लिए मोड.

वीडियो: वीडियो के डिकोड किए गए फ़्रेम का मोड.

LIVE_STREAM: इनपुट डेटा की लाइव स्ट्रीम का मोड, जैसे कि कैमरे से स्ट्रीम किया जाने वाला मोड. इस मोड में, रिज़ल्ट पहचानकर्ता को लिसनर को सेट अप करने के लिए कॉल किया जाना चाहिए, ताकि वह एसिंक्रोनस तरीके से नतीजे पा सके.
{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 जैसी बाहरी लाइब्रेरी का इस्तेमाल करके, अपने इनपुट फ़्रेम को सुन्न कलेक्शन के तौर पर लोड किया जा सकता है.

Image

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 फ़ंक्शन का इस्तेमाल करता है. पोज़ लैंडमार्क के लिए, इसमें इनपुट डेटा को पहले से प्रोसेस करना और इमेज में पोज़ का पता लगाना शामिल होता है.

इस कोड में बताया गया है कि टास्क मॉडल के साथ प्रोसेसिंग को कैसे एक्ज़ीक्यूट करें.

Image

# 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: मशहूर निर्देशांक, इमेज की चौड़ाई (x) और ऊंचाई (y) के हिसाब से 0.0 से 1.0 के बीच सामान्य किए जाते हैं.

  • z: लैंडमार्क की गहराई, जहां मूल रूप से कूल्हे के बीच में गहराई होती है. इसकी वैल्यू जितनी छोटी होगी, लैंडमार्क कैमरे के उतना ही करीब होगा. z की तीव्रता करीब x के बराबर स्केल का इस्तेमाल करती है.

  • visibility: इमेज में लैंडमार्क के दिखने की संभावना कितनी होती है.

आउटपुट में नीचे दिए गए दुनिया के निर्देशांक शामिल हैं (WorldLandmarks):

  • x, y, और z: असल दुनिया में 3-डाइमेंशन वाले निर्देशांक, मीटर में. इस तरह के निर्देशांक, कूल्हे की शुरुआत की जगह होते हैं.

  • visibility: इमेज में लैंडमार्क के दिखने की संभावना कितनी होती है.

इस इमेज में, टास्क के आउटपुट का विज़ुअलाइज़ेशन दिखाया गया है:

वैकल्पिक सेगमेंटेशन मास्क, इस बात की संभावना बताता है कि हर पिक्सल किसी व्यक्ति से जुड़ा है या नहीं. यह इमेज, टास्क के आउटपुट का सेगमेंटेशन मास्क है:

'पोज़ लैंडमार्कर का उदाहरण कोड' दिखाता है कि टास्क से दिखाए गए नतीजे कैसे दिखाए जाते हैं. ज़्यादा जानकारी के लिए कोड का उदाहरण देखें.