Etichetta le immagini con Firebase ML su piattaforme Apple

Puoi utilizzare Firebase ML per etichettare gli oggetti riconosciuti in un'immagine. Consulta la panoramica per informazioni sulle funzionalità di questa API.

Prima di iniziare

    Se non hai già aggiunto Firebase alla tua app, fallo seguendo i passaggi nella guida introduttiva .

    Utilizza Swift Package Manager per installare e gestire le dipendenze di Firebase.

    1. In Xcode, con il progetto dell'app aperto, vai a File > Add Packages .
    2. Quando richiesto, aggiungi il repository SDK delle piattaforme Apple Firebase:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Scegli la libreria Firebase ML.
    5. Aggiungi il flag -ObjC alla sezione Altri flag del linker delle impostazioni di build del tuo target.
    6. Al termine, Xcode inizierà automaticamente a risolvere e scaricare le tue dipendenze in background.

    Successivamente, esegui alcune configurazioni in-app:

    1. Nella tua app, importa Firebase:

      Veloce

      import FirebaseMLModelDownloader

      Obiettivo-C

      @import FirebaseMLModelDownloader;
  1. Se non hai già abilitato le API basate su cloud per il tuo progetto, fallo ora:

    1. Apri la pagina API Firebase ML della console Firebase.
    2. Se non hai già aggiornato il tuo progetto al piano tariffario Blaze, fai clic su Aggiorna per farlo. (Ti verrà richiesto di eseguire l'aggiornamento solo se il tuo progetto non è incluso nel piano Blaze.)

      Solo i progetti a livello di Blaze possono utilizzare API basate su cloud.

    3. Se le API basate su cloud non sono già abilitate, fai clic su Abilita API basate su cloud .

Ora sei pronto per etichettare le immagini.

1. Preparare l'immagine di input

Crea un oggetto VisionImage utilizzando UIImage o CMSampleBufferRef .

Per utilizzare un'immagine UIImage :

  1. Se necessario, ruotare l'immagine in modo che la relativa proprietà imageOrientation sia .up .
  2. Crea un oggetto VisionImage utilizzando UIImage ruotato correttamente. Non specificare alcun metadato di rotazione: è necessario utilizzare il valore predefinito, .topLeft .

    Veloce

    let image = VisionImage(image: uiImage)

    Obiettivo-C

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

Per utilizzare un CMSampleBufferRef :

  1. Crea un oggetto VisionImageMetadata che specifica l'orientamento dei dati dell'immagine contenuti nel buffer CMSampleBufferRef .

    Per ottenere l'orientamento dell'immagine:

    Veloce

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

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

    Quindi, crea l'oggetto metadati:

    Veloce

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

    Obiettivo-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. Crea un oggetto VisionImage utilizzando l'oggetto CMSampleBufferRef e i metadati di rotazione:

    Veloce

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

    Obiettivo-C

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

2. Configurare ed eseguire l'etichettatore di immagini

Per etichettare gli oggetti in un'immagine, passare l'oggetto VisionImage al metodo processImage() di VisionImageLabeler .

  1. Innanzitutto, ottieni un'istanza di VisionImageLabeler :

    Veloce

    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)
    

    Obiettivo-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. Quindi, passa l'immagine al metodo processImage() :

    Veloce

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

    Obiettivo-C

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

3. Ottieni informazioni sugli oggetti etichettati

Se l'etichettatura dell'immagine ha esito positivo, una serie di oggetti VisionImageLabel verrà passata al gestore di completamento. Da ciascun oggetto è possibile ottenere informazioni su una caratteristica riconosciuta nell'immagine.

Per esempio:

Veloce

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

Obiettivo-C

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

Prossimi passi