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

Bilder mit ML Kit auf iOS beschriften

Sie können ML Kit verwenden, um in einem Bild erkannte Objekte zu beschriften, entweder mithilfe eines Modells auf dem Gerät oder eines Cloud-Modells. Finden Sie in der Übersicht über die Vorteile der einzelnen Ansätze zu lernen.

Bevor Sie beginnen

  1. Wenn Sie nicht bereits Firebase zu Ihrer App, tun Sie dies , indem Sie die Schritte im Leitfaden zur Inbetriebnahme .
  2. Fügen Sie die ML - Kit - Bibliotheken in Ihrem Podfile:
    pod 'Firebase/MLVision', '6.25.0'

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

    Nachdem Sie Ihr Projekt Pods installieren oder aktualisieren, sollten Sie Ihre Xcode - Projekt zu öffnen , seine Verwendung .xcworkspace .
  3. Importieren Sie Firebase in Ihre App:

    Schnell

    import Firebase

    Ziel c

    @import Firebase;
  4. Wenn Sie das Cloud-basierte Modell verwenden möchten und die Cloud-basierten APIs für Ihr Projekt noch nicht aktiviert haben, tun Sie dies jetzt:

    1. Öffnen Sie die ML - Kit APIs Seite der Konsole Firebase.
    2. Wenn Sie nicht bereits Ihr Projekt zu einem Blaze Preisgestaltungsplan aktualisiert haben, klicken Sie auf, dies zu tun Upgrades. (Sie werden nur dann zum Upgrade aufgefordert, wenn Ihr Projekt nicht im Blaze-Plan enthalten ist.)

      Nur Blaze-Level-Projekte können Cloud-basierte APIs verwenden.

    3. Wenn Cloud-basierte APIs nicht bereits aktiviert ist, klicken Sie auf Aktivieren Cloud-basierte APIs.

    Wenn Sie nur das On-Device-Modell verwenden möchten, können Sie diesen Schritt überspringen.

Jetzt können Sie Bilder mit einem On-Device-Modell oder einem Cloud-basierten Modell beschriften.

1. Bereiten Sie das Eingabebild vor

Erstellen Sie ein VisionImage Objekt unter Verwendung eines UIImage oder eine CMSampleBufferRef .

So verwenden Sie eine UIImage :

  1. Falls erforderlich, drehen Sie das Bild so , dass seine imageOrientation Eigenschaft ist .up .
  2. Erstellen Sie ein VisionImage Objekt die korrekt gedreht mit UIImage . Geben Sie nicht jede Drehung Metadaten den Standardwert, .topLeft , verwendet werden.

    Schnell

    let image = VisionImage(image: uiImage)

    Ziel c

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

So verwenden Sie eine CMSampleBufferRef :

  1. Erstellen eines VisionImageMetadata Objekt , das angibt , ist die Orientierung der Bilddaten in der enthaltenen CMSampleBufferRef Puffer.

    So erhalten Sie die Bildausrichtung:

    Schnell

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

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

    Erstellen Sie dann das Metadatenobjekt:

    Schnell

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

    Ziel 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. Erstellen Sie ein VisionImage Objekt mit dem CMSampleBufferRef Objekt und die Rotation von Metadaten:

    Schnell

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

    Ziel c

    FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
    image.metadata = metadata;

2. Konfigurieren und Ausführen des Image Labelers

Zur Kennzeichnung der in einem Bildobjekten, vorbei an der VisionImage Objekt der VisionImageLabeler ‚s processImage() Methode.

  1. Erstens, eine Instanz erhalten VisionImageLabeler .

    Wenn Sie die Bildkennzeichnung auf dem Gerät verwenden möchten:

    Schnell

    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)
    

    Ziel 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];
    

    Wenn Sie den Cloud-Image-Labeler verwenden möchten:

    Schnell

    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)
    

    Ziel 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. Dann passiert das Bild auf das processImage() Methode:

    Schnell

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

    Ziel c

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

3. Holen Sie sich Informationen zu gekennzeichneten Objekten

Wenn Bild Kennzeichnung gelingt es, eine Reihe von VisionImageLabel werden Objekte in den Abschluss - Handler übergeben werden. Von jedem Objekt können Sie Informationen zu einem im Bild erkannten Merkmal abrufen.

Zum Beispiel:

Schnell

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

Ziel c

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

Tipps zur Verbesserung der Echtzeitleistung

Wenn Sie Bilder in einer Echtzeitanwendung beschriften möchten, befolgen Sie diese Richtlinien, um die besten Frameraten zu erzielen:

  • Drosseln Sie Aufrufe an den Image Labeler. Wenn ein neuer Videoframe verfügbar wird, während der Image Labeler ausgeführt wird, lassen Sie den Frame fallen.
  • Wenn Sie die Ausgabe des Image Labelers verwenden, um Grafiken auf dem Eingabebild zu überlagern, rufen Sie zuerst das Ergebnis von ML Kit ab und rendern Sie dann das Bild und die Überlagerung in einem einzigen Schritt. Auf diese Weise rendern Sie für jeden Eingabeframe nur einmal auf der Anzeigeoberfläche. Siehe die previewOverlayView und FIRDetectionOverlayView Klassen in der Vitrine Beispielanwendung für ein Beispiel.

Nächste Schritte