आईओएस पर एमएल किट के साथ ऑब्जेक्ट का पता लगाएं और ट्रैक करें

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

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

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

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

    तीव्र

    import Firebase

    उद्देश्य सी

    @import Firebase;

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

ऑब्जेक्ट का पता लगाना और ट्रैक करना शुरू करने के लिए, पहले VisionObjectDetector का एक उदाहरण बनाएं, वैकल्पिक रूप से किसी भी डिटेक्टर सेटिंग्स को निर्दिष्ट करें जिसे आप डिफ़ॉल्ट से बदलना चाहते हैं।

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

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

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

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

    अनेक वस्तुओं का पता लगाएं और उन्हें ट्रैक करें false (डिफ़ॉल्ट) | true

    क्या अधिकतम पांच वस्तुओं का पता लगाना और ट्रैक करना है या केवल सबसे प्रमुख वस्तु (डिफ़ॉल्ट) की।

    वस्तुओं को वर्गीकृत करें false (डिफ़ॉल्ट) | true

    खोजी गई वस्तुओं को मोटे श्रेणियों में वर्गीकृत किया जाए या नहीं। सक्षम होने पर, ऑब्जेक्ट डिटेक्टर वस्तुओं को निम्नलिखित श्रेणियों में वर्गीकृत करता है: फैशन सामान, भोजन, घरेलू सामान, स्थान, पौधे और अज्ञात।

    ऑब्जेक्ट डिटेक्शन और ट्रैकिंग एपीआई इन दो मुख्य उपयोग मामलों के लिए अनुकूलित है:

    • कैमरा व्यूफ़ाइंडर में सबसे प्रमुख वस्तु का लाइव पता लगाना और ट्रैकिंग करना
    • एक स्थिर छवि में एकाधिक वस्तुओं का पता लगाना

    इन उपयोग मामलों के लिए एपीआई कॉन्फ़िगर करने के लिए:

    तीव्र

    // 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
    

    उद्देश्य सी

    // 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 का एक उदाहरण प्राप्त करें:

    तीव्र

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

    उद्देश्य सी

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

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

वस्तुओं का पता लगाने और उन्हें ट्रैक करने के लिए, वीडियो की प्रत्येक छवि या फ़्रेम के लिए निम्नलिखित कार्य करें। यदि आपने स्ट्रीम मोड सक्षम किया है, तो आपको CMSampleBufferRef s से VisionImage ऑब्जेक्ट बनाना होगा।

  1. UIImage या CMSampleBufferRef उपयोग करके एक VisionImage ऑब्जेक्ट बनाएं।

    UIImage उपयोग करने के लिए:

    1. यदि आवश्यक हो, तो छवि को घुमाएँ ताकि उसकी imageOrientation गुण .up हो।
    2. सही ढंग से घुमाए गए UIImage उपयोग करके एक VisionImage ऑब्जेक्ट बनाएं। कोई रोटेशन मेटाडेटा निर्दिष्ट न करें—डिफ़ॉल्ट मान, .topLeft , का उपयोग किया जाना चाहिए।

      तीव्र

      let image = VisionImage(image: uiImage)

      उद्देश्य सी

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

    CMSampleBufferRef का उपयोग करने के लिए:

    1. एक VisionImageMetadata ऑब्जेक्ट बनाएं जो CMSampleBufferRef बफर में मौजूद छवि डेटा के ओरिएंटेशन को निर्दिष्ट करता है।

      छवि अभिविन्यास प्राप्त करने के लिए:

      तीव्र

      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
          }
      }

      उद्देश्य सी

      - (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;
        }
      }

      फिर, मेटाडेटा ऑब्जेक्ट बनाएं:

      तीव्र

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

      उद्देश्य सी

      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. CMSampleBufferRef ऑब्जेक्ट और रोटेशन मेटाडेटा का उपयोग करके एक VisionImage ऑब्जेक्ट बनाएं:

      तीव्र

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

      उद्देश्य सी

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

    वस्तुओं का अतुल्यकालिक रूप से पता लगाने के लिए:

    तीव्र

    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.
      // ...
    }
    

    उद्देश्य सी

    [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.
                        // ...
                      }];
    

    वस्तुओं का समकालिक रूप से पता लगाने के लिए:

    तीव्र

    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
    }
    
    // ...
    

    उद्देश्य सी

    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 है।

    तीव्र

    // 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
    }
    

    उद्देश्य सी

    // 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;
    }
    

प्रयोज्यता और प्रदर्शन में सुधार

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

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

इसके अलावा, मशीन लर्निंग-संचालित सुविधाओं के संग्रह के लिए [एमएल किट मटेरियल डिज़ाइन शोकेस ऐप] [शोकेस-लिंक] {: .extern } और मटेरियल डिज़ाइन पैटर्न भी देखें।

वास्तविक समय एप्लिकेशन में स्ट्रीमिंग मोड का उपयोग करते समय, सर्वोत्तम फ़्रेमरेट प्राप्त करने के लिए इन दिशानिर्देशों का पालन करें:

  • स्ट्रीमिंग मोड में मल्टीपल ऑब्जेक्ट डिटेक्शन का उपयोग न करें, क्योंकि अधिकांश डिवाइस पर्याप्त फ़्रेमरेट उत्पन्न करने में सक्षम नहीं होंगे।

  • यदि आपको इसकी आवश्यकता नहीं है तो वर्गीकरण अक्षम करें।

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