1

画像の URL のリストを指定して、各画像に注釈を付けたい、つまり、各画像からテキストを抽出したい。そのために、Java で Google Cloud Vision API クライアント ライブラリを使用したいと考えています。ここに私の疑似コードがあります:

List<String> imageUrls = ...;
List<AnnotateImageRequest> requests = imageUrls.stream()
    .map(convertToRequest)
    .collect(Collectors::toList);
BatchAnnotateImagesResponse batchResponse = imageAnnotatorClient.batchAnnotateImages(requests);

これでbatchResponseのリストを取得できますAnnotateImageResponse。質問は、AnnotateImageResponseの数がリクエストの数に対応しているかどうかです。応答の順序は要求の順序に対応していますか? そうすることで、安全に想定できますか

for (int i = 0 ; i < imageUrls.size(); i++) {
    var url = imageUrls.get(i);
    var annotations = batchResponse.getResponses(i).getTextAnnotationsList();
}

for ループの各反復で正しい画像の注釈を取得しますか? これは、ドキュメントからは明らかではありません。

4

1 に答える 1

0

公式のスニペットDetectText.javaの 1 つを確認すると、次の興味深いコメントが見つかります。

// リクエストの送信に使用されるクライアントを初期化します。このクライアントは一度だけ作成する必要があり、複数のリクエストに再利用できます。すべてのリクエストが完了したら、クライアントで「close」メソッドを呼び出して、残りのバックグラウンド リソースを安全にクリーンアップします。

これは、クライアントをセットアップしたら電話をかけることができることを意味しますが、あなたが言ったように、注文については何も言及していません。の詳細についてImageAnnotatorClientは、こちらを参照してください。

テストの結果、バッチは提供されたリクエスト リストのsame sizeおよび であることがわかりました。same orderの詳細についてはBatchAnnotateImagesResponseこちらをご覧ください。

最後に、画像注釈の処理をさらに拡張し、要求の処理方法を確認できるasyncBatchAnnotateImages、公式のクラウド ビジョン 注釈サンプルから更新されたバージョンの関数を含むコードを以下に残します。(現在の範囲外かもしれませんが、役に立つと思います)

public static void asyncBatchAnnotateImages(List<String> uris, String outputUri)
      throws IOException, ExecutionException, InterruptedException {

  try (ImageAnnotatorClient imageAnnotatorClient = ImageAnnotatorClient.create()) {

    List<AnnotateImageRequest> imageRequests = new ArrayList<AnnotateImageRequest>();

    for (String inputImageUri : uris) {
       ImageSource source = ImageSource.newBuilder().setImageUri(inputImageUri).build();
       Image image = Image.newBuilder().setSource(source).build();

       Feature feature = Feature.newBuilder().setType(Feature.Type.LABEL_DETECTION).build();

       AnnotateImageRequest imageRequest = AnnotateImageRequest.newBuilder().setImage(image).addFeatures(feature).build();
       imageRequests.add(imageRequest);
    } 
       
    GcsDestination gcsDestination = GcsDestination.newBuilder().setUri(outputUri).build();
    OutputConfig outputConfig = OutputConfig.newBuilder()
              .setGcsDestination(gcsDestination)
              .setBatchSize(1) // The max number of responses to output in each JSON file
              .build();

    AsyncBatchAnnotateImagesRequest request = AsyncBatchAnnotateImagesRequest.newBuilder()
              .addAllRequests(imageRequests)
              .setOutputConfig(outputConfig)
              .build();


    AsyncBatchAnnotateImagesResponse response = imageAnnotatorClient.asyncBatchAnnotateImagesAsync(request).get();

    String gcsOutputUri = response.getOutputConfig().getGcsDestination().getUri();
    System.out.format("Output written to GCS with prefix: %s%n", gcsOutputUri);
  }
}
于 2022-01-11T18:43:32.877 に答える