Puedes usar el Kit de AA para etiquetar objetos reconocidos en una imagen. El modelo predeterminado que se proporciona con el Kit de AA es compatible con más de 400 etiquetas diferentes.
Probarlo
- Juega con la app de muestra para ver un ejemplo de uso de esta API.
Antes de comenzar
- Incluye los siguientes pods de ML Kit en tu Podfile:
pod 'GoogleMLKit/ImageLabeling', '3.2.0'
- Después de instalar o actualizar los pods de tu proyecto, abre el proyecto de Xcode con su
.xcworkspace
. El Kit de AA es compatible con Xcode 12.4 o versiones posteriores.
Ahora estás listo para etiquetar imágenes.
1. Prepara la imagen de entrada
Crea un objeto VisionImage
con un UIImage
o CMSampleBuffer
.
Si usas un UIImage
, sigue estos pasos:
- Crea un objeto
VisionImage
con elUIImage
. Asegúrate de especificar la.orientation
correcta.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective‑C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
Si usas un CMSampleBuffer
, sigue estos pasos:
-
Especifica la orientación de los datos de imagen que se encuentran en
CMSampleBuffer
.Para obtener la orientación de la imagen, haz lo siguiente:
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 objeto
VisionImage
con el objeto y la orientaciónCMSampleBuffer
: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 y ejecuta el etiquetador de imágenes
Para etiquetar objetos de una imagen, pasa el objetoVisionImage
al método processImage()
de ImageLabeler
.
- Primero, obtén una instancia de
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];
- Luego, pasa la imagen al método
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. Obtén información sobre los objetos etiquetados
Si el etiquetado de imágenes se ejecuta correctamente, el controlador de finalización recibirá un arreglo de objetos ImageLabel
. Cada objeto ImageLabel
representa un elemento etiquetado en la imagen. El modelo base admite más de 400 etiquetas diferentes.
Puedes obtener la descripción de texto de cada etiqueta, el índice entre todas las etiquetas admitidas por el modelo y la puntuación de confianza de la coincidencia. Por ejemplo:
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; }
Sugerencias para mejorar el rendimiento en tiempo real
Si quieres etiquetar imágenes en una aplicación en tiempo real, sigue estos lineamientos para lograr la mejor velocidad de fotogramas:
- Para procesar marcos de video, usa la API síncrona
results(in:)
del etiquetador de imágenes. Llama a este método desde la funcióncaptureOutput(_, didOutput:from:)
deAVCaptureVideoDataOutputSampleBufferDelegate
para obtener resultados de manera síncrona desde el marco de video determinado. ManténalwaysDiscardsLateVideoFrames
deAVCaptureVideoDataOutput
comotrue
para limitar las llamadas al etiquetador de imágenes. Si hay un fotograma de video nuevo disponible mientras se ejecuta, se descartará. - Si usas el resultado del etiquetador de imágenes para superponer gráficos en la imagen de entrada, primero obtén el resultado del Kit de AA y, luego, procesa la imagen y la superposición en un solo paso. De esta manera, procesas en la superficie de visualización solo una vez por cada fotograma de entrada procesado. Consulta la updatePreviewOverlayViewWithLastFrame en la muestra de inicio rápido del Kit de AA para ver un ejemplo.