Etichetta le immagini con Firebase ML sulle 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 ancora aggiunto Firebase alla tua app, fallo seguendo i passaggi della 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 (File > Aggiungi pacchetti).
    2. Quando richiesto, aggiungi il repository dell'SDK delle piattaforme Apple di Firebase:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Scegli la raccolta Firebase ML.
    5. Aggiungi il flag -ObjC alla sezione Altri flag del linker delle impostazioni di build del target.
    6. Al termine, Xcode inizierà automaticamente a risolvere e a scaricare le tue dipendenze in background.

    Poi, esegui alcune operazioni di configurazione nell'app:

    1. Nella tua app, importa Firebase:

      Swift

      import FirebaseMLModelDownloader

      Objective-C

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

    1. Apri la pagina Firebase ML API nella console Firebase.
    2. Se non hai ancora eseguito l'upgrade del progetto al piano tariffario Blaze con pagamento a consumo, fai clic su Esegui upgrade. (Ti verrà chiesto di eseguire l'upgrade solo se il tuo progetto non è incluso nel piano tariffario Blaze.)

      Solo i progetti con il piano tariffario Blaze possono utilizzare le API basate sul cloud.

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

Ora puoi etichettare le immagini.

1. Prepara l'immagine di input

Crea un oggetto VisionImage utilizzando un UIImage o un CMSampleBufferRef.

Per utilizzare un UIImage:

  1. Se necessario, ruota l'immagine in modo che la proprietà imageOrientation sia .up.
  2. Crea un oggetto VisionImage utilizzando UIImage ruotato correttamente. Non specificare metadati di rotazione. Deve essere utilizzato il valore predefinito .topLeft.

    Swift

    let image = VisionImage(image: uiImage)

    Objective-C

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

Per utilizzare un CMSampleBufferRef:

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

    Per ottenere l'orientamento dell'immagine:

    Swift

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

    Quindi, crea l'oggetto dei metadati:

    Swift

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

    Swift

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

    Objective-C

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

2. Configura ed esegui l'etichettatore di immagini

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

  1. Innanzitutto, ottieni un'istanza di VisionImageLabeler:

    Swift

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

    Swift

    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. Ricevere informazioni sugli oggetti etichettati

Se l'etichettatura delle immagini va a buon fine, al gestore di completamento viene passato un array di oggetti VisionImageLabel. Da ogni oggetto puoi ottenere informazioni su una funzionalità riconosciuta nell'immagine.

Ad esempio:

Swift

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

Passaggi successivi