Puoi utilizzare ML Kit per etichettare gli oggetti riconosciuti in un'immagine, utilizzando un modello sul dispositivo o un modello cloud. Consulta la panoramica per conoscere i vantaggi di ciascun approccio.
Prima di iniziare
- Se non hai già aggiunto Firebase alla tua app, fallo seguendo i passaggi nella guida introduttiva .
- Includi le librerie ML Kit nel tuo Podfile:
pod 'Firebase/MLVision', '6.25.0'
Dopo aver installato o aggiornato i Pod del tuo progetto, assicurati di aprire il tuo progetto Xcode utilizzando il relativo# If using the on-device API: pod 'Firebase/MLVisionLabelModel', '6.25.0'
.xcworkspace
. - Nella tua app, importa Firebase:
Veloce
import Firebase
Obiettivo-C
@import Firebase;
Se desideri utilizzare il modello basato su cloud e non hai già abilitato le API basate su cloud per il tuo progetto, fallo ora:
- Apri la pagina API ML Kit della console Firebase.
Se non hai già aggiornato il tuo progetto a un piano tariffario Blaze, fai clic su Aggiorna per farlo. (Ti verrà richiesto di eseguire l'aggiornamento solo se il tuo progetto non è compreso nel piano Blaze.)
Solo i progetti a livello di Blaze possono utilizzare API basate su cloud.
- Se le API basate su cloud non sono già abilitate, fai clic su Abilita API basate su cloud .
Se desideri utilizzare solo il modello su dispositivo, puoi saltare questo passaggio.
Ora sei pronto per etichettare le immagini utilizzando un modello sul dispositivo o un modello basato su cloud.
1. Preparare l'immagine di input
Crea un oggetto VisionImage
utilizzando UIImage
o CMSampleBufferRef
.
Per utilizzare un'immagine UIImage
:
- Se necessario, ruotare l'immagine in modo che la relativa proprietà
imageOrientation
sia.up
. - Crea un oggetto
VisionImage
utilizzandoUIImage
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
:
Crea un oggetto
VisionImageMetadata
che specifica l'orientamento dei dati dell'immagine contenuti nel bufferCMSampleBufferRef
.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];
- Crea un oggetto
VisionImage
utilizzando l'oggettoCMSampleBufferRef
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'oggettoVisionImage
al metodo processImage()
di VisionImageLabeler
.Per prima cosa, ottieni un'istanza di
VisionImageLabeler
.Se desideri utilizzare l'etichettatrice di immagini sul dispositivo:
Veloce
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)
Obiettivo-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];
Se desideri utilizzare l'etichettatore di immagini cloud:
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];
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 oggettiVisionImageLabel
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;
}
Suggerimenti per migliorare le prestazioni in tempo reale
Se desideri etichettare le immagini in un'applicazione in tempo reale, segui queste linee guida per ottenere i migliori framerate:
- Limita le chiamate all'etichettatore di immagini. Se un nuovo fotogramma video diventa disponibile mentre l'etichettatrice di immagini è in esecuzione, rilascia il fotogramma.
- Se stai utilizzando l'output dell'etichettatore di immagini per sovrapporre la grafica all'immagine di input, ottieni prima il risultato da ML Kit, quindi esegui il rendering dell'immagine e della sovrapposizione in un unico passaggio. In questo modo, viene eseguito il rendering sulla superficie di visualizzazione solo una volta per ciascun fotogramma di input. Per un esempio, vedi le classi PreviewOverlayView e FIRDetectionOverlayView nell'app di esempio vetrina.
Prossimi passi
- Prima di distribuire in produzione un'app che utilizza un'API cloud, dovresti adottare alcune misure aggiuntive per prevenire e mitigare gli effetti dell'accesso API non autorizzato .