Catch up on everthing we announced at this year's Firebase Summit. Learn more

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

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

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

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

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

    आप स्थापित करने या अपने प्रोजेक्ट की फलियाँ अद्यतन करते हैं, इसके उपयोग करते हुए अपने Xcode प्रोजेक्ट को खोलने के लिए यकीन है कि हो के बाद .xcworkspace
  3. अपने ऐप्लिकेशन में, Firebase आयात करें:

    तीव्र

    import Firebase

    उद्देश्य सी

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

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

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

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

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

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

1. इनपुट छवि तैयार करें

एक बनाएं VisionImage एक का उपयोग कर वस्तु UIImage या एक CMSampleBufferRef

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

  1. यदि आवश्यक हो, छवि को घुमाने के लिए इतना है कि इसके imageOrientation संपत्ति है .up
  2. एक बनाएं VisionImage सही ढंग से घुमाया का उपयोग कर वस्तु UIImage । किसी भी रोटेशन मेटाडाटा-सामान्य मान, निर्दिष्ट नहीं करते .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. एक बनाएं VisionImage का उपयोग कर वस्तु CMSampleBufferRef वस्तु और रोटेशन मेटाडाटा:

    तीव्र

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

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

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

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

अगला कदम