Beschriften Sie Bilder mit dem ML-Kit auf iOS

Sie können ML Kit verwenden, um in einem Bild erkannte Objekte zu kennzeichnen, indem Sie entweder ein Modell auf dem Gerät oder ein Cloud-Modell verwenden. Sehen Sie sich die Übersicht an, um mehr über die Vorteile jedes Ansatzes zu erfahren.

Bevor Sie beginnen

  1. Wenn Sie Firebase noch nicht zu Ihrer App hinzugefügt haben, befolgen Sie dazu die Schritte im Leitfaden „Erste Schritte“ .
  2. Fügen Sie die ML-Kit-Bibliotheken in Ihre Pod-Datei ein:
    pod 'Firebase/MLVision', '6.25.0'

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

    Nachdem Sie die Pods Ihres Projekts installiert oder aktualisiert haben, stellen Sie sicher, dass Sie Ihr Xcode-Projekt mit seinem .xcworkspace öffnen.
  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 Seite „ML Kit APIs“ der Firebase-Konsole.
    2. Wenn Sie Ihr Projekt noch nicht auf einen Blaze-Preisplan aktualisiert haben, klicken Sie dazu auf „Upgrade“ . (Sie werden nur dann zum Upgrade aufgefordert, wenn Ihr Projekt nicht im Blaze-Plan enthalten ist.)

      Nur Projekte auf Blaze-Ebene können cloudbasierte APIs verwenden.

    3. Wenn Cloud-basierte APIs noch nicht aktiviert sind, klicken Sie auf Cloud-basierte APIs aktivieren .

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

Jetzt können Sie Bilder entweder mit einem geräteinternen oder einem cloudbasierten Modell kennzeichnen.

1. Bereiten Sie das Eingabebild vor

Erstellen Sie ein VisionImage Objekt mit einem UIImage oder einem CMSampleBufferRef .

So verwenden Sie ein UIImage :

  1. Drehen Sie das Bild bei Bedarf so, dass seine imageOrientation Eigenschaft .up hat.
  2. Erstellen Sie ein VisionImage Objekt mit dem korrekt gedrehten UIImage . Geben Sie keine Rotationsmetadaten an – der Standardwert .topLeft muss verwendet werden.

    Schnell

    let image = VisionImage(image: uiImage)

    Ziel c

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

So verwenden Sie ein CMSampleBufferRef :

  1. Erstellen Sie ein VisionImageMetadata Objekt, das die Ausrichtung der im CMSampleBufferRef Puffer enthaltenen Bilddaten angibt.

    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 den Rotationsmetadaten:

    Schnell

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

    Ziel c

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

2. Konfigurieren Sie den Bildbeschrifter und führen Sie ihn aus

Um Objekte in einem Bild zu beschriften, übergeben Sie das VisionImage Objekt an die Methode processImage() von VisionImageLabeler .

  1. Rufen Sie zunächst eine Instanz von VisionImageLabeler ab.

    Wenn Sie die Bildbeschriftung 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. Übergeben Sie dann das Bild an die Methode processImage() :

    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. Informieren Sie sich über gekennzeichnete Objekte

Wenn die Bildbeschriftung erfolgreich ist, wird ein Array von VisionImageLabel Objekten an den Abschlusshandler übergeben. Von jedem Objekt können Sie Informationen über ein im Bild erkanntes Merkmal erhalten.

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 Bildbezeichner. Wenn ein neues Videobild verfügbar wird, während der Bildbeschrifter ausgeführt wird, löschen Sie das Bild.
  • Wenn Sie die Ausgabe des Bildbeschrifters verwenden, um Grafiken auf dem Eingabebild zu überlagern, rufen Sie zunächst das Ergebnis vom ML Kit ab und rendern Sie dann das Bild und überlagern Sie es in einem einzigen Schritt. Auf diese Weise rendern Sie für jeden Eingaberahmen nur einmal auf der Anzeigeoberfläche. Ein Beispiel finden Sie in den Klassen „previewOverlayView “ und „FIRDetectionOverlayView“ in der Showcase-Beispiel-App.

Nächste Schritte