Puedes usar Firebase ML para etiquetar objetos reconocidos en una imagen. Consulte la descripción general para obtener información sobre las características de esta API.
Antes de que empieces
- Si aún no has agregado Firebase a tu aplicación, hazlo siguiendo los pasos de la guía de introducción .
- En Xcode, con el proyecto de su aplicación abierto, navegue hasta Archivo > Agregar paquetes .
- Cuando se le solicite, agregue el repositorio SDK de las plataformas Firebase Apple:
- Elija la biblioteca Firebase ML.
- Agregue el indicador
-ObjC
a la sección Otros indicadores del vinculador de la configuración de compilación de su objetivo. - Cuando termine, Xcode comenzará automáticamente a resolver y descargar sus dependencias en segundo plano.
- En tu aplicación, importa Firebase:
import FirebaseMLModelDownloader
@import FirebaseMLModelDownloader;
Si aún no ha habilitado las API basadas en la nube para su proyecto, hágalo ahora:
- Abra la página API de Firebase ML de Firebase console.
Si aún no ha actualizado su proyecto al plan de precios Blaze, haga clic en Actualizar para hacerlo. (Se le pedirá que actualice solo si su proyecto no está en el plan Blaze).
Solo los proyectos de nivel Blaze pueden utilizar API basadas en la nube.
- Si las API basadas en la nube aún no están habilitadas, haga clic en Habilitar API basadas en la nube .
Utilice Swift Package Manager para instalar y administrar las dependencias de Firebase.
https://github.com/firebase/firebase-ios-sdk.git
A continuación, realice algunas configuraciones en la aplicación:
Ahora estás listo para etiquetar imágenes.
1. Prepare la imagen de entrada
Cree un objeto VisionImage
utilizando UIImage
o CMSampleBufferRef
.
Para usar una UIImage
:
- Si es necesario, gire la imagen para que su propiedad
imageOrientation
sea.up
. - Cree un objeto
VisionImage
utilizandoUIImage
girado correctamente. No especifique ningún metadato de rotación; se debe utilizar el valor predeterminado,.topLeft
.let image = VisionImage(image: uiImage)
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
Para utilizar CMSampleBufferRef
:
Cree un objeto
VisionImageMetadata
que especifique la orientación de los datos de la imagen contenidos en el búferCMSampleBufferRef
.Para obtener la orientación de la imagen:
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
}
}- (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;
}
}Luego, crea el objeto de metadatos:
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used.
let metadata = VisionImageMetadata()
metadata.orientation = imageOrientation(
deviceOrientation: UIDevice.current.orientation,
cameraPosition: cameraPosition
)FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
AVCaptureDevicePosition cameraPosition =
AVCaptureDevicePositionBack; // Set to the capture device you used.
metadata.orientation =
[self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
cameraPosition:cameraPosition];- Cree un objeto
VisionImage
utilizando el objetoCMSampleBufferRef
y los metadatos de rotación:let image = VisionImage(buffer: sampleBuffer)
image.metadata = metadataFIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
image.metadata = metadata;
2. Configure y ejecute el etiquetador de imágenes.
Para etiquetar objetos en una imagen, pase el objetoVisionImage
al método processImage()
de VisionImageLabeler
.Primero, obtenga una instancia de
VisionImageLabeler
: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)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];Luego, pasa la imagen al método
processImage()
:labeler.process(image) { labels, error in
guard error == nil, let labels = labels else { return }
// Task succeeded.
// ...
}[labeler processImage:image
completion:^(NSArray<FIRVisionImageLabel *> *_Nullable labels,
NSError *_Nullable error) {
if (error != nil) { return; }
// Task succeeded.
// ...
}];
3. Obtener información sobre objetos etiquetados.
Si el etiquetado de imágenes se realiza correctamente, se pasará una matriz de objetosVisionImageLabel
al controlador de finalización. De cada objeto, puede obtener información sobre una característica reconocida en la imagen.Por ejemplo:
for label in labels {
let labelText = label.text
let entityId = label.entityID
let confidence = label.confidence
}
for (FIRVisionImageLabel *label in labels) {
NSString *labelText = label.text;
NSString *entityId = label.entityID;
NSNumber *confidence = label.confidence;
}
Próximos pasos
- Antes de implementar en producción una aplicación que utiliza una API de la nube, debe tomar algunas medidas adicionales para prevenir y mitigar el efecto del acceso no autorizado a la API .