iOS पर एमएल किट की मदद से, ऑब्जेक्ट का पता लगाएं और उन्हें ट्रैक करें

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

जब आप ML Kit इमेज पास करते हैं, तो ML Kit हर इमेज के लिए, इमेज में, पता लगाए गए पांच ऑब्जेक्ट और उनकी जगह को तय किया जा सकता है. पता लगाते समय वीडियो स्ट्रीम में ऑब्जेक्ट हैं, तो हर ऑब्जेक्ट का एक आईडी होता है, जिसका उपयोग आप ऑब्जेक्ट को इमेज में डालें. आपके पास कर्स ऑब्जेक्ट को चालू करने का विकल्प भी है क्लासिफ़िकेशन, जो ऑब्जेक्ट की कैटगरी के बारे में जानकारी देने वाले बड़े पैमाने पर लेबल करता है.

शुरू करने से पहले

  1. अगर आपने पहले से अपने ऐप्लिकेशन में Firebase नहीं जोड़ा है, तो ऐसा करने के लिए शुरुआती निर्देश में दिए गए चरणों को पूरा करें.
  2. अपनी Podfile में ML Kit लाइब्रेरी शामिल करें:
    pod 'Firebase/MLVision', '6.25.0'
    pod 'Firebase/MLVisionObjectDetection', '6.25.0'
    
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है प्रोजेक्ट के Pods को इंस्टॉल या अपडेट करने के बाद, अपना Xcode ज़रूर खोलें प्रोजेक्ट के .xcworkspace का इस्तेमाल करके बनाया गया है.
  3. अपने ऐप्लिकेशन में, Firebase इंपोर्ट करें:

    Swift

    import Firebase

    Objective-C

    @import Firebase;

1. ऑब्जेक्ट डिटेक्टर को कॉन्फ़िगर करें

