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 .
- In Xcode, con il progetto dell'app aperto, vai a File > Add Packages .
- Quando richiesto, aggiungi il repository SDK delle piattaforme Apple Firebase:
- Scegli la libreria Firebase ML.
- Aggiungi il flag
-ObjC
alla sezione Altri flag del linker delle impostazioni di build del tuo target. - Al termine, Xcode inizierà automaticamente a risolvere e scaricare le tue dipendenze in background.
- Nella tua app, importa Firebase:
Veloce
import FirebaseMLModelDownloader
Obiettivo-C
@import FirebaseMLModelDownloader;
Se non hai già abilitato le API basate su cloud per il tuo progetto, fallo ora:
- Apri la pagina API Firebase ML della console Firebase.
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.
- Se le API basate su cloud non sono già abilitate, fai clic su Abilita API basate su cloud .
Utilizza Swift Package Manager per installare e gestire le dipendenze di Firebase.
https://github.com/firebase/firebase-ios-sdk.git
Successivamente, esegui alcune configurazioni in-app:
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
:
- 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
.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];
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;
}
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 .