Reconnaître les points de repère avec Firebase ML sur iOS

Vous pouvez utiliser Firebase ML pour reconnaître des points de repère bien connus dans une image.

Avant que tu commences

    Si vous n'avez pas encore ajouté Firebase à votre application, faites-le en suivant les étapes du guide de démarrage .

    Utilisez Swift Package Manager pour installer et gérer les dépendances Firebase.

    1. Dans Xcode, avec votre projet d'application ouvert, accédez à File > Add Packages .
    2. Lorsque vous y êtes invité, ajoutez le référentiel SDK des plates-formes Apple Firebase :
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Choisissez la bibliothèque Firebase ML.
    5. Ajoutez l'indicateur -ObjC à la section Autres indicateurs de l'éditeur de liens des paramètres de construction de votre cible.
    6. Une fois terminé, Xcode commencera automatiquement à résoudre et à télécharger vos dépendances en arrière-plan.

    Ensuite, effectuez une configuration dans l'application :

    1. Dans votre application, importez Firebase :

      Rapide

      import FirebaseMLModelDownloader

      Objectif c

      @import FirebaseMLModelDownloader;
  1. Si vous n'avez pas encore activé les API basées sur le cloud pour votre projet, faites-le maintenant :

    1. Ouvrez la page API Firebase ML de la console Firebase.
    2. Si vous n'avez pas encore mis à niveau votre projet vers le plan tarifaire Blaze, cliquez sur Mettre à niveau pour le faire. (Vous serez invité à effectuer une mise à niveau uniquement si votre projet ne fait pas partie du plan Blaze.)

      Seuls les projets de niveau Blaze peuvent utiliser des API basées sur le cloud.

    3. Si les API basées sur le cloud ne sont pas déjà activées, cliquez sur Activer les API basées sur le cloud .

Configurer le détecteur de repère

Par défaut, le détecteur Cloud utilise la version stable du modèle et renvoie jusqu'à 10 résultats. Si vous souhaitez modifier l'un de ces paramètres, spécifiez-les avec un objet VisionCloudDetectorOptions comme dans l'exemple suivant :

Rapide

let options = VisionCloudDetectorOptions()
options.modelType = .latest
options.maxResults = 20

Objectif c

  FIRVisionCloudDetectorOptions *options =
      [[FIRVisionCloudDetectorOptions alloc] init];
  options.modelType = FIRVisionCloudModelTypeLatest;
  options.maxResults = 20;
  

À l'étape suivante, transmettez l'objet VisionCloudDetectorOptions lorsque vous créez l'objet détecteur Cloud.

Exécutez le détecteur de points de repère

Pour reconnaître les points de repère dans une image, transmettez l'image en tant que UIImage ou CMSampleBufferRef à la méthode detect(in:) de VisionCloudLandmarkDetector :

  1. Obtenez une instance de VisionCloudLandmarkDetector :

    Rapide

    lazy var vision = Vision.vision()
    
    let cloudDetector = vision.cloudLandmarkDetector(options: options)
    // Or, to use the default settings:
    // let cloudDetector = vision.cloudLandmarkDetector()
    

    Objectif c

    FIRVision *vision = [FIRVision vision];
    FIRVisionCloudLandmarkDetector *landmarkDetector = [vision cloudLandmarkDetector];
    // Or, to change the default settings:
    // FIRVisionCloudLandmarkDetector *landmarkDetector =
    //     [vision cloudLandmarkDetectorWithOptions:options];
    
  2. Pour appeler Cloud Vision, l'image doit être formatée sous forme de chaîne codée en base64. Pour traiter une UIImage :

    Rapide

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

    Objectif c

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. Ensuite, transmettez l'image à la méthode detect(in:) :

    Rapide

    cloudDetector.detect(in: visionImage) { landmarks, error in
      guard error == nil, let landmarks = landmarks, !landmarks.isEmpty else {
        // ...
        return
      }
    
      // Recognized landmarks
      // ...
    }
    

    Objectif c

    [landmarkDetector detectInImage:image
                         completion:^(NSArray<FIRVisionCloudLandmark *> *landmarks,
                                      NSError *error) {
      if (error != nil) {
        return;
      } else if (landmarks != nil) {
        // Got landmarks
      }
    }];
    

Obtenez des informations sur les monuments reconnus

Si la reconnaissance des points de repère réussit, un tableau d'objets VisionCloudLandmark sera transmis au gestionnaire d'achèvement. A partir de chaque objet, vous pouvez obtenir des informations sur un point de repère reconnu dans l'image.

Par exemple:

Rapide

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
}

Objectif c

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];
}

Prochaines étapes