ऑब्जेक्ट का पता लगाने और उन्हें ट्रैक करने के लिए, पहले एक VisionObjectDetector, विकल्प के तौर पर आपकी पसंद की कोई भी डिटेक्टर सेटिंग तय करना डिफ़ॉल्ट से बदलें.

  1. अपने इस्तेमाल के उदाहरण के लिए, ऑब्जेक्ट डिटेक्टर को कॉन्फ़िगर करें VisionObjectDetectorOptions ऑब्जेक्ट. आपके पास इन्हें बदलने का विकल्प है सेटिंग:

    ऑब्जेक्ट डिटेक्टर की सेटिंग
    पहचान मोड .stream (डिफ़ॉल्ट) | .singleImage

    स्ट्रीम मोड (डिफ़ॉल्ट) में, ऑब्जेक्ट डिटेक्टर बहुत कम स्क्रीन पर काम करता है इंतज़ार का समय, लेकिन हो सकता है कि पूरे नतीजे न मिलें. जैसे, इनके बारे में जानकारी न होना बाउंडिंग बॉक्स या कैटगरी) के आधार पर डिटेक्टर. साथ ही, स्ट्रीम मोड में, डिटेक्टर ट्रैकिंग ऑब्जेक्ट के आईडी, जिनका इस्तेमाल अलग-अलग फ़्रेम के बीच ऑब्जेक्ट को ट्रैक करने के लिए किया जा सकता है. ऑब्जेक्ट ट्रैक करने के लिए या इंतज़ार का समय कम होने पर इस मोड का इस्तेमाल करें ज़रूरी है, जैसे कि जब वीडियो स्ट्रीम को रीयल टाइम में प्रोसेस किया जाता हो समय.

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

    एक से ज़्यादा ऑब्जेक्ट का पता लगाएं और उन्हें ट्रैक करें false (डिफ़ॉल्ट) | true

    ज़्यादा से ज़्यादा पांच ऑब्जेक्ट या सिर्फ़ सबसे ज़्यादा ऑब्जेक्ट का पता लगाना और उन्हें ट्रैक करना है या नहीं साफ़ तौर पर दिखने वाला ऑब्जेक्ट (डिफ़ॉल्ट).

    ऑब्जेक्ट को वर्गीकृत करें false (डिफ़ॉल्ट) | true

    पता लगाए गए ऑब्जेक्ट को अनुमानित कैटगरी में बांटना है या नहीं. चालू होने पर, ऑब्जेक्ट की पहचान करने वाला टूल ये कैटगरी हैं: फ़ैशन के सामान, खाना, घरेलू सामान, जगह, पौधे, और अज्ञात चीज़ों के बारे में बताएँ.

    ऑब्जेक्ट की पहचान और ट्रैकिंग एपीआई को इन दो मुख्य इस्तेमाल के लिए ऑप्टिमाइज़ किया गया है मामले:

    • कैमरे में सबसे ज़रूरी चीज़ का लाइव पता लगाना और उसे ट्रैक करना व्यूफ़ाइंडर
    • किसी स्टैटिक इमेज में कई ऑब्जेक्ट की पहचान करना

    एपीआई को इस्तेमाल के इन उदाहरणों के हिसाब से कॉन्फ़िगर करने के लिए:

    Swift

    // Live detection and tracking
    let options = VisionObjectDetectorOptions()
    options.detectorMode = .stream
    options.shouldEnableMultipleObjects = false
    options.shouldEnableClassification = true  // Optional
    
    // Multiple object detection in static images
    let options = VisionObjectDetectorOptions()
    options.detectorMode = .singleImage
    options.shouldEnableMultipleObjects = true
    options.shouldEnableClassification = true  // Optional
    

    Objective-C

    // Live detection and tracking
    FIRVisionObjectDetectorOptions *options = [[FIRVisionObjectDetectorOptions alloc] init];
    options.detectorMode = FIRVisionObjectDetectorModeStream;
    options.shouldEnableMultipleObjects = NO;
    options.shouldEnableClassification = YES;  // Optional
    
    // Multiple object detection in static images
    FIRVisionObjectDetectorOptions *options = [[FIRVisionObjectDetectorOptions alloc] init];
    options.detectorMode = FIRVisionObjectDetectorModeSingleImage;
    options.shouldEnableMultipleObjects = YES;
    options.shouldEnableClassification = YES;  // Optional
    
  2. FirebaseVisionObjectDetector का इंस्टेंस पाएं:

    Swift

    let objectDetector = Vision.vision().objectDetector()
    
    // Or, to change the default settings:
    let objectDetector = Vision.vision().objectDetector(options: options)
    

    Objective-C

    FIRVisionObjectDetector *objectDetector = [[FIRVision vision] objectDetector];
    
    // Or, to change the default settings:
    FIRVisionObjectDetector *objectDetector = [[FIRVision vision] objectDetectorWithOptions:options];
    

