Erkennen Sie Sehenswürdigkeiten mit Firebase ML auf iOS

Mit Firebase ML können Sie bekannte Orientierungspunkte in einem Bild erkennen.

Bevor Sie beginnen

    Wenn Sie Firebase noch nicht zu Ihrer App hinzugefügt haben, befolgen Sie dazu die Schritte im Leitfaden „Erste Schritte“ .

    Verwenden Sie Swift Package Manager, um Firebase-Abhängigkeiten zu installieren und zu verwalten.

    1. Navigieren Sie in Xcode bei geöffnetem App-Projekt zu File > Add Packages .
    2. Wenn Sie dazu aufgefordert werden, fügen Sie das Firebase Apple Platforms SDK-Repository hinzu:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Wählen Sie die Firebase ML-Bibliothek.
    5. Fügen Sie das Flag -ObjC zum Abschnitt „Andere Linker-Flags“ der Build-Einstellungen Ihres Ziels hinzu.
    6. Wenn Sie fertig sind, beginnt Xcode automatisch mit der Auflösung und dem Herunterladen Ihrer Abhängigkeiten im Hintergrund.

    Führen Sie als Nächstes einige In-App-Einrichtungen durch:

    1. Importieren Sie Firebase in Ihre App:

      Schnell

      import FirebaseMLModelDownloader

      Ziel c

      @import FirebaseMLModelDownloader;
  1. Wenn Sie cloudbasierte APIs für Ihr Projekt noch nicht aktiviert haben, tun Sie dies jetzt:

    1. Öffnen Sie die Seite „Firebase ML APIs“ der Firebase-Konsole.
    2. Wenn Sie Ihr Projekt noch nicht auf den Blaze-Preisplan aktualisiert haben, klicken Sie dazu auf „Upgrade“ . (Sie werden nur dann zum Upgrade aufgefordert, wenn Ihr Projekt nicht im Blaze-Plan enthalten ist.)

      Nur Projekte auf Blaze-Ebene können cloudbasierte APIs verwenden.

    3. Wenn Cloud-basierte APIs noch nicht aktiviert sind, klicken Sie auf Cloud-basierte APIs aktivieren .

Konfigurieren Sie den Orientierungspunktdetektor

Standardmäßig verwendet der Cloud-Detektor die stabile Version des Modells und gibt bis zu 10 Ergebnisse zurück. Wenn Sie eine dieser Einstellungen ändern möchten, geben Sie sie wie im folgenden Beispiel mit einem VisionCloudDetectorOptions -Objekt an:

Schnell

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

Ziel c

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

Übergeben Sie im nächsten Schritt das VisionCloudDetectorOptions Objekt, wenn Sie das Cloud Detector-Objekt erstellen.

Führen Sie den Orientierungspunktdetektor aus

Um Orientierungspunkte in einem Bild zu erkennen, übergeben Sie das Bild als UIImage oder CMSampleBufferRef an die Methode detect(in:) von VisionCloudLandmarkDetector :

  1. Holen Sie sich eine Instanz von VisionCloudLandmarkDetector :

    Schnell

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

    Ziel c

    FIRVision *vision = [FIRVision vision];
    FIRVisionCloudLandmarkDetector *landmarkDetector = [vision cloudLandmarkDetector];
    // Or, to change the default settings:
    // FIRVisionCloudLandmarkDetector *landmarkDetector =
    //     [vision cloudLandmarkDetectorWithOptions:options];
    
  2. Um Cloud Vision aufzurufen, muss das Bild als Base64-codierte Zeichenfolge formatiert werden. So verarbeiten Sie ein UIImage :

    Schnell

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

    Ziel c

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. Übergeben Sie dann das Bild an die Methode detect(in:) :

    Schnell

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

    Ziel c

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

Informieren Sie sich über die anerkannten Sehenswürdigkeiten

Wenn die Orientierungspunkterkennung erfolgreich ist, wird ein Array von VisionCloudLandmark Objekten an den Abschlusshandler übergeben. Von jedem Objekt können Sie Informationen über einen im Bild erkannten Orientierungspunkt erhalten.

Zum Beispiel:

Schnell

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
}

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

Nächste Schritte