Google は、黒人コミュニティのための人種的公平の促進に取り組んでいます。詳細をご覧ください。

iOSでFirebaseAuthとFunctionsを使用してCloudVisionで画像に安全にラベルを付ける

アプリからGoogleCloud APIを呼び出すには、承認を処理し、APIキーなどのシークレット値を保護する中間RESTAPIを作成する必要があります。次に、この中間サービスを認証して通信するために、モバイルアプリにコードを記述する必要があります。

このRESTAPIを作成する1つの方法は、Firebase Authentication and Functionsを使用することです。これにより、認証を処理し、ビルド済みのSDKを使用してモバイルアプリから呼び出すことができる、Google CloudAPIへの管理されたサーバーレスゲートウェイが提供されます。

このガイドでは、この手法を使用してアプリからCloud VisionAPIを呼び出す方法を示します。この方法では、認証されたすべてのユーザーがクラウドプロジェクトを通じてCloud Visionの課金サービスにアクセスできるようになるため、先に進む前に、この認証メカニズムがユースケースに十分かどうかを検討してください。

あなたが始める前に

プロジェクトを構成する

  1. あなたはすでにあなたのアプリにFirebaseを追加していない場合は、の手順に従って、それを行うセットアップガイドを
  2. あなたは、その使用してXcodeプロジェクトを開くようにしてください、あなたのプロジェクトのポッドをインストールまたはアップデートした後:あなたのPodfileでFirebase含める.xcworkspace
  3. アプリで、Firebaseをインポートします。

    迅速

    import Firebase

    Objective-C

    @import Firebase;
  4. プロジェクトでクラウドベースのAPIをまだ有効にしていない場合は、今すぐ有効にしてください。

    1. 開きFirebase MLのAPIページFirebaseコンソールのを。
    2. すでにブレイズ・プライシング計画にプロジェクトをアップグレードしていない場合は、そうするためにアップグレード]をクリックします。 (プロジェクトがBlazeプランに含まれていない場合にのみ、アップグレードするように求められます。)

      BlazeレベルのプロジェクトのみがクラウドベースのAPIを使用できます。

    3. クラウドベースのAPIがすでに有効になっていない場合は、クラウドベースのAPIを有効にする]をクリックします。
  5. Cloud VisionAPIへのアクセスを禁止するように既存のFirebaseAPIキーを構成します。
    1. 開き、資格情報のCloudコンソールのページを。
    2. リスト内の各APIキーについては、編集ビューを開き、キーの制限]セクションで、リストにクラウドビジョンのAPIを除き、利用可能なAPIのすべてを追加します。

呼び出し可能な関数をデプロイする

次に、アプリとCloud VisionAPIのブリッジに使用するCloudFunctionをデプロイします。 functions-samplesリポジトリには、使用可能な例が含まれています。

デフォルトでは、この関数を介してCloud Vision APIにアクセスすると、アプリの認証されたユーザーのみがCloud VisionAPIにアクセスできます。さまざまな要件に合わせて関数を変更できます。

関数をデプロイするには:

  1. クローンまたはダウンロードが機能-サンプルはレポへと変化するvision-annotate-imageディレクトリ:
    git clone https://github.com/firebase/functions-samples
    cd vision-annotate-image
    
  2. 依存関係をインストールします。
    cd functions
    npm install
    cd ..
    
  3. あなたがFirebase CLIを持っていない場合は、それをインストール
  4. 中Firebaseプロジェクト初期化するvision-annotate-imageディレクトリを。プロンプトが表示されたら、リストからプロジェクトを選択します。
    firebase init
  5. 展開機能:
    firebase deploy --only functions:annotateImage

アプリにFirebaseAuthを追加する

上記でデプロイされた呼び出し可能関数は、アプリの認証されていないユーザーからのリクエストを拒否します。あなたはまだ行っていない場合は、する必要がありますあなたのアプリにFirebase認証を追加します。

アプリに必要な依存関係を追加する

  1. あなたのPodfileにFirebase関数ライブラリの依存関係を追加します。
    pod 'Firebase/Functions'
  2. 依存関係をインストールします。
    pod install

これで、画像にラベルを付ける準備ができました。

1.入力画像を準備します

Cloud Visionを呼び出すには、画像をbase64でエンコードされた文字列としてフォーマットする必要があります。処理するにUIImage

迅速

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

Objective-C

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

2.呼び出し可能関数を呼び出して、画像にラベルを付けます

ラベルに渡して呼び出し可能な機能たinvoke、画像内のオブジェクトJSONクラウドビジョン要求を

  1. まず、CloudFunctionsのインスタンスを初期化します。

    迅速

    lazy var functions = Functions.functions()
    

    Objective-C

    @property(strong, nonatomic) FIRFunctions *functions;
    
  2. リクエストを作成タイプにセットLABEL_DETECTION

    迅速

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

    Objective-C

    NSDictionary *requestData = @{
      @"image": @{@"content": base64encodedImage},
      @"features": @{@"maxResults": @5, @"type": @"LABEL_DETECTION"}
    };
    
  3. 最後に、関数を呼び出します。

    迅速

    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
    }
    

    Objective-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.ラベル付けされたオブジェクトに関する情報を取得します

画像ラベリング操作が成功した場合、のJSONレスポンスBatchAnnotateImagesResponseは、タスクの結果で返されます。各オブジェクトlabelAnnotations配列は、画像で標識したものを表しています。各ラベルについて、あなたはラベルのテキストの説明、その取得することができナレッジグラフエンティティID (利用可能な場合)、およびマッチの信頼スコアを。例えば:

迅速

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

Objective-C

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