2. ऑब्जेक्ट डिटेक्टर चलाएं

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

  1. UIImage याVisionImage CMSampleBufferRef.

    UIImage का इस्तेमाल करने के लिए:

    1. अगर ज़रूरी हो, तो इमेज को घुमाएं, ताकि इसकी imageOrientation प्रॉपर्टी .up है.
    2. स्क्रीन की दिशा को सही तरीके से घुमाने के लिए, VisionImage ऑब्जेक्ट बनाएं UIImage. कोई भी रोटेशन मेटाडेटा तय न करें—डिफ़ॉल्ट .topLeft वैल्यू का इस्तेमाल करना ज़रूरी है.

      Swift

      let image = VisionImage(image: uiImage)

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];

    CMSampleBufferRef का इस्तेमाल करने के लिए:

    1. एक VisionImageMetadata ऑब्जेक्ट बनाएं, जो में शामिल इमेज डेटा का ओरिएंटेशन CMSampleBufferRef बफ़र.

      इमेज का ओरिएंटेशन पाने के लिए:

      Swift

      func imageOrientation(
          deviceOrientation: UIDeviceOrientation,
          cameraPosition: AVCaptureDevice.Position
          ) -> VisionDetectorImageOrientation {
          switch deviceOrientation {
          case .portrait:
              return cameraPosition == .front ? .leftTop : .rightTop
          case .landscapeLeft:
              return cameraPosition == .front ? .bottomLeft : .topLeft
          case .portraitUpsideDown:
              return cameraPosition == .front ? .rightBottom : .leftBottom
          case .landscapeRight:
              return cameraPosition == .front ? .topRight : .bottomRight
          case .faceDown, .faceUp, .unknown:
              return .leftTop
          }
      }

      Objective-C

      - (FIRVisionDetectorImageOrientation)
          imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation
                                 cameraPosition:(AVCaptureDevicePosition)cameraPosition {
        switch (deviceOrientation) {
          case UIDeviceOrientationPortrait:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationLeftTop;
            } else {
              return FIRVisionDetectorImageOrientationRightTop;
            }
          case UIDeviceOrientationLandscapeLeft:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationBottomLeft;
            } else {
              return FIRVisionDetectorImageOrientationTopLeft;
            }
          case UIDeviceOrientationPortraitUpsideDown:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationRightBottom;
            } else {
              return FIRVisionDetectorImageOrientationLeftBottom;
            }
          case UIDeviceOrientationLandscapeRight:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationTopRight;
            } else {
              return FIRVisionDetectorImageOrientationBottomRight;
            }
          default:
            return FIRVisionDetectorImageOrientationTopLeft;
        }
      }

      इसके बाद, मेटाडेटा ऑब्जेक्ट बनाएं:

      Swift

      let cameraPosition = AVCaptureDevice.Position.back  // Set to the capture device you used.
      let metadata = VisionImageMetadata()
      metadata.orientation = imageOrientation(
          deviceOrientation: UIDevice.current.orientation,
          cameraPosition: cameraPosition
      )

      Objective-C

      FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
      AVCaptureDevicePosition cameraPosition =
          AVCaptureDevicePositionBack;  // Set to the capture device you used.
      metadata.orientation =
          [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                       cameraPosition:cameraPosition];
    2. VisionImage ऑब्जेक्ट बनाने के लिए, CMSampleBufferRef ऑब्जेक्ट और रोटेशन मेटाडेटा:

      Swift

      let image = VisionImage(buffer: sampleBuffer)
      image.metadata = metadata

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  2. ऑब्जेक्ट डिटेक्टर की इमेज प्रोसेसिंग में से किसी एक पर VisionImage को पास करें तरीकों का इस्तेमाल करना होगा. आप एसिंक्रोनस process(image:) तरीके का इस्तेमाल कर सकते हैं या फिर सिंक्रोनस results() तरीका.

    एसिंक्रोनस तरीके से ऑब्जेक्ट का पता लगाने के लिए:

    Swift

    objectDetector.process(image) { detectedObjects, error in
      guard error == nil else {
        // Error.
        return
      }
      guard let detectedObjects = detectedObjects, !detectedObjects.isEmpty else {
        // No objects detected.
        return
      }
    
      // Success. Get object info here.
      // ...
    }
    

    Objective-C

    [objectDetector processImage:image
                      completion:^(NSArray<FIRVisionObject *> * _Nullable objects,
                                   NSError * _Nullable error) {
                        if (error == nil) {
                          return;
                        }
                        if (objects == nil | objects.count == 0) {
                          // No objects detected.
                          return;
                        }
    
                        // Success. Get object info here.
                        // ...
                      }];
    

    ऑब्जेक्ट का सिंक्रोनस रूप से पता लगाने के लिए:

    Swift

    var results: [VisionObject]? = nil
    do {
      results = try objectDetector.results(in: image)
    } catch let error {
      print("Failed to detect object with error: \(error.localizedDescription).")
      return
    }
    guard let detectedObjects = results, !detectedObjects.isEmpty else {
      print("Object detector returned no results.")
      return
    }
    
    // ...
    

    Objective-C

    NSError *error;
    NSArray<FIRVisionObject *> *objects = [objectDetector resultsInImage:image
                                                                   error:&error];
    if (error == nil) {
      return;
    }
    if (objects == nil | objects.count == 0) {
      // No objects detected.
      return;
    }
    
    // Success. Get object info here.
    // ...
    
  3. अगर इमेज प्रोसेसर को कॉल सफल होता है, तो यह VisionObject पूरे करने वाले हैंडलर को या सूची को, इसके आधार पर लौटाता है आपने एसिंक्रोनस तरीका इस्तेमाल किया हो या सिंक्रोनस तरीका.

    हर VisionObject में ये प्रॉपर्टी शामिल होती हैं:

    frame CGRect, जो इमेज.
    trackingID वह पूर्णांक जो सभी इमेज में ऑब्जेक्ट की पहचान करता है. सिंगल इन वीडियो में कुछ नहीं इमेज मोड.
    classificationCategory ऑब्जेक्ट की अनुमानित कैटगरी. अगर ऑब्जेक्ट की पहचान करने वाला टूल काम नहीं करता क्लासिफ़िकेशन की सुविधा चालू रखें, यह हमेशा .unknown होता है.
    confidence ऑब्जेक्ट कैटगरी की कॉन्फ़िडेंस वैल्यू. अगर आपको डिटेक्टर में क्लासिफ़िकेशन चालू नहीं है या ऑब्जेक्ट अज्ञात के रूप में वर्गीकृत किया गया, यह nil है.

    Swift

    // detectedObjects contains one item if multiple object detection wasn't enabled.
    for obj in detectedObjects {
      let bounds = obj.frame
      let id = obj.trackingID
    
      // If classification was enabled:
      let category = obj.classificationCategory
      let confidence = obj.confidence
    }
    

    Objective-C

    // The list of detected objects contains one item if multiple
    // object detection wasn't enabled.
    for (FIRVisionObject *obj in objects) {
      CGRect bounds = obj.frame;
      if (obj.trackingID) {
        NSInteger id = obj.trackingID.integerValue;
      }
    
      // If classification was enabled:
      FIRVisionObjectCategory category = obj.classificationCategory;
      float confidence = obj.confidence.floatValue;
    }
    

