使用Java客户端库批量注释Google Vision图像

8

在使用提供的Google Vision Java客户端对图像进行注释时,我遇到了异常。

具体地说,是在批处理客户端batchAnnotateImages处理以下代码时出错:

public void processOCR(byte[] file) 
{
     List<AnnotateImageRequest> requests = new ArrayList<>();

      ByteString imageByteString = ByteString.copyFrom(file);

      Image img = Image.newBuilder().setContent(imageByteString).build();
      Feature feat = Feature.newBuilder().setType(Type.DOCUMENT_TEXT_DETECTION).build();

      AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build();
      requests.add(request);

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

        BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests);
        List<AnnotateImageResponse> responses = response.getResponsesList();
        client.close();

        //visionResultsDTO result = new visionResultsDTO();
        String ParagraphText = "";


        for (AnnotateImageResponse res : responses) {
          if (res.hasError()) {
            //throw exception.
            return;
          }

          // For full list of available annotations, see http://g.co/cloud/vision/docs
          TextAnnotation annotation = res.getFullTextAnnotation();
          for (Page page: annotation.getPagesList()) {
            String pageText = "";
            for (Block block : page.getBlocksList()) {
          String blockText = "";
              for (Paragraph para : block.getParagraphsList()) {
                String paraText = "";
                for (Word word: para.getWordsList()) {
                  String wordText = "";
              for (Symbol symbol: word.getSymbolsList()) {
                    wordText = wordText + symbol.getText();
                  }
              paraText = paraText + wordText;
                }
                // Output Example using Paragraph:
                blockText = blockText + paraText;
              }
              pageText = pageText + blockText;
            }
          }
          ParagraphText = annotation.getText();
        //  result.setResultText(ParagraphText);
        }
      } catch (Exception e) 
      {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
 }

我收到了以下堆栈跟踪/错误:

java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor; at com.google.api.gax.retrying.BasicRetryingFuture.(BasicRetryingFuture.java:77) at com.google.api.gax.retrying.CallbackChainRetryingFuture.(CallbackChainRetryingFuture.java:62) at com.google.api.gax.retrying.ScheduledRetryingExecutor.createFuture(ScheduledRetryingExecutor.java:86) at com.google.api.gax.grpc.RetryingCallable.futureCall(RetryingCallable.java:57) at com.google.api.gax.grpc.RetryingCallable.futureCall(RetryingCallable.java:42) at com.google.api.gax.grpc.AuthCallable.futureCall(AuthCallable.java:57) at com.google.api.gax.grpc.UnaryCallable.futureCall(UnaryCallable.java:282) at com.google.api.gax.grpc.UnaryCallable.futureCall(UnaryCallable.java:293) at com.google.api.gax.grpc.UnaryCallable.call(UnaryCallable.java:321) at com.google.cloud.vision.v1.ImageAnnotatorClient.batchAnnotateImages(ImageAnnotatorClient.java:201) at com.google.cloud.vision.v1.ImageAnnotatorClient.batchAnnotateImages(ImageAnnotatorClient.java:177) at za.co.thumbtribe.core.googlevision.service.impl.GoogleVisionServiceImpl.processOCR(GoogleVisionServiceImpl.java:55)

这是我的 POM 依赖:
<dependencies>
<!-- Spring -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>4.2.5.RELEASE</version>
  <scope>compile</scope>
</dependency>
<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-vision</artifactId>
    <version>0.20.3-beta</version>
    <exclusions>
    <exclusion>
      <groupId>com.google.auth</groupId>
      <artifactId>google-auth-library-oauth2-http</artifactId>
    </exclusion>
    <exclusion>
      <groupId>com.google.auth</groupId>
      <artifactId>google-auth-library-credentials</artifactId>
    </exclusion>
  <exclusion>
    <groupId>com.google.guava</groupId>
    <artifactId>*</artifactId>
</exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>com.google.auth</groupId>
  <artifactId>google-auth-library-oauth2-http</artifactId>
  <version>0.7.0</version>
 </dependency>
 <dependency>
  <groupId>com.google.auth</groupId>
  <artifactId>google-auth-library-credentials</artifactId>
  <version>0.7.0</version>
</dependency>

</dependencies>

我尝试过排除guava并包含API的多个版本。
所示代码是google vision客户端实现的示例代码。
有什么想法吗?
3个回答

5
MoreExecutors类中缺少的directExecutor方法在guava源代码中被注释为@since 18.0(请参见源代码)。
我猜你的类路径中有一个旧版本的Guava,它出现在版本19之前。
您应该运行mvn dependency:analyze来跟踪罪魁祸首。 您可以使用mvn dependency:analyze | grep guava来过滤输出。
然后,您可以使用以下命令检查导入旧依赖项的包: mvn dependency:tree -Dverbose

1
请看类似问题
基本上,删除guava重复依赖项。
  1. 在eclipse中打开pom.xml。
  2. 切换到“dependence”选项卡。
  3. 在筛选器上,输入“guava”文本。
  4. 如果有多个库版本,请右键单击旧版本并“排除maven工件”。
  5. 运行maven clean。
  6. 运行maven build。
为了最佳内存使用,我建议将此代码的一部分重写为使用StringBuffer或StringBuilder而不是String concat StringBuffer ou StringBuilder

1
你从google-cloud-vision的依赖中排除了guava(因为版本可能过旧),但是你没有将你需要的版本作为依赖添加上去。
<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>22.0</version>
</dependency>

google-auth-library-oauth2-http还包含一个版本的guava:com.google.guava:guava:jar:19.0:compile。如果您将guava版本作为依赖项添加,您可能希望排除其中一个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接