Reconoce puntos de referencia con Firebase ML en iOS

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 .

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

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

    A continuación, realice alguna configuración en la aplicación:

    1. En su aplicación, importe 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 de las API de Firebase ML de la consola de Firebase.
    2. 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.

    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 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 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 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];
  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 tiene éxito, se pasará una matriz 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