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

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

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

कोड का उदाहरण

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

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

कोड डाउनलोड करें

नीचे दिए गए निर्देशों में git कमांड लाइन टूल का इस्तेमाल करके, उदाहरण कोड की लोकल कॉपी बनाने का तरीका बताया गया है.

उदाहरण कोड डाउनलोड करने के लिए:

  1. नीचे दिए गए कमांड का इस्तेमाल करके, गिट रिपॉज़िटरी का क्लोन बनाएं:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. इसके अलावा, स्पार्स चेकआउट का इस्तेमाल करने के लिए अपना git इंस्टेंस कॉन्फ़िगर करें. ऐसा करने से आपके पास सिर्फ़ हाथ के जेस्चर पहचानने वाले टूल के उदाहरण वाले ऐप्लिकेशन की फ़ाइलें होंगी:

    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/gesture_recognizer/ios/
    

उदाहरण कोड का स्थानीय वर्शन बनाने के बाद, आप MediaPipe टास्क लाइब्रेरी इंस्टॉल कर सकते हैं, Xcode का इस्तेमाल करके प्रोजेक्ट खोलें और ऐप्लिकेशन चलाएं. निर्देशों के लिए, iOS के लिए सेटअप गाइड देखें.

मुख्य कॉम्पोनेंट

इन फ़ाइलों में 'जेस्चर आइडेंटिफ़ायर' के उदाहरण वाले ऐप्लिकेशन का ज़रूरी कोड मौजूद है:

  • GestureRecognizerService.swift: जेस्चर आइडेंटिफ़ायर शुरू करता है, चुने गए मॉडल को हैंडल करता है, और इनपुट डेटा पर अनुमान चलाता है.
  • CameraViewController.swift: लाइव कैमरा फ़ीड इनपुट मोड के लिए यूज़र इंटरफ़ेस (यूआई) लागू करता है और नतीजों को विज़ुअलाइज़ करता है.
  • MediaLibraryViewController.swift: स्टिल इमेज और वीडियो फ़ाइल के इनपुट मोड के लिए यूज़र इंटरफ़ेस (यूआई) लागू करता है और नतीजों को विज़ुअलाइज़ करता है.

सेटअप

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

डिपेंडेंसी

जेस्चर आइडेंटिफ़ायर MediaPipeTasksVision लाइब्रेरी का इस्तेमाल करता है, जिसे CocoaPods का इस्तेमाल करके इंस्टॉल किया जाना चाहिए. यह लाइब्रेरी, Swift और Objective-C ऐप्लिकेशन, दोनों के साथ काम करती है और इसके लिए अलग से किसी भाषा के सेटअप की ज़रूरत नहीं होती.

macOS पर CocoaPods इंस्टॉल करने के निर्देशों के लिए, CocoaPods को इंस्टॉल करने से जुड़ी गाइड देखें. अपने ऐप्लिकेशन के लिए ज़रूरी पॉड के साथ Podfile बनाने का तरीका जानने के लिए, CocoaPods का इस्तेमाल करना देखें.

नीचे दिए गए कोड का इस्तेमाल करके, Podfile में MediaPipeTasksVision पॉड जोड़ें:

target 'MyGestureRecognizerApp' do
  use_frameworks!
  pod 'MediaPipeTasksVision'
end

अगर आपके ऐप्लिकेशन में यूनिट टेस्ट टारगेट शामिल हैं, तो अपने Podfile को सेट अप करने के बारे में ज़्यादा जानकारी के लिए iOS के लिए सेट अप करने से जुड़ी गाइड देखें.

मॉडल

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

कोई मॉडल चुनें और डाउनलोड करें और Xcode का इस्तेमाल करके उसे अपनी प्रोजेक्ट डायरेक्ट्री में जोड़ें. अपने Xcode प्रोजेक्ट में फ़ाइलें जोड़ने के तरीके से जुड़े निर्देशों के लिए, अपने Xcode प्रोजेक्ट में फ़ाइलें और फ़ोल्डर मैनेज करना देखें.

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

टास्क बनाएं

जेस्चर आइडेंटिफ़ायर टास्क बनाने के लिए, इसके किसी शुरू करने वाले टूल को कॉल किया जा सकता है. GestureRecognizer(options:) शुरू करने वाला टूल, कॉन्फ़िगरेशन के विकल्पों के लिए वैल्यू स्वीकार करता है.

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

