Python के लिए, जेस्चर की पहचान करने वाली गाइड

MediaPipe हाथ के जेस्चर पहचानकर्ता टास्क की मदद से आप रीयल टाइम में हाथ के जेस्चर पहचान सकते हैं. साथ ही, इससे पहचाने गए हाथों के 'हाथ के जेस्चर के' नतीजे और 'हाथ के लैंडमार्क' भी मिलते हैं. ये निर्देश आपको बताते हैं कि Python ऐप्लिकेशन के साथ जेस्चर आइडेंटिफ़ायर का इस्तेमाल कैसे किया जाता है.

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

कोड का उदाहरण

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

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

सेटअप

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

पैकेज

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

$ python -m pip install mediapipe

इंपोर्ट

जेस्चर आइडेंटिफ़ायर टास्क फ़ंक्शन ऐक्सेस करने के लिए, नीचे दी गई क्लास इंपोर्ट करें:

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

मॉडल

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

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

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

मॉडल के नाम वाले पैरामीटर में, मॉडल का पाथ बताएं, जैसा कि यहां दिखाया गया है:

base_options = BaseOptions(model_asset_path=model_path)

टास्क बनाएं

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

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

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

Image

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
GestureRecognizer = mp.tasks.vision.GestureRecognizer
GestureRecognizerOptions = mp.tasks.vision.GestureRecognizerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a gesture recognizer instance with the image mode:
options = GestureRecognizerOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.IMAGE)
with GestureRecognizer.create_from_options(options) as recognizer:
  # The detector is initialized. Use it here.
  # ...
    

वीडियो

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
GestureRecognizer = mp.tasks.vision.GestureRecognizer
GestureRecognizerOptions = mp.tasks.vision.GestureRecognizerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a gesture recognizer instance with the video mode:
options = GestureRecognizerOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO)
with GestureRecognizer.create_from_options(options) as recognizer:
  # The detector is initialized. Use it here.
  # ...
    

लाइव स्ट्रीम

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
GestureRecognizer = mp.tasks.vision.GestureRecognizer
GestureRecognizerOptions = mp.tasks.vision.GestureRecognizerOptions
GestureRecognizerResult = mp.tasks.vision.GestureRecognizerResult
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a gesture recognizer instance with the live stream mode:
def print_result(result: GestureRecognizerResult, output_image: mp.Image, timestamp_ms: int):
    print('gesture recognition result: {}'.format(result))

options = GestureRecognizerOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.LIVE_STREAM,
    result_callback=print_result)
with GestureRecognizer.create_from_options(options) as recognizer:
  # The detector is initialized. Use it here.
  # ...
    

कॉन्फ़िगरेशन विकल्प

इस टास्क में Python ऐप्लिकेशन के लिए कॉन्फ़िगरेशन के ये विकल्प मौजूद हैं:

विकल्प का नाम ब्यौरा वैल्यू रेंज डिफ़ॉल्ट मान
running_mode टास्क के लिए, रनिंग मोड सेट करता है. इसके तीन मोड होते हैं:

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

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

