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

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

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

कोड का उदाहरण

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

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

सेटअप

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

पैकेज

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

$ python -m pip install mediapipe

आयात

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

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

मॉडल

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

मॉडल को चुनें और डाउनलोड करें, और फिर उसे लोकल डायरेक्ट्री में स्टोर करें:

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

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

base_options = BaseOptions(model_asset_path=model_path)

टास्क बनाएं

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

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

ये सैंपल, इमेज के लिए अलग-अलग तरह के टास्क बनाते हैं, और लाइव वीडियो स्ट्रीम.

इमेज

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: इनपुट की लाइवस्ट्रीम करने का मोड जैसी निजी जानकारी को किसी भी समय रिकॉर्ड कर सकते हैं. इस मोड में, resultListener होना चाहिए नतीजे पाने के लिए, लिसनर सेट अप करने के लिए कॉल किया गया एसिंक्रोनस रूप से.
{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 पर सेट किया जाता है, तो सभी उपलब्ध नतीजे दिखाए जाएंगे.
  • कैटगरी की अनुमति वाली सूची: अनुमति वाली कैटगरी के नामों की अनुमति. खाली न होने पर, क्लासिफ़िकेशन के ऐसे नतीजे जिनकी कैटगरी इस सेट में नहीं है उन्हें फ़िल्टर करके बाहर कर दिया जाएगा. ब्लॉकलिस्ट के साथ म्यूचुअली एक्सक्लूसिव.
  • कैटगरी की ब्लॉकलिस्ट: कैटगरी के नामों की ब्लॉकलिस्ट. खाली न होने पर, क्लासिफ़िकेशन के ऐसे नतीजे जिनकी कैटगरी इस सेट में है उन्हें फ़िल्टर करके बाहर कर दिया जाएगा. जिन लोगों या संगठनों को अनुमति मिली है उनकी सूची में इन्हें एक-दूसरे के लिए ही शामिल किया जा सकता है.
    • डिसप्ले नेम की स्थान-भाषा: any string
    • ज़्यादा से ज़्यादा नतीजे: any integer
    • स्कोर थ्रेशोल्ड: 0.0-1.0
    • अनुमति वाली कैटगरी: vector of strings
    • कैटगरी की ब्लॉकलिस्ट: vector of strings
    • डिसप्ले नेम की स्थान-भाषा: "en"
    • ज़्यादा से ज़्यादा नतीजे: -1
    • स्कोर थ्रेशोल्ड: 0
    • अनुमति वाली कैटगरी: खाली है
    • कैटगरी की ब्लॉकलिस्ट: खाली है
    custom_gestures_classifier_options कस्टम जेस्चर की कैटगरी तय करने वाले व्यवहार को कॉन्फ़िगर करने के विकल्प.
  • डिसप्ले नेम की स्थान-भाषा: अगर कोई स्थान TFLite मॉडल मेटाडेटा के ज़रिए दिया गया है, तो डिसप्ले नेम के लिए इस्तेमाल की जाने वाली स्थान-भाषा.
  • सबसे ज़्यादा नतीजे: दिए जाने वाले, सबसे ज़्यादा स्कोर वाले क्लासिफ़िकेशन नतीजे की ज़्यादा से ज़्यादा संख्या. यदि < कोई समस्या नहीं है, तो सभी उपलब्ध नतीजे दिखाए जाएंगे.
  • स्कोर थ्रेशोल्ड: वह स्कोर जिसके नीचे वाले नतीजे अस्वीकार कर दिए जाते हैं. अगर इस नीति को 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 ऑब्जेक्ट. अगर आपका इनपुट किसी वीडियो फ़ाइल या लाइव स्ट्रीम के लिए है, वेबकैम से, आप एक बाहरी लाइब्रेरी का इस्तेमाल कर सकते हैं, जैसे कि अपने इनपुट फ़्रेम को numpy के तौर पर लोड करने के लिए 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)
        

    टास्क को पूरा करें

    जेस्चर आइडेंटिफ़ायर, पहचानकर्ता, identifier_for_video और समुद्र के किनारे की पहचान [identifier_async] का इस्तेमाल करता है फ़ंक्शन का इस्तेमाल करता है. जेस्चर की पहचान करने के लिए, यह ज़रूरी है प्री-प्रोसेसिंग इनपुट डेटा, इमेज में हाथों की पहचान करना, हाथ की पहचान करना लैंडमार्क को पहचानने और उसके हाथ के जेस्चर की पहचान करने के लिए किया जाता है.

    नीचे दिया गया कोड बताता है कि टास्क मॉडल की मदद से प्रोसेसिंग कैसे लागू की जाती है.

    इमेज

    # 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)
    

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

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