जेस्चर आइडेंटिफ़ायर टास्क में तीन तरह के इनपुट डेटा काम करते हैं: स्टिल इमेज, वीडियो फ़ाइलें, और लाइव वीडियो स्ट्रीम. डिफ़ॉल्ट रूप से, GestureRecognizer(modelPath:) स्टिल इमेज के लिए टास्क शुरू करता है. अगर आपको वीडियो फ़ाइलों या लाइव वीडियो स्ट्रीम को प्रोसेस करने के लिए, टास्क शुरू करना है, तो वीडियो या लाइव स्ट्रीम के रनिंग मोड के बारे में बताने के लिए GestureRecognizer(options:) का इस्तेमाल करें. लाइव स्ट्रीम मोड के लिए, gestureRecognizerLiveStreamDelegate को कॉन्फ़िगर करने के एक और विकल्प की भी ज़रूरत होती है. इससे जेस्चर की पहचान करने वाला टूल, जेस्चर की पहचान करने वाले टूल को प्रतिनिधि को एसिंक्रोनस तरीके से जेस्चर की पहचान करने के नतीजे दे पाता है.

टास्क बनाने और अनुमान लगाने का तरीक़ा जानने के लिए, अपने रनिंग मोड से जुड़ा टैब चुनें.

Swift

Image

import MediaPipeTasksVision

let modelPath = Bundle.main.path(forResource: "gesture_recognizer",
                                      ofType: "task")

let options = GestureRecognizerOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .image
options.minHandDetectionConfidence = minHandDetectionConfidence
options.minHandPresenceConfidence = minHandPresenceConfidence
options.minTrackingConfidence = minHandTrackingConfidence
options.numHands = numHands

let gestureRecognizer = try GestureRecognizer(options: options)
    

वीडियो

import MediaPipeTasksVision

let modelPath = Bundle.main.path(forResource: "gesture_recognizer",
                                      ofType: "task")

let options = GestureRecognizerOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .video
options.minHandDetectionConfidence = minHandDetectionConfidence
options.minHandPresenceConfidence = minHandPresenceConfidence
options.minTrackingConfidence = minHandTrackingConfidence
options.numHands = numHands

let gestureRecognizer = try GestureRecognizer(options: options)
    

लाइव स्ट्रीम

import MediaPipeTasksVision

// Class that conforms to the `GestureRecognizerLiveStreamDelegate` protocol and
// implements the method that the gesture recognizer calls once it finishes
// performing recognizing hand gestures in each input frame.
class GestureRecognizerResultProcessor: NSObject, GestureRecognizerLiveStreamDelegate {

  func gestureRecognizer(
    _ gestureRecognizer: GestureRecognizer,
    didFinishRecognition result: GestureRecognizerResult?,
    timestampInMilliseconds: Int,
    error: Error?) {

    // Process the gesture recognizer result or errors here.

  }
}

let modelPath = Bundle.main.path(
  forResource: "gesture_recognizer",
  ofType: "task")

let options = GestureRecognizerOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .liveStream
options.minHandDetectionConfidence = minHandDetectionConfidence
options.minHandPresenceConfidence = minHandPresenceConfidence
options.minTrackingConfidence = minHandTrackingConfidence
options.numHands = numHands

// Assign an object of the class to the `gestureRecognizerLiveStreamDelegate`
// property.
let processor = GestureRecognizerResultProcessor()
options.gestureRecognizerLiveStreamDelegate = processor

let gestureRecognizer = try GestureRecognizer(options: options)
    

Objective-C

Image

@import MediaPipeTasksVision;

NSString *modelPath =
  [[NSBundle mainBundle] pathForResource:@"gesture_recognizer"
                                  ofType:@"task"];