LIVE_STREAM: इनपुट डेटा की लाइव स्ट्रीम का मोड, जैसे कि कैमरे से स्ट्रीम किया जाने वाला मोड. इस मोड में, रिज़ल्ट पहचानकर्ता को लिसनर को सेट अप करने के लिए कॉल किया जाना चाहिए, ताकि वह एसिंक्रोनस तरीके से नतीजे पा सके.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_hands GestureRecognizer, यह पता लगाता है कि आपने ज़्यादा से ज़्यादा कितने हाथ इस्तेमाल किए हैं. Any integer > 0 1
min_hand_detection_confidence हाथ की पहचान करने वाली सुविधा के लिए, पाम डिटेक्शन मॉडल में सबसे कम कॉन्फ़िडेंस स्कोर. 0.0 - 1.0 0.5
min_hand_presence_confidence हैंड लैंडमार्क की पहचान करने वाले मॉडल में, हाथ की मौजूदगी की पहचान के स्कोर का कम से कम कॉन्फ़िडेंस स्कोर. 'जेस्चर आइडेंटिफ़ायर' के वीडियो मोड और लाइव स्ट्रीम मोड में, अगर हैंड लैंडमार्क मॉडल के हाथ की मौजूदगी का स्कोर इस थ्रेशोल्ड से कम है, तो यह हथेली की पहचान करने वाले मॉडल को ट्रिगर करता है. इसके अलावा, लाइटवेट हैंड ट्रैकिंग एल्गोरिदम का इस्तेमाल करके, हाथों की जगह का पता लगाया जाता है, ताकि लैंडमार्क का पता लगाया जा सके. 0.0 - 1.0 0.5
min_tracking_confidence हैंड ट्रैकिंग के लिए सबसे कम कॉन्फ़िडेंस स्कोर, जिसे कामयाब माना जाएगा. यह मौजूदा फ़्रेम और आखिरी फ़्रेम में मौजूद हाथों के बीच का बाउंडिंग बॉक्स IoU थ्रेशोल्ड है. जेस्चर आइडेंटिफ़ायर के वीडियो मोड और स्ट्रीम मोड में, अगर ट्रैकिंग काम नहीं करती है, तो जेस्चर आइडेंटिफ़ायर हैंड डिटेक्शन ट्रिगर करता है. ऐसा न होने पर, हाथ की पहचान करने वाली सुविधा को छोड़ दिया जाएगा. 0.0 - 1.0 0.5
canned_gestures_classifier_options पहले से तैयार जेस्चर क्लासिफ़ायर व्यवहार को कॉन्फ़िगर करने के विकल्प. पहले से तैयार किए गए जेस्चर ["None", "Closed_Fist", "Open_Palm", "Pointing_Up", "Thumb_Down", "Thumb_Up", "Victory", "ILoveYou"]
हैं
  • डिसप्ले नेम की स्थान-भाषा: TFLite मॉडल के मेटाडेटा में बताए गए डिसप्ले नेम के लिए इस्तेमाल की जाने वाली स्थान-भाषा, अगर कोई है, तो उसे चुनें.
  • ज़्यादा से ज़्यादा नतीजे: लौटाए जाने वाले, सबसे ज़्यादा स्कोर किए गए वर्गीकरण के नतीजों की ज़्यादा से ज़्यादा संख्या. अगर < 0 है, तो सभी उपलब्ध नतीजे दिखाए जाएंगे.
  • स्कोर थ्रेशोल्ड: वह स्कोर जिसके नीचे नतीजे अस्वीकार किए जाते हैं. अगर नीति को 0 पर सेट किया जाता है, तो सभी उपलब्ध नतीजे दिखाए जाएंगे.
  • कैटगरी की अनुमति: कैटगरी के नामों की अनुमति वाली सूची. अगर यह खाली नहीं है, तो कैटगरी के जिन नतीजों की कैटगरी इस सेट में नहीं होगी उन्हें फ़िल्टर करके बाहर कर दिया जाएगा. ब्लॉकलिस्ट के साथ म्यूचुअली एक्सक्लूसिव.
  • कैटगरी की ब्लॉकलिस्ट: कैटगरी के नामों की ब्लॉकलिस्ट. अगर यह खाली नहीं है, तो कैटगरी के जिन नतीजों की कैटगरी इस सेट में होगी उन्हें फ़िल्टर करके बाहर कर दिया जाएगा. अनुमति वाली सूची के साथ म्यूचुअली एक्सक्लूसिव.
    • डिसप्ले नेम की स्थान-भाषा: any string
    • अधिकतम परिणाम: any integer
    • स्कोर थ्रेशोल्ड: 0.0-1.0
    • अनुमति वाली कैटगरी: vector of strings
    • कैटगरी की ब्लॉकलिस्ट: vector of strings
    • डिसप्ले नेम की स्थान-भाषा: "en"
    • अधिकतम परिणाम: -1
    • स्कोर थ्रेशोल्ड: 0
    • अनुमति वाली कैटगरी: खाली
    • कैटगरी की ब्लॉकलिस्ट: खाली
    custom_gestures_classifier_options हाथ के जेस्चर की कैटगरी तय करने वाले कस्टम तरीके को कॉन्फ़िगर करने के विकल्प.
  • डिसप्ले नेम की स्थान-भाषा: TFLite मॉडल के मेटाडेटा में बताए गए डिसप्ले नेम के लिए इस्तेमाल की जाने वाली स्थान-भाषा, अगर कोई है, तो उसे चुनें.
  • ज़्यादा से ज़्यादा नतीजे: लौटाए जाने वाले, सबसे ज़्यादा स्कोर किए गए वर्गीकरण के नतीजों की ज़्यादा से ज़्यादा संख्या. अगर < 0 है, तो सभी उपलब्ध नतीजे दिखाए जाएंगे.
  • स्कोर थ्रेशोल्ड: वह स्कोर जिसके नीचे नतीजे अस्वीकार किए जाते हैं. अगर नीति को 0 पर सेट किया जाता है, तो सभी उपलब्ध नतीजे दिखाए जाएंगे.
  • कैटगरी की अनुमति: कैटगरी के नामों की अनुमति वाली सूची. अगर यह खाली नहीं है, तो कैटगरी के जिन नतीजों की कैटगरी इस सेट में नहीं होगी उन्हें फ़िल्टर करके बाहर कर दिया जाएगा. ब्लॉकलिस्ट के साथ म्यूचुअली एक्सक्लूसिव.
  • कैटगरी की ब्लॉकलिस्ट: कैटगरी के नामों की ब्लॉकलिस्ट. अगर यह खाली नहीं है, तो कैटगरी के जिन नतीजों की कैटगरी इस सेट में होगी उन्हें फ़िल्टर करके बाहर कर दिया जाएगा. अनुमति वाली सूची के साथ म्यूचुअली एक्सक्लूसिव.
    • डिसप्ले नेम की स्थान-भाषा: any string
    • अधिकतम परिणाम: any integer
    • स्कोर थ्रेशोल्ड: 0.0-1.0
    • अनुमति वाली कैटगरी: vector of strings
    • कैटगरी की ब्लॉकलिस्ट: vector of strings
    • डिसप्ले नेम की स्थान-भाषा: "en"
    • अधिकतम परिणाम: -1
    • स्कोर थ्रेशोल्ड: 0
    • अनुमति वाली कैटगरी: खाली
    • कैटगरी की ब्लॉकलिस्ट: खाली
    result_callback जब जेस्चर आइडेंटिफ़ायर लाइव स्ट्रीम मोड में होता है, तब नतीजे लिसनर को क्लासिफ़िकेशन के नतीजों को एसिंक्रोनस तरीके से पाने के लिए सेट करता है. सिर्फ़ तब इस्तेमाल किया जा सकता है, जब रनिंग मोड LIVE_STREAM पर सेट हो ResultListener लागू नहीं लागू नहीं

    डेटा तैयार करना

    अपने इनपुट को इमेज फ़ाइल या संख्यात्मक कलेक्शन के तौर पर तैयार करें. इसके बाद, उसे 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)
        

    टास्क चलाएं

    'जेस्चर पहचानकर्ता' अनुमान ट्रिगर करने के लिए, Identity, Identity_for_video, और identifier_async फ़ंक्शन का इस्तेमाल करता है. हाथ के जेस्चर (हाव-भाव) की पहचान करने के लिए, इसमें इनपुट डेटा को पहले से प्रोसेस करना, इमेज में हाथों का पता लगाना, हाथ के लैंडमार्क का पता लगाना, और लैंडमार्क से हाथ के जेस्चर की पहचान करना शामिल है.

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

    Image

    # Perform gesture recognition on the provided single image.
    # The gesture recognizer must be created with the image mode.
    gesture_recognition_result = recognizer.recognize(mp_image)
        

    वीडियो

    # Perform gesture recognition on the provided single image.
    # The gesture recognizer must be created with the video mode.
    gesture_recognition_result = recognizer.recognize_for_video(mp_image, frame_timestamp_ms)
        

    लाइव स्ट्रीम

    # Send live image data to perform gesture recognition.
    # The results are accessible via the `result_callback` provided in
    # the `GestureRecognizerOptions` object.
    # The gesture recognizer must be created with the live stream mode.
    recognizer.recognize_async(mp_image, frame_timestamp_ms)
        

    निम्न पर ध्यान दें:

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

    किसी इमेज पर 'जेस्चर आइडेंटिफ़ायर' चलाने का पूरा उदाहरण देखने के लिए, ज़्यादा जानकारी के लिए कोड का उदाहरण देखें.

    नतीजे मैनेज करें और दिखाएं

    जेस्चर आइडेंटिफ़ायर हर एक रन के लिए, जेस्चर की पहचान करने वाला नतीजा ऑब्जेक्ट जनरेट करता है. नतीजे के ऑब्जेक्ट में, इमेज के निर्देशांकों में हैंड लैंडमार्क, दुनिया के निर्देशांकों में हाथ के लैंडमार्क, किसी एक हाथ का इस्तेमाल(बायां/दायां हाथ), और हाथों के जेस्चर की कैटगरी के बारे में पता चलता है.

    इस टास्क के आउटपुट डेटा का एक उदाहरण यहां दिया गया है:

    नतीजे के तौर पर मिले GestureRecognizerResult में चार कॉम्पोनेंट होते हैं और हर कॉम्पोनेंट एक कलेक्शन होता है. इसमें हर एलिमेंट में, पहचाने गए एक हाथ से मिला नतीजा शामिल होता है.

    • हाथ का इस्तेमाल

      हाथ का इस्तेमाल यह बताता है कि पहचाने गए हाथ बाएं हाथ हैं या दाएं.

    • हाथ के जेस्चर

      पहचाने गए हाथों की पहचान किए गए हाथ के जेस्चर की कैटगरी.

    • लैंडमार्क

      यहां 21 हैंड लैंडमार्क हैं, जिनमें से हर एक में x, y, और z निर्देशांक हैं. x और y कोऑर्डिनेट को इमेज की चौड़ाई और ऊंचाई के हिसाब से [0.0, 1.0] नॉर्मलाइज़ किया जाता है. z निर्देशांक, लैंडमार्क की गहराई दिखाता है. इसमें, कलाई पर मौजूद गहराई का मतलब, शुरुआत की जगह होता है. वैल्यू जितनी छोटी होगी, लैंडमार्क कैमरे के उतना ही करीब होगा. z की तीव्रता x के बराबर तीव्रता का इस्तेमाल करती है.

    • विश्व भू-स्थल

      दुनिया के निर्देशांकों में भी इन 21 हाथ की मशहूर जगहों को दिखाया गया है. हर लैंडमार्क x, y, और z से मिलकर बना है. यह असल दुनिया के 3D निर्देशांक को मीटर में दिखाता है और इन निर्देशांकों को हाथ के ज्यामितीय केंद्र में रखा गया है.

    GestureRecognizerResult:
      Handedness:
        Categories #0:
          index        : 0
          score        : 0.98396
          categoryName : Left
      Gestures:
        Categories #0:
          score        : 0.76893
          categoryName : Thumb_Up
      Landmarks:
        Landmark #0:
          x            : 0.638852
          y            : 0.671197
          z            : -3.41E-7
        Landmark #1:
          x            : 0.634599
          y            : 0.536441
          z            : -0.06984
        ... (21 landmarks for a hand)
      WorldLandmarks:
        Landmark #0:
          x            : 0.067485
          y            : 0.031084
          z            : 0.055223
        Landmark #1:
          x            : 0.063209
          y            : -0.00382
          z            : 0.020920
        ... (21 world landmarks for a hand)
    

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

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