Puoi utilizzare ML Kit per etichettare gli oggetti riconosciuti in un'immagine. Il modello predefinito fornito con ML Kit supporta oltre 400 etichette diverse.
Prova
- Prova l'app di esempio per per vedere un esempio di utilizzo di questa API.
Prima di iniziare
- Includi i seguenti pod ML Kit nel podfile:
pod 'GoogleMLKit/ImageLabeling', '15.5.0'
- Dopo aver installato o aggiornato i pod del progetto, apri il progetto Xcode utilizzando la relativa
.xcworkspace
. ML Kit è supportato in Xcode versione 12.4 o successiva.
Ora è tutto pronto per etichettare le immagini.
1. Prepara l'immagine di input
Crea un oggetto VisionImage
utilizzando un UIImage
o un
CMSampleBuffer
.
Se usi un UIImage
, segui questi passaggi:
- Crea un oggetto
VisionImage
conUIImage
. Assicurati di specificare il valore.orientation
corretto.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
Se usi un CMSampleBuffer
, segui questi passaggi:
-
Specifica l'orientamento dei dati dell'immagine contenuti nei
CMSampleBuffer
.Per ottenere l'orientamento dell'immagine:
Swift
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> UIImage.Orientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftMirrored : .right case .landscapeLeft: return cameraPosition == .front ? .downMirrored : .up case .portraitUpsideDown: return cameraPosition == .front ? .rightMirrored : .left case .landscapeRight: return cameraPosition == .front ? .upMirrored : .down case .faceDown, .faceUp, .unknown: return .up } }
Objective-C
- (UIImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationLeftMirrored : UIImageOrientationRight; case UIDeviceOrientationLandscapeLeft: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationDownMirrored : UIImageOrientationUp; case UIDeviceOrientationPortraitUpsideDown: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationRightMirrored : UIImageOrientationLeft; case UIDeviceOrientationLandscapeRight: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationUpMirrored : UIImageOrientationDown; case UIDeviceOrientationUnknown: case UIDeviceOrientationFaceUp: case UIDeviceOrientationFaceDown: return UIImageOrientationUp; } }
- Crea un oggetto
VisionImage
utilizzando il metodoCMSampleBuffer
oggetto e orientamento:Swift
let image = VisionImage(buffer: sampleBuffer) image.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition)
Objective-C
MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer]; image.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
2. Configura ed esegui l'etichettatore delle immagini
Per etichettare gli oggetti in un'immagine, passa l'oggettoVisionImage
all'elemento
Metodo processImage()
di ImageLabeler
.
- Innanzitutto, ottieni un'istanza di
ImageLabeler
.
Swift
let labeler = ImageLabeler.imageLabeler() // Or, to set the minimum confidence required: // let options = ImageLabelerOptions() // options.confidenceThreshold = 0.7 // let labeler = ImageLabeler.imageLabeler(options: options)
Objective-C
MLKImageLabeler *labeler = [MLKImageLabeler imageLabeler]; // Or, to set the minimum confidence required: // MLKImageLabelerOptions *options = // [[MLKImageLabelerOptions alloc] init]; // options.confidenceThreshold = 0.7; // MLKImageLabeler *labeler = // [MLKImageLabeler imageLabelerWithOptions:options];
- 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*_Nullable labels, NSError *_Nullable error) { if (error != nil) { return; } // Task succeeded. // ... }];
3. Ottieni informazioni sugli oggetti etichettati
Se l'etichettatura delle immagini ha esito positivo, il gestore del completamento riceve un array di
ImageLabel
oggetti. Ogni oggetto ImageLabel
rappresenta qualcosa che era
etichettate nell'immagine. Il modello di base supporta oltre 400 etichette diverse.
Puoi ottenere la descrizione testuale di ogni etichetta e l'indice tra tutte le etichette supportate
il modello e il punteggio di confidenza della corrispondenza. Ad esempio:
Swift
for label in labels { let labelText = label.text let confidence = label.confidence let index = label.index }
Objective-C
for (MLKImageLabel *label in labels) { NSString *labelText = label.text; float confidence = label.confidence; NSInteger index = label.index; }
Suggerimenti per migliorare il rendimento in tempo reale
Se vuoi etichettare le immagini in un'applicazione in tempo reale, segui questi passaggi: linee guida per ottenere le migliori frequenze fotogrammi:
- Per elaborare i fotogrammi video, utilizza l'API sincrona
results(in:)
dell'etichettatore delle immagini. Chiama questo metodo dal diAVCaptureVideoDataOutputSampleBufferDelegate
captureOutput(_, didOutput:from:)
per ottenere in modo sincrono i risultati dal video specificato frame. Mantieni diAVCaptureVideoDataOutput
alwaysDiscardsLateVideoFrames
cometrue
per limitare le chiamate all'etichettatore delle immagini. Se un nuovo il frame video diventa disponibile mentre l'etichettatore delle immagini è in esecuzione e verrà eliminato. - Se utilizzi l'output dello strumento di etichettatura delle immagini per sovrapporre gli elementi grafici l'immagine di input, occorre prima ottenere il risultato da ML Kit, quindi eseguire il rendering dell'immagine e la sovrapposizione in un solo passaggio. In questo modo, puoi visualizzare i contenuti solo una volta per ogni frame di input elaborato. Vedi la pagina updatePreviewOverlayViewWithLastFrame. nell'esempio della guida rapida di ML Kit.