MPPGestureRecognizerOptions *options =
  [[MPPGestureRecognizerOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeImage;
options.minHandDetectionConfidence = minHandDetectionConfidence
options.minHandPresenceConfidence = minHandPresenceConfidence
options.minTrackingConfidence = minHandTrackingConfidence
options.numHands = numHands

MPPGestureRecognizer *gestureRecognizer =
      [[MPPGestureRecognizer alloc] initWithOptions:options error:nil];
    

वीडियो

@import MediaPipeTasksVision;

NSString *modelPath =
  [[NSBundle mainBundle] pathForResource:@"gesture_recognizer"
                                  ofType:@"task"];

MPPGestureRecognizerOptions *options =
  [[MPPGestureRecognizerOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeVideo;
options.minHandDetectionConfidence = minHandDetectionConfidence
options.minHandPresenceConfidence = minHandPresenceConfidence
options.minTrackingConfidence = minHandTrackingConfidence
options.numHands = numHands

MPPGestureRecognizer *gestureRecognizer =
      [[MPPGestureRecognizer alloc] initWithOptions:options error:nil];
    

लाइव स्ट्रीम

@import MediaPipeTasksVision;

// Class that conforms to the `MPPGestureRecognizerLiveStreamDelegate` protocol
// and implements the method that the gesture recognizer calls once it finishes
// performing gesture recognition on each input frame.

@interface APPGestureRecognizerResultProcessor : NSObject 

@end

@implementation APPGestureRecognizerResultProcessor

-   (void)gestureRecognizer:(MPPGestureRecognizer *)gestureRecognizer
    didFinishRecognitionWithResult:(MPPGestureRecognizerResult *)gestureRecognizerResult
           timestampInMilliseconds:(NSInteger)timestampInMilliseconds
                             error:(NSError *)error {

    // Process the gesture recognizer result or errors here.

}

@end

NSString *modelPath =
  [[NSBundle mainBundle] pathForResource:@"gesture_recognizer"
                                  ofType:@"task"];

MPPGestureRecognizerOptions *options =
  [[MPPGestureRecognizerOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeLiveStream;
options.minHandDetectionConfidence = minHandDetectionConfidence
options.minHandPresenceConfidence = minHandPresenceConfidence
options.minTrackingConfidence = minHandTrackingConfidence
options.numHands = numHands

// Assign an object of the class to the `gestureRecognizerLiveStreamDelegate`
// property.
APPGestureRecognizerResultProcessor *processor =
  [APPGestureRecognizerResultProcessor new];
options.gestureRecognizerLiveStreamDelegate = processor;

MPPGestureRecognizer *gestureRecognizer =
      [[MPPGestureRecognizer alloc] initWithOptions:options error:nil];
    

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

इस टास्क में, iOS ऐप्लिकेशन के लिए कॉन्फ़िगरेशन के ये विकल्प शामिल हैं:

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

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

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

LIVE_STREAM: इनपुट डेटा की लाइव स्ट्रीम का मोड, जैसे कि कैमरे से स्ट्रीम किया जाने वाला मोड. इस मोड में, रिज़ल्ट पहचानकर्ता को लिसनर को सेट अप करने के लिए कॉल किया जाना चाहिए, ताकि वह एसिंक्रोनस तरीके से नतीजे पा सके. इस मोड में, gestureRecognizerLiveStreamDelegate को ऐसे क्लास के इंस्टेंस पर सेट किया जाना चाहिए जो एसिंक्रोनस तरीके से जेस्चर की पहचान करने के नतीजे पाने के लिए, GestureRecognizerLiveStreamDelegate को लागू करता है.
{RunningMode.image, RunningMode.video, RunningMode.liveStream} RunningMode.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_listener जब जेस्चर आइडेंटिफ़ायर लाइव स्ट्रीम मोड में होता है, तब नतीजे लिसनर को क्लासिफ़िकेशन के नतीजों को एसिंक्रोनस तरीके से पाने के लिए सेट करता है. सिर्फ़ तब इस्तेमाल किया जा सकता है, जब रनिंग मोड LIVE_STREAM पर सेट हो ResultListener लागू नहीं लागू नहीं

    जब रनिंग मोड को लाइव स्ट्रीम पर सेट किया जाता है, तब जेस्चर आइडेंटिफ़ायर को अतिरिक्त gestureRecognizerLiveStreamDelegate कॉन्फ़िगरेशन की ज़रूरत होती है. इससे जेस्चर आइडेंटिफ़ायर, जेस्चर की पहचान करने वाले टूल को एसिंक्रोनस तरीके से, जेस्चर की पहचान करने वाले नतीजे दे पाता है. डेलिगेट को वह gestureRecognizer(_:didFinishRecognition:timestampInMilliseconds:error:) तरीका लागू करना होगा जिसे 'जेस्चर आइडेंटिफ़ायर'र, हर फ़्रेम पर जेस्चर की पहचान करने के नतीजों को प्रोसेस करने के बाद कॉल करता है.

    विकल्प का नाम ब्यौरा वैल्यू रेंज डिफ़ॉल्ट मान
    gestureRecognizerLiveStreamDelegate इससे लाइव स्ट्रीम मोड में, एसिंक्रोनस तरीके से जेस्चर की पहचान करने वाले नतीजे पाने की सुविधा मिलती है. जिस क्लास का इंस्टेंस इस प्रॉपर्टी पर सेट किया गया है उसे gestureRecognizer(_:didFinishRecognition:timestampInMilliseconds:error:) तरीका लागू करना होगा. लागू नहीं सेट नहीं किया गया है

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

    जेस्चर आइडेंटिफ़ायर में पास करने से पहले आपको इनपुट इमेज या फ़्रेम को किसी MPImage ऑब्जेक्ट में बदलना होगा. MPImage अलग-अलग तरह के iOS इमेज फ़ॉर्मैट का इस्तेमाल करता है. साथ ही, अनुमान के लिए इन्हें किसी भी रनिंग मोड में इस्तेमाल किया जा सकता है. MPImage के बारे में ज़्यादा जानकारी के लिए, MPImage API देखें

    अपने इस्तेमाल के उदाहरण और ऐप्लिकेशन के रनिंग मोड के हिसाब से iOS इमेज फ़ॉर्मैट चुनें.MPImage UIImage, CVPixelBuffer, और CMSampleBuffer iOS इमेज फ़ॉर्मैट स्वीकार करता है.

    UIImage

    UIImage फ़ॉर्मैट इन रनिंग मोड के लिए बहुत काम का है:

    • इमेज: किसी ऐप्लिकेशन बंडल, उपयोगकर्ता गैलरी या फ़ाइल सिस्टम में मौजूद इमेज को UIImage इमेज के तौर पर फ़ॉर्मैट करके, MPImage ऑब्जेक्ट में बदला जा सकता है.

    • वीडियो: AVAssetImageGenerator का इस्तेमाल करके वीडियो फ़्रेम को CGImage फ़ॉर्मैट में एक्सट्रैक्ट करें. इसके बाद, उन्हें UIImage इमेज में बदलें.

    Swift

    // Load an image on the user's device as an iOS `UIImage` object.
    
    // Convert the `UIImage` object to a MediaPipe's Image object having the default
    // orientation `UIImage.Orientation.up`.
    let image = try MPImage(uiImage: image)
        

    Objective-C

    // Load an image on the user's device as an iOS `UIImage` object.
    
    // Convert the `UIImage` object to a MediaPipe's Image object having the default
    // orientation `UIImageOrientationUp`.
    MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
        

    इस उदाहरण में, MPImage को डिफ़ॉल्ट UIImage.Orientation.Up ओरिएंटेशन के साथ शुरू किया जाता है. MPImage को इस्तेमाल की जा सकने वाली किसी भी UIImage.Orientation वैल्यू के साथ शुरू किया जा सकता है. जेस्चर आइडेंटिफ़ायर, .upMirrored, .downMirrored, .leftMirrored, .rightMirrored जैसे मिरर किए गए ओरिएंटेशन पर काम नहीं करता.

    UIImage के बारे में ज़्यादा जानकारी के लिए, UIImage Apple डेवलपर दस्तावेज़ देखें.

    CVPixelBuffer

    CVPixelBuffer फ़ॉर्मैट, उन ऐप्लिकेशन के लिए बेहद कारगर है जो फ़्रेम जनरेट करते हैं. साथ ही, प्रोसेस करने के लिए iOS CoreImage फ़्रेमवर्क का इस्तेमाल करते हैं.

    CVPixelBuffer फ़ॉर्मैट इन रनिंग मोड के लिए बहुत काम का है:

    • इमेज: iOS के CoreImage फ़्रेमवर्क का इस्तेमाल करके कुछ प्रोसेसिंग के बाद CVPixelBuffer इमेज जनरेट करने वाले ऐप्लिकेशन, इमेज रनिंग मोड में जेस्चर आइडेंटिफ़ायर को भेजे जा सकते हैं.

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

    • लाइव स्ट्रीम: फ़्रेम जनरेट करने के लिए iOS कैमरे का इस्तेमाल करने वाले ऐप्लिकेशन को लाइव स्ट्रीम मोड में जेस्चर आइडेंटिफ़ायर को भेजे जाने से पहले, प्रोसेस होने के लिए CVPixelBuffer फ़ॉर्मैट में बदला जा सकता है.

    Swift

    // Obtain a CVPixelBuffer.
    
    // Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the default
    // orientation `UIImage.Orientation.up`.
    let image = try MPImage(pixelBuffer: pixelBuffer)
        

    Objective-C

    // Obtain a CVPixelBuffer.
    
    // Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the
    // default orientation `UIImageOrientationUp`.
    MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
        

    CVPixelBuffer के बारे में ज़्यादा जानकारी के लिए, CVPixelBuffer Apple डेवलपर दस्तावेज़ देखें.

    CMSampleBuffer

    CMSampleBuffer फ़ॉर्मैट, एक ही तरह के मीडिया के सैंपल स्टोर करता है. इसका इस्तेमाल लाइव स्ट्रीम के रनिंग मोड में किया जा सकता है. iOS कैमरों के लाइव फ़्रेम, iOS AVCaptureVideoDataOutput पर, CMSampleBuffer फ़ॉर्मैट में एसिंक्रोनस तरीके से डिलीवर किए जाते हैं.

    Swift

    // Obtain a CMSampleBuffer.
    
    // Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the default
    // orientation `UIImage.Orientation.up`.
    let image = try MPImage(sampleBuffer: sampleBuffer)
        

    Objective-C

    // Obtain a `CMSampleBuffer`.
    
    // Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the
    // default orientation `UIImageOrientationUp`.
    MPImage *image = [[MPPImage alloc] initWithSampleBuffer:sampleBuffer error:nil];
        

    CMSampleBuffer के बारे में ज़्यादा जानकारी के लिए, CMSampleBuffer Apple डेवलपर दस्तावेज़ देखें.

    टास्क चलाएं

    जेस्चर आइडेंटिफ़ायर को चलाने के लिए, असाइन किए गए रनिंग मोड के लिए खास recognize() तरीके का इस्तेमाल करें:

    • इमेज: recognize(image:)
    • वीडियो: recognize(videoFrame:timestampInMilliseconds:)
    • लाइवस्ट्रीम: recognizeAsync(image:timestampInMilliseconds:)

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

    Swift

    Image

    let result = try gestureRecognizer.recognize(image: image)
        

    वीडियो

    let result = try gestureRecognizer.recognize(
      videoFrame: image,
      timestampInMilliseconds: timestamp)
        

    लाइव स्ट्रीम

    try gestureRecognizer.recognizeAsync(
      image: image,
      timestampInMilliseconds: timestamp)
        

    Objective-C

    Image

      MPPGestureRecognizerResult *result =
        [gestureRecognizer recognizeImage:mppImage
                                    error:nil];
        

    वीडियो

    MPPGestureRecognizerResult *result =
      [gestureRecognizer recognizeVideoFrame:image
                     timestampInMilliseconds:timestamp
                                       error:nil];
        

    लाइव स्ट्रीम

    BOOL success =
      [gestureRecognizer recognizeAsyncImage:image
                     timestampInMilliseconds:timestamp
                                       error:nil];
        

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

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

    • वीडियो मोड या लाइव स्ट्रीम मोड में विज्ञापन चलाते समय, आपको जेस्चर आइडेंटिफ़ायर टास्क को इनपुट फ़्रेम का टाइमस्टैंप भी देना होगा.

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

    • लाइव स्ट्रीम मोड में चलाने पर, 'जेस्चर आइडेंटिफ़ायर' टास्क तुरंत वापस आ जाता है और मौजूदा थ्रेड को ब्लॉक नहीं करता. यह हर इनपुट फ़्रेम को प्रोसेस करने के बाद, जेस्चर की पहचान के नतीजे के साथ-साथ gestureRecognizer(_:didFinishRecognition:timestampInMilliseconds:error:) तरीके को शुरू करता है. जेस्चर आइडेंटिफ़ायर, इस तरीके को खास सीरियल डिस्पैच सूची पर एसिंक्रोनस तरीके से शुरू करता है. यूज़र इंटरफ़ेस पर नतीजों को दिखाने के लिए, नतीजों को प्रोसेस करने के बाद, उन्हें मुख्य सूची में भेजें. अगर 'जेस्चर पहचानकर्ता' टास्क किसी दूसरे फ़्रेम को प्रोसेस करने में व्यस्त होने पर recognizeAsync फ़ंक्शन को कॉल किया जाता है, तो 'जेस्चर पहचानकर्ता' नए इनपुट फ़्रेम को अनदेखा कर देता है.

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

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

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

    नतीजे के तौर पर मिले 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)
    

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