उपयोगिता और परफ़ॉर्मेंस में सुधार करना

बेहतरीन उपयोगकर्ता अनुभव के लिए, अपने ऐप्लिकेशन में इन दिशा-निर्देशों का पालन करें:

  • ऑब्जेक्ट की पहचान हो पाना, ऑब्जेक्ट की विज़ुअल जटिलता पर निर्भर करता है. ऑब्जेक्ट कम विज़ुअल सुविधाओं का इस्तेमाल करने पर, हो सकता है कि पहचानी जाने वाली इमेज. आपको उपयोगकर्ताओं को कैप्चर करने के लिए ऐसा इनपुट जो उन ऑब्जेक्ट के साथ अच्छे से काम करता है जिनका आपको पता लगाना है.
  • क्लासिफ़िकेशन का इस्तेमाल करते समय, अगर आपको ऐसे ऑब्जेक्ट का पता लगाना है जो गिरते नहीं हैं समर्थित श्रेणियों में साफ़ तौर पर, अज्ञात के लिए विशेष हैंडलिंग लागू करें ऑब्जेक्ट हैं.

साथ ही, इसे देखें [ML Kit Material Design शोकेस ऐप्लिकेशन][showcase-link]{: .external } और मटीरियल डिज़ाइन मशीन लर्निंग से काम करने वाली सुविधाओं के पैटर्न का कलेक्शन.

रीयल-टाइम ऐप्लिकेशन में स्ट्रीमिंग मोड का इस्तेमाल करते समय, इन दिशा-निर्देशों का पालन करें बेहतरीन फ़्रेम रेट हासिल करें:

  • स्ट्रीमिंग मोड में एक से ज़्यादा ऑब्जेक्ट की पहचान करने की सुविधा का इस्तेमाल न करें, क्योंकि ज़्यादातर डिवाइस सही फ़्रेमरेट बना सके.

  • अगर आपको डेटा की कैटगरी तय करने की ज़रूरत नहीं है, तो उसे बंद कर दें.

  • डिटेक्टर को कॉल थ्रॉटल करें. अगर कोई नया वीडियो फ़्रेम डिटेक्टर के चलने के दौरान उपलब्ध होने पर, फ़्रेम छोड़ें.
  • अगर ग्राफ़िक को ओवरले करने के लिए, डिटेक्टर के आउटपुट का इस्तेमाल किया जा रहा है इनपुट इमेज को चुनने के बाद, पहले एमएल किट से नतीजा पाएं. इसके बाद, इमेज को रेंडर करें और ओवरले को एक ही चरण में पूरा करें. ऐसा करके, डिसप्ले सरफ़ेस पर रेंडर हो जाता है हर इनपुट फ़्रेम के लिए सिर्फ़ एक बार. previewOverlayView देखें और FIRDetectionOverlayView उदाहरण के लिए शोकेस सैंपल ऐप्लिकेशन में क्लास.