Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

आईओएस पर एमएल किट के साथ छवियों को लेबल करें

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.
प्लेसहोल्डर34

आप किसी ऑन-डिवाइस मॉडल या क्लाउड मॉडल का उपयोग करके छवि में पहचाने गए ऑब्जेक्ट को लेबल करने के लिए एमएल किट का उपयोग कर सकते हैं। प्रत्येक दृष्टिकोण के लाभों के बारे में जानने के लिए अवलोकन देखें।

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

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

    # If using the on-device API: pod 'Firebase/MLVisionLabelModel', '6.25.0'

    अपने प्रोजेक्ट के पॉड्स को इंस्टॉल या अपडेट करने के बाद, अपने एक्सकोड प्रोजेक्ट को इसके .xcworkspace का उपयोग करके खोलना सुनिश्चित करें।
  3. अपने ऐप्लिकेशन में, Firebase आयात करें:

    तीव्र

    import Firebase

    उद्देश्य सी

    @import Firebase;
  4. यदि आप क्लाउड-आधारित मॉडल का उपयोग करना चाहते हैं, और आपने पहले से ही अपने प्रोजेक्ट के लिए क्लाउड-आधारित API को सक्षम नहीं किया है, तो अभी करें:

    1. फायरबेस कंसोल का एमएल किट एपीआई पेज खोलें।
    2. यदि आपने पहले से ही अपने प्रोजेक्ट को ब्लेज़ मूल्य निर्धारण योजना में अपग्रेड नहीं किया है, तो ऐसा करने के लिए अपग्रेड पर क्लिक करें। (आपको केवल तभी अपग्रेड करने के लिए कहा जाएगा जब आपका प्रोजेक्ट ब्लेज़ प्लान पर न हो।)

      केवल ब्लेज़-स्तरीय प्रोजेक्ट ही क्लाउड-आधारित API का उपयोग कर सकते हैं।

    3. यदि क्लाउड-आधारित API पहले से सक्षम नहीं हैं, तो क्लाउड-आधारित API सक्षम करें क्लिक करें .

    यदि आप केवल ऑन-डिवाइस मॉडल का उपयोग करना चाहते हैं, तो आप इस चरण को छोड़ सकते हैं।

अब आप ऑन-डिवाइस मॉडल या क्लाउड-आधारित मॉडल का उपयोग करके छवियों को लेबल करने के लिए तैयार हैं।

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 ऑब्जेक्ट को VisionImageLabeler की processImage() विधि में पास करें।

  1. सबसे पहले, VisionImageLabeler का उदाहरण प्राप्त करें।

    यदि आप ऑन-डिवाइस छवि लेबलर का उपयोग करना चाहते हैं:

    तीव्र

    let labeler = Vision.vision().onDeviceImageLabeler()
    
    // Or, to set the minimum confidence required:
    // let options = VisionOnDeviceImageLabelerOptions()
    // options.confidenceThreshold = 0.7
    // let labeler = Vision.vision().onDeviceImageLabeler(options: options)
    

    उद्देश्य सी

    FIRVisionImageLabeler *labeler = [[FIRVision vision] onDeviceImageLabeler];
    
    // Or, to set the minimum confidence required:
    // FIRVisionOnDeviceImageLabelerOptions *options =
    //         [[FIRVisionOnDeviceImageLabelerOptions alloc] init];
    // options.confidenceThreshold = 0.7;
    // FIRVisionImageLabeler *labeler =
    //         [[FIRVision vision] onDeviceImageLabelerWithOptions:options];
    

    यदि आप क्लाउड इमेज लेबलर का उपयोग करना चाहते हैं:

    तीव्र

    let labeler = Vision.vision().cloudImageLabeler()
    
    // Or, to set the minimum confidence required:
    // let options = VisionCloudImageLabelerOptions()
    // options.confidenceThreshold = 0.7
    // let labeler = Vision.vision().cloudImageLabeler(options: options)
    

    उद्देश्य सी

    FIRVisionImageLabeler *labeler = [[FIRVision vision] cloudImageLabeler];
    
    // Or, to set the minimum confidence required:
    // FIRVisionCloudImageLabelerOptions *options =
    //         [[FIRVisionCloudImageLabelerOptions alloc] init];
    // options.confidenceThreshold = 0.7;
    // FIRVisionImageLabeler *labeler =
    //         [[FIRVision vision] cloudImageLabelerWithOptions:options];
    
  2. फिर, इमेज को processImage() मेथड में पास करें:

    तीव्र

    labeler.process(image) { labels, error in
        guard error == nil, let labels = labels else { return }
    
        // Task succeeded.
        // ...
    }
    

    उद्देश्य सी

    [labeler processImage:image
               completion:^(NSArray<FIRVisionImageLabel *> *_Nullable labels,
                            NSError *_Nullable error) {
                   if (error != nil) { return; }
    
                   // Task succeeded.
                   // ...
               }];
    

3. लेबल की गई वस्तुओं के बारे में जानकारी प्राप्त करें

यदि छवि लेबलिंग सफल होती है, तो VisionImageLabel ऑब्जेक्ट्स की एक सरणी पूर्ण करने वाले हैंडलर को पास कर दी जाएगी। प्रत्येक वस्तु से, आप छवि में पहचानी गई विशेषता के बारे में जानकारी प्राप्त कर सकते हैं।

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

तीव्र

for label in labels {
    let labelText = label.text
    let entityId = label.entityID
    let confidence = label.confidence
}

उद्देश्य सी

for (FIRVisionImageLabel *label in labels) {
   NSString *labelText = label.text;
   NSString *entityId = label.entityID;
   NSNumber *confidence = label.confidence;
}

रीयल-टाइम प्रदर्शन को बेहतर बनाने के लिए टिप्स

यदि आप रीयल-टाइम एप्लिकेशन में छवियों को लेबल करना चाहते हैं, तो सर्वोत्तम फ़्रैमरेट प्राप्त करने के लिए इन दिशानिर्देशों का पालन करें:

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

अगले कदम