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

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

Avant de commencer

    Si vous n'avez pas encore ajouté Firebase à votre application, suivez les les étapes du guide de démarrage.

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

    1. Dans Xcode, ouvrez le projet de votre application, puis accédez à File > Ajouter des packages.
    2. Lorsque vous y êtes invité, ajoutez le dépôt du SDK des plates-formes Firebase pour Apple :
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Sélectionnez la bibliothèque Firebase ML.
    5. Ajoutez l'indicateur -ObjC à la section Other Linker Flags (Autres indicateurs Linker) des paramètres de compilation de votre cible.
    6. Lorsque vous avez terminé, Xcode commence à résoudre et à télécharger automatiquement vos dépendances en arrière-plan.

    Effectuez ensuite une configuration dans l'application :

    1. Dans votre application, importez Firebase :

      Swift

      import FirebaseMLModelDownloader

      Objective-C

      @import FirebaseMLModelDownloader;
  1. Si vous n'avez pas encore activé les API dans le cloud pour votre projet, faites-le dès maintenant:

    1. Ouvrez le Firebase ML page des API de la console Firebase.
    2. Si vous n'avez pas encore fait passer votre projet au forfait Blaze, cliquez sur Pour ce faire, effectuez une mise à niveau. (Vous ne serez invité à effectuer la mise à niveau projet n'est pas inclus dans la formule Blaze.)

      Seuls les projets de niveau Blaze peuvent utiliser des API dans le cloud.

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

Configurer le détecteur de points 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 dans l'exemple suivant:

Swift

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

Objective-C

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

À l'étape suivante, transmettez VisionCloudDetectorOptions lorsque vous créez l'objet "Détecteur de cloud".

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

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

  1. Obtenez une instance de VisionCloudLandmarkDetector:

    Swift

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

    Objective-C

    FIRVision *vision = [FIRVision vision];
    FIRVisionCloudLandmarkDetector *landmarkDetector = [vision cloudLandmarkDetector];
    // Or, to change the default settings:
    // FIRVisionCloudLandmarkDetector *landmarkDetector =
    //     [vision cloudLandmarkDetectorWithOptions:options];
  2. Pour que vous puissiez appeler Cloud Vision, l'image doit être encodée en base64 . Pour traiter un UIImage :

    Swift

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

    Objective-C

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

    Swift

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

    Objective-C

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

Obtenir des informations sur les points de repère reconnus

Si la reconnaissance de repère aboutit, un tableau d'objets VisionCloudLandmark est transmis au gestionnaire de finalisation. Pour chaque objet, vous pouvez obtenir des informations sur un repère reconnu dans l'image.

Exemple :

Swift

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
}

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

Étapes suivantes