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之一,您会发现这个有趣的评论:

// 初始化将用于发送请求的客户端。这个客户端只需要创建一次,并且可以重复用于多个请求。完成所有请求后,调用客户端上的“关闭”方法以安全地清理任何剩余的后台资源。

这意味着一旦您让客户进行设置,您就可以拨打电话,但正如您所说,它没有提及任何关于订单的内容。更多信息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 回答