תייג תמונות עם ערכת ML ב- iOS

אתה יכול להשתמש ב- ML Kit כדי לתייג אובייקטים המזוהים בתמונה, באמצעות מודל במכשיר או מודל ענן. ראה סקירה כדי ללמוד על היתרונות של כל גישה.

לפני שאתה מתחיל

  1. אם לא כבר הוסיף Firebase באפליקציה, לעשות זאת על ידי ביצוע השלבים במדריך להפעלה .
  2. כלול את הספריות קיט ML ב 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

    Objective-C

    @import Firebase;
  4. אם ברצונך להשתמש במודל מבוסס ענן, ועדיין לא הפעלת את ממשקי ה- API מבוססי הענן עבור הפרויקט שלך, בצע זאת כעת:

    1. פתח את דף APIs קיט ML של קונסולת Firebase.
    2. אם לא כבר שדרג פרויקט לתכנית תמחור Blaze, לחץ שדרג לעשות זאת. (תתבקש לשדרג רק אם הפרויקט שלך אינו בתכנית Blaze.)

      רק פרויקטים ברמת Blaze יכולים להשתמש בממשקי API מבוססי ענן.

    3. אם APIs מבוסס ענן אינו כבר מופעל, לחץ אפשר ממשקים מבוססי ענן.

    אם אתה רוצה להשתמש רק בדגם המכשיר, תוכל לדלג על שלב זה.

כעת אתה מוכן לתייג תמונות באמצעות מודל בהתקן או מודל מבוסס ענן.

1. הכינו את תמונת הקלט

צור VisionImage אובייקט באמצעות UIImage או CMSampleBufferRef .

כדי להשתמש UIImage :

  1. במידת הצורך, לסובב את התמונה כך שלה imageOrientation הנכס הוא .up .
  2. צור VisionImage אובייקט באמצעות כראוי-המסובב UIImage . לא ציין סיבוב מטה-ערך ברירת המחדל, .topLeft , חייב לשמש.

    מָהִיר

    let image = VisionImage(image: uiImage)

    Objective-C

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

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

    לאחר מכן, צור את אובייקט המטא -נתונים:

    מָהִיר

    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 האובייקט ואת מטה סיבוב:

    מָהִיר

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

    Objective-C

    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)
    

    Objective-C

    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)
    

    Objective-C

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

    Objective-C

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

Objective-C

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

טיפים לשיפור הביצועים בזמן אמת

אם ברצונך לסמן תמונות ביישום בזמן אמת, פעל על פי ההנחיות הבאות כדי להשיג את מספר המסגרות הטוב ביותר:

  • מצערת מצערת לתווית התמונות. אם מסגרת וידאו חדשה הופכת לזמינה בזמן שתווית התמונות פועלת, שמור את המסגרת.
  • אם אתה משתמש בפלט של תווית התמונות כדי לכסות גרפיקה על תמונת הקלט, תחילה קבל את התוצאה מ- ML Kit, ולאחר מכן עיבד את התמונה ואת שכבת העל בשלב אחד. בכך אתה מעבד למשטח התצוגה רק פעם אחת עבור כל מסגרת קלט. עיין previewOverlayView ו FIRDetectionOverlayView כיתות ביישום מדגם ראווה עבור דוגמה.

הצעדים הבאים