Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Google Vision Batch Annotate Images with Java Client Library

I am getting an exception when trying to annotate images via Google Vision using the provided java client google vision.

specifically this code where the batch client.batchAnnotateImages occurs:

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();
       }
 }

I am being presented with the following Stack Trace / Error:

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)

Here are my POM Dependencies :

<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>

I have tried excluding guava and including multiple versions of the API.

The code shown is the sample code from the google vision client implementation.

any ideas ?

like image 858
Johann Combrink Avatar asked Jul 25 '17 14:07

Johann Combrink


2 Answers

The missing method directExecutor in MoreExecutors class is annotated @since 18.0 in the sources of guava (See source).

I guess you have in your classpath an older version of Guava that appears before the version 19.

You should run mvn dependency:analyze to track down the culprit. You may mvn dependency:analyze | grep guava to filter the output.

Then you can check which package imports the old dependency with :

mvn dependency:tree -Dverbose

like image 145
Xvolks Avatar answered Nov 15 '22 18:11

Xvolks


Take a look on similar question

Basicaly, remove guava duplicate dependecy.

  1. Open pom.xml on eclipse.
  2. change to "dependence" tab.
  3. on filter, text "guava".
  4. if there is more than one lib version, right click on old and "exclude maven artifact".
  5. run maven clean.
  6. run maven build.

For best memory use, i suggest rewrite part of this code to use StringBuffer ou StringBuilder instead of String concat StringBuffer ou StringBuilder.

like image 26
Auston Avatar answered Nov 15 '22 17:11

Auston