Reconocer puntos de referencia con Firebase ML en iOS

Puedes usar Firebase ML para reconocer puntos de referencia conocidos en una imagen.

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 .

    Utilice Swift Package Manager para instalar y administrar las dependencias de Firebase.

    1. En Xcode, con el proyecto de su aplicación abierto, navegue hasta Archivo > Agregar paquetes .
    2. Cuando se le solicite, agregue el repositorio SDK de las plataformas Firebase Apple:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Elija la biblioteca Firebase ML.
    5. Agregue el indicador -ObjC a la sección Otros indicadores del vinculador de la configuración de compilación de su objetivo.
    6. Cuando termine, Xcode comenzará automáticamente a resolver y descargar sus dependencias en segundo plano.

    A continuación, realice algunas configuraciones en la aplicación:

    1. En tu aplicación, importa Firebase:

      Rápido

      import FirebaseMLModelDownloader

      C objetivo

      @import FirebaseMLModelDownloader;
  1. Si aún no ha habilitado las API basadas en la nube para su proyecto, hágalo ahora:

    1. Abra la página API de Firebase ML de Firebase console.
    2. 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.

    3. Si las API basadas en la nube aún no están habilitadas, haga clic en Habilitar API basadas en la nube .

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 cualquiera 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 como UIImage o CMSampleBufferRef al método detect(in:) de VisionCloudLandmarkDetector :

  1. 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];
    
  2. Para llamar a Cloud Vision, la imagen debe tener el formato de una cadena codificada en base64. Para procesar una UIImage :

    Rápido

    guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return }
    let base64encodedImage = imageData.base64EncodedString()

    C objetivo

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. 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 se realiza correctamente, se pasará una serie de objetos VisionCloudLandmark 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