Puede usar Firebase ML para reconocer puntos de referencia conocidos en una imagen.
Antes de que empieces
- Si aún no ha agregado Firebase a su aplicación, hágalo siguiendo los pasos de la guía de inicio .
- En Xcode, con su proyecto de aplicación abierto, vaya a Archivo > Agregar paquetes .
- Cuando se le solicite, agregue el repositorio del SDK de las plataformas Apple de Firebase:
- Elija la biblioteca Firebase ML.
- Cuando termine, Xcode comenzará a resolver y descargar automáticamente sus dependencias en segundo plano.
- En su aplicación, importe Firebase:
Rápido
import FirebaseMLModelDownloader
C objetivo
@import FirebaseMLModelDownloader;
Si aún no ha habilitado las API basadas en la nube para su proyecto, hágalo ahora:
- Abra la página de las API de Firebase ML de la consola de Firebase.
Si aún no ha actualizado su proyecto al plan de precios de 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 usar 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 .
Use Swift Package Manager para instalar y administrar las dependencias de Firebase.
https://github.com/firebase/firebase-ios-sdk
A continuación, realice alguna configuración en la aplicación:
Configurar el detector de puntos de referencia
De forma predeterminada, el detector de nubes utiliza la versión estable del modelo y devuelve hasta 10 resultados. Si desea cambiar alguna de estas configuraciones, especifíquelas con un objeto VisionCloudDetectorOptions
como en el siguiente ejemplo:
Rápido
let options = VisionCloudDetectorOptions() options.modelType = .latest options.maxResults = 20
C objetivo
FIRVisionCloudDetectorOptions *options = [[FIRVisionCloudDetectorOptions alloc] init]; options.modelType = FIRVisionCloudModelTypeLatest; options.maxResults = 20;
En el siguiente paso, pase el objeto VisionCloudDetectorOptions
cuando cree el objeto detector de nubes.
Ejecute el detector de puntos de referencia
Para reconocer puntos de referencia en una imagen, pase la imagen comoUIImage
o CMSampleBufferRef
al método detect(in:)
de VisionCloudLandmarkDetector
:- Obtenga una instancia de
VisionCloudLandmarkDetector
:Rápido
lazy var vision = Vision.vision() let cloudDetector = vision.cloudLandmarkDetector(options: options) // Or, to use the default settings: // let cloudDetector = vision.cloudLandmarkDetector()
C objetivo
FIRVision *vision = [FIRVision vision]; FIRVisionCloudLandmarkDetector *landmarkDetector = [vision cloudLandmarkDetector]; // Or, to change the default settings: // FIRVisionCloudLandmarkDetector *landmarkDetector = // [vision cloudLandmarkDetectorWithOptions:options];
- Para llamar a Cloud Vision, la imagen debe estar formateada como una cadena codificada en base64. Para procesar una
UIImage
:Rápido
guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return } let base64encodedImage = imageData.base64EncodedString()
C objetivo
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
- Luego, pasa la imagen al método
detect(in:)
:Rápido
cloudDetector.detect(in: visionImage) { landmarks, error in guard error == nil, let landmarks = landmarks, !landmarks.isEmpty else { // ... return } // Recognized landmarks // ... }
C objetivo
[landmarkDetector detectInImage:image completion:^(NSArray<FIRVisionCloudLandmark *> *landmarks, NSError *error) { if (error != nil) { return; } else if (landmarks != nil) { // Got landmarks } }];
Obtenga información sobre los puntos de referencia reconocidos.
Si el reconocimiento de puntos de referencia tiene éxito, se pasará una matriz de objetosVisionCloudLandmark
al controlador de finalización. De cada objeto, puede obtener información sobre un punto de referencia reconocido en la imagen.Por ejemplo:
Rápido
for landmark in landmarks { let landmarkDesc = landmark.landmark let boundingPoly = landmark.frame let entityId = landmark.entityId // A landmark can have multiple locations: for example, the location the image // was taken, and the location of the landmark depicted. for location in landmark.locations { let latitude = location.latitude let longitude = location.longitude } let confidence = landmark.confidence }
C objetivo
for (FIRVisionCloudLandmark *landmark in landmarks) { NSString *landmarkDesc = landmark.landmark; CGRect frame = landmark.frame; NSString *entityId = landmark.entityId; // A landmark can have multiple locations: for example, the location the image // was taken, and the location of the landmark depicted. for (FIRVisionLatitudeLongitude *location in landmark.locations) { double latitude = [location.latitude doubleValue]; double longitude = [location.longitude doubleValue]; } float confidence = [landmark.confidence floatValue]; }
Próximos pasos
- Antes de implementar en producción una aplicación que usa una API en la nube, debe tomar algunas medidas adicionales para prevenir y mitigar el efecto del acceso no autorizado a la API .