Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

Beschriften Sie Bilder sicher mit Cloud Vision mit Firebase Auth und Funktionen auf Apple-Plattformen

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Um eine Google Cloud-API von Ihrer App aus aufzurufen, müssen Sie eine zwischengeschaltete REST-API erstellen, die die Autorisierung verarbeitet und geheime Werte wie API-Schlüssel schützt. Sie müssen dann Code in Ihre mobile App schreiben, um sich bei diesem Zwischendienst zu authentifizieren und mit ihm zu kommunizieren.

Eine Möglichkeit, diese REST-API zu erstellen, ist die Verwendung von Firebase Authentication and Functions, wodurch Sie ein verwaltetes, serverloses Gateway zu Google Cloud-APIs erhalten, das die Authentifizierung verarbeitet und von Ihrer mobilen App mit vorgefertigten SDKs aufgerufen werden kann.

In diesem Leitfaden wird gezeigt, wie Sie diese Technik verwenden, um die Cloud Vision-API von Ihrer App aus aufzurufen. Diese Methode ermöglicht allen authentifizierten Benutzern den Zugriff auf kostenpflichtige Cloud Vision-Dienste über Ihr Cloud-Projekt. Überlegen Sie also, ob dieser Authentifizierungsmechanismus für Ihren Anwendungsfall ausreicht, bevor Sie fortfahren.

Bevor Sie beginnen

Konfigurieren Sie Ihr Projekt

Wenn Sie Ihrer App Firebase noch nicht 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-Plattform-SDK-Repository hinzu:
  3.   https://github.com/firebase/firebase-ios-sdk
  4. Wählen Sie die Firebase ML-Bibliothek aus.
  5. Wenn Sie fertig sind, beginnt Xcode automatisch mit dem Auflösen und Herunterladen Ihrer Abhängigkeiten im Hintergrund.

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

  1. Importieren Sie in Ihrer App Firebase:

    Schnell

    import FirebaseMLModelDownloader

    Ziel c

    @import FirebaseMLModelDownloader;

Noch ein paar Konfigurationsschritte und wir können loslegen:

  1. Wenn Sie noch keine Cloud-basierten APIs für Ihr Projekt 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 Cloud-basierte APIs verwenden.

    3. Wenn Cloud-basierte APIs nicht bereits aktiviert sind, klicken Sie auf Cloud-basierte APIs aktivieren .
  2. Konfigurieren Sie Ihre vorhandenen Firebase-API-Schlüssel, um den Zugriff auf die Cloud Vision-API zu verbieten:
    1. Öffnen Sie die Anmeldedaten -Seite der Cloud-Konsole.
    2. Öffnen Sie für jeden API-Schlüssel in der Liste die Bearbeitungsansicht und fügen Sie im Abschnitt „Schlüsseleinschränkungen“ alle verfügbaren APIs mit Ausnahme der Cloud Vision-API zur Liste hinzu.

Stellen Sie die aufrufbare Funktion bereit

Stellen Sie als Nächstes die Cloud-Funktion bereit, mit der Sie Ihre App und die Cloud Vision-API überbrücken. Das Repository functions-samples enthält ein Beispiel, das Sie verwenden können.

Standardmäßig ermöglicht der Zugriff auf die Cloud Vision-API über diese Funktion nur authentifizierten Benutzern Ihrer App den Zugriff auf die Cloud Vision-API. Sie können die Funktion für unterschiedliche Anforderungen modifizieren.

So stellen Sie die Funktion bereit:

  1. Klonen oder laden Sie das Repository „functions-samples“ herunter und wechseln Sie in das Verzeichnis „ vision-annotate-image “:
    git clone https://github.com/firebase/functions-samples
    cd vision-annotate-image
    
  2. Abhängigkeiten installieren:
    cd functions
    npm install
    cd ..
    
  3. Wenn Sie die Firebase-Befehlszeilenschnittstelle nicht haben, installieren Sie sie .
  4. Initialisieren Sie ein Firebase-Projekt im Verzeichnis vision-annotate-image . Wenn Sie dazu aufgefordert werden, wählen Sie Ihr Projekt in der Liste aus.
    firebase init
  5. Stellen Sie die Funktion bereit:
    firebase deploy --only functions:annotateImage

Fügen Sie Ihrer App Firebase Auth hinzu

Die oben bereitgestellte aufrufbare Funktion lehnt alle Anfragen von nicht authentifizierten Benutzern Ihrer App ab. Falls Sie dies noch nicht getan haben, müssen Sie Ihrer App Firebase Auth hinzufügen.

Fügen Sie Ihrer App die erforderlichen Abhängigkeiten hinzu

Verwenden Sie Swift Package Manager, um die Cloud Functions for Firebase-Bibliothek zu installieren.

Jetzt können Sie Bilder beschriften.

1. Bereiten Sie das Eingabebild vor

Um Cloud Vision aufzurufen, muss das Bild als base64-codierter String formatiert werden. So verarbeiten Sie ein UIImage :

Schnell

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

Ziel c

NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
NSString *base64encodedImage =
  [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];

2. Rufen Sie die aufrufbare Funktion auf, um das Bild zu kennzeichnen

Um Objekte in einem Bild zu kennzeichnen, rufen Sie die aufrufbare Funktion auf, indem Sie eine JSON Cloud Vision-Anforderung übergeben .

  1. Initialisieren Sie zunächst eine Instanz von Cloud Functions:

    Schnell

    lazy var functions = Functions.functions()
    

    Ziel c

    @property(strong, nonatomic) FIRFunctions *functions;
    
  2. Erstellen Sie eine Anfrage mit Type auf LABEL_DETECTION gesetzt:

    Schnell

    let requestData = [
      "image": ["content": base64encodedImage],
      "features": ["maxResults": 5, "type": "LABEL_DETECTION"]
    ]
    

    Ziel c

    NSDictionary *requestData = @{
      @"image": @{@"content": base64encodedImage},
      @"features": @{@"maxResults": @5, @"type": @"LABEL_DETECTION"}
    };
    
  3. Rufen Sie abschließend die Funktion auf:

    Schnell

    functions.httpsCallable("annotateImage").call(requestData) { (result, error) in
      if let error = error as NSError? {
        if error.domain == FunctionsErrorDomain {
          let code = FunctionsErrorCode(rawValue: error.code)
          let message = error.localizedDescription
          let details = error.userInfo[FunctionsErrorDetailsKey]
        }
        // ...
      }
      // Function completed succesfully
    }
    

    Ziel c

    [[_functions HTTPSCallableWithName:@"annotateImage"]
                              callWithObject:requestData
                                  completion:^(FIRHTTPSCallableResult * _Nullable result, NSError * _Nullable error) {
            if (error) {
              if (error.domain == FIRFunctionsErrorDomain) {
                FIRFunctionsErrorCode code = error.code;
                NSString *message = error.localizedDescription;
                NSObject *details = error.userInfo[FIRFunctionsErrorDetailsKey];
              }
              // ...
            }
            // Function completed succesfully
            // Get information about labeled objects
    
          }];
    

3. Informieren Sie sich über beschriftete Objekte

Wenn der Bildkennzeichnungsvorgang erfolgreich ist, wird eine JSON-Antwort von BatchAnnotateImagesResponse im Ergebnis der Aufgabe zurückgegeben. Jedes Objekt im labelAnnotations Array stellt etwas dar, das im Bild beschriftet wurde. Für jedes Label können Sie die Textbeschreibung des Labels, seine Knowledge Graph-Entitäts-ID (falls verfügbar) und den Konfidenzwert der Übereinstimmung abrufen. Zum Beispiel:

Schnell

if let labelArray = (result?.data as? [String: Any])?["labelAnnotations"] as? [[String:Any]] {
  for labelObj in labelArray {
    let text = labelObj["description"]
    let entityId = labelObj["mid"]
    let confidence = labelObj["score"]
  }
}

Ziel c

NSArray *labelArray = result.data[@"labelAnnotations"];
for (NSDictionary *labelObj in labelArray) {
  NSString *text = labelObj[@"description"];
  NSString *entityId = labelObj[@"mid"];
  NSNumber *confidence = labelObj[@"score"];
}