From 56c1870d056887e721fcc052a9aee0ac779a778e Mon Sep 17 00:00:00 2001 From: nnegrey Date: Tue, 3 Mar 2020 10:20:05 -0700 Subject: [PATCH 1/4] vision: move samples out of branch and add clarifying comments --- .../vision/AsyncBatchAnnotateImages.java | 87 ++++++++++++++++++ .../vision/AsyncBatchAnnotateImagesTest.java | 90 +++++++++++++++++++ 2 files changed, 177 insertions(+) create mode 100644 vision/cloud-client/src/main/java/com/example/vision/AsyncBatchAnnotateImages.java create mode 100644 vision/cloud-client/src/test/java/com/example/vision/AsyncBatchAnnotateImagesTest.java diff --git a/vision/cloud-client/src/main/java/com/example/vision/AsyncBatchAnnotateImages.java b/vision/cloud-client/src/main/java/com/example/vision/AsyncBatchAnnotateImages.java new file mode 100644 index 00000000000..1117be27e47 --- /dev/null +++ b/vision/cloud-client/src/main/java/com/example/vision/AsyncBatchAnnotateImages.java @@ -0,0 +1,87 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.vision; + +// [START vision_async_batch_annotate_images] +import com.google.cloud.vision.v1.AnnotateImageRequest; +import com.google.cloud.vision.v1.AsyncBatchAnnotateImagesRequest; +import com.google.cloud.vision.v1.AsyncBatchAnnotateImagesResponse; +import com.google.cloud.vision.v1.Feature; +import com.google.cloud.vision.v1.GcsDestination; +import com.google.cloud.vision.v1.Image; +import com.google.cloud.vision.v1.ImageAnnotatorClient; +import com.google.cloud.vision.v1.ImageSource; +import com.google.cloud.vision.v1.OutputConfig; + +import java.io.IOException; +import java.util.concurrent.ExecutionException; + +public class AsyncBatchAnnotateImages { + + public static void asyncBatchAnnotateImages() + throws InterruptedException, ExecutionException, IOException { + String inputImageUri = "gs://cloud-samples-data/vision/label/wakeupcat.jpg"; + String outputUri = "gs://YOUR_BUCKET_ID/path/to/save/results/"; + asyncBatchAnnotateImages(inputImageUri, outputUri); + } + + public static void asyncBatchAnnotateImages(String inputImageUri, String outputUri) + throws IOException, ExecutionException, InterruptedException { + // Initialize client that will be used to send requests. This client only needs to be created + // once, and can be reused for multiple requests. After completing all of your requests, call + // the "close" method on the client to safely clean up any remaining background resources. + try (ImageAnnotatorClient imageAnnotatorClient = ImageAnnotatorClient.create()) { + + // You can send multiple images to be annotated, this sample demonstrates how to do this with + // one image. If you want to use multiple images, you have to create a `AnnotateImageRequest` + // object for each image that you want annotated. + // First specify where the vision api can find the image + ImageSource source = ImageSource.newBuilder().setImageUri(inputImageUri).build(); + Image image = Image.newBuilder().setSource(source).build(); + // Set the type of annotation you want to perform on the image + Feature feature = Feature.newBuilder().setType(Feature.Type.LABEL_DETECTION).build(); + // Build the request object for that one image. Note: for additional images you have to create + // additional `AnnotateImageRequest` objects and store them in a list to be used below. + AnnotateImageRequest imageRequest = + AnnotateImageRequest.newBuilder().setImage(image).addFeatures(feature).build(); + + // Set where to store the results for the images that will be annotated. + GcsDestination gcsDestination = GcsDestination.newBuilder().setUri(outputUri).build(); + OutputConfig outputConfig = + OutputConfig.newBuilder() + .setGcsDestination(gcsDestination) + .setBatchSize(2) // The max number of responses to output in each JSON file + .build(); + + // Add each `AnnotateImageRequest` object to the batch request and add the output config. + AsyncBatchAnnotateImagesRequest request = + AsyncBatchAnnotateImagesRequest.newBuilder() + .addRequests(imageRequest) + .setOutputConfig(outputConfig) + .build(); + + // Make the asynchronous batch request. + AsyncBatchAnnotateImagesResponse response = + imageAnnotatorClient.asyncBatchAnnotateImagesAsync(request).get(); + + // The output is written to GCS with the provided output_uri as prefix + String gcsOutputUri = response.getOutputConfig().getGcsDestination().getUri(); + System.out.printf("Output written to GCS with prefix: %s\n", gcsOutputUri); + } + } +} +// [END vision_async_batch_annotate_images] diff --git a/vision/cloud-client/src/test/java/com/example/vision/AsyncBatchAnnotateImagesTest.java b/vision/cloud-client/src/test/java/com/example/vision/AsyncBatchAnnotateImagesTest.java new file mode 100644 index 00000000000..d4b710bff66 --- /dev/null +++ b/vision/cloud-client/src/test/java/com/example/vision/AsyncBatchAnnotateImagesTest.java @@ -0,0 +1,90 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.vision; + +import static com.google.common.truth.Truth.assertThat; +import static junit.framework.TestCase.assertNotNull; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.util.UUID; +import java.util.concurrent.ExecutionException; + +import com.google.api.gax.paging.Page; +import com.google.cloud.storage.Blob; +import com.google.cloud.storage.Storage; +import com.google.cloud.storage.StorageOptions; +import org.junit.After; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +@SuppressWarnings("checkstyle:abbreviationaswordinname") +public class AsyncBatchAnnotateImagesTest { + private static final String PROJECT_ID = System.getenv("GOOGLE_CLOUD_PROJECT"); + private static final String INPUT_URI = "gs://cloud-samples-data/vision/label/wakeupcat.jpg"; + private static final String PREFIX = String.format("vision/%s/", UUID.randomUUID().toString()); + private static final String OUTPUT_URI = String.format("gs://%s/%s", PROJECT_ID, PREFIX); + + private ByteArrayOutputStream bout; + private PrintStream out; + + private static void requireEnvVar(String varName) { + assertNotNull( + System.getenv(varName), + "Environment variable '%s' is required to perform these tests.".format(varName)); + } + + @BeforeClass + public static void checkRequirements() { + requireEnvVar("GOOGLE_CLOUD_PROJECT"); + } + + @Before + public void setUp() { + bout = new ByteArrayOutputStream(); + out = new PrintStream(bout); + System.setOut(out); + } + + @After + public void tearDown() { + System.setOut(null); + + Storage storage = StorageOptions.getDefaultInstance().getService(); + + Page blobs = storage.list(PROJECT_ID, Storage.BlobListOption.currentDirectory(), + Storage.BlobListOption.prefix(PREFIX)); + for (Blob blob : blobs.iterateAll()) { + blob.delete(); + } + } + + @Test + public void testSetEndpoint() throws IOException, ExecutionException, InterruptedException { + // Act + AsyncBatchAnnotateImages.asyncBatchAnnotateImages(INPUT_URI, OUTPUT_URI); + + // Assert + String got = bout.toString(); + assertThat(got).contains("Output written to GCS with prefix"); + } +} From 6e3c5aba2ffc6fb06b145c6d19b9999de2c68de0 Mon Sep 17 00:00:00 2001 From: Noah Negrey Date: Tue, 3 Mar 2020 10:46:05 -0700 Subject: [PATCH 2/4] Update AsyncBatchAnnotateImagesTest.java --- .../java/com/example/vision/AsyncBatchAnnotateImagesTest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/vision/cloud-client/src/test/java/com/example/vision/AsyncBatchAnnotateImagesTest.java b/vision/cloud-client/src/test/java/com/example/vision/AsyncBatchAnnotateImagesTest.java index d4b710bff66..6be82073534 100644 --- a/vision/cloud-client/src/test/java/com/example/vision/AsyncBatchAnnotateImagesTest.java +++ b/vision/cloud-client/src/test/java/com/example/vision/AsyncBatchAnnotateImagesTest.java @@ -80,10 +80,7 @@ public void tearDown() { @Test public void testSetEndpoint() throws IOException, ExecutionException, InterruptedException { - // Act AsyncBatchAnnotateImages.asyncBatchAnnotateImages(INPUT_URI, OUTPUT_URI); - - // Assert String got = bout.toString(); assertThat(got).contains("Output written to GCS with prefix"); } From 99fa5f743e3bde65f7989cfcfe399735408fd606 Mon Sep 17 00:00:00 2001 From: Noah Negrey Date: Tue, 3 Mar 2020 11:02:03 -0700 Subject: [PATCH 3/4] Update AsyncBatchAnnotateImages.java --- .../main/java/com/example/vision/AsyncBatchAnnotateImages.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vision/cloud-client/src/main/java/com/example/vision/AsyncBatchAnnotateImages.java b/vision/cloud-client/src/main/java/com/example/vision/AsyncBatchAnnotateImages.java index 1117be27e47..bbe76f553fd 100644 --- a/vision/cloud-client/src/main/java/com/example/vision/AsyncBatchAnnotateImages.java +++ b/vision/cloud-client/src/main/java/com/example/vision/AsyncBatchAnnotateImages.java @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * https://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, From caac0b4498372ad3709b00dfe5e653df006a6bb1 Mon Sep 17 00:00:00 2001 From: nnegrey Date: Tue, 3 Mar 2020 11:13:49 -0700 Subject: [PATCH 4/4] lint and add link --- .../com/example/vision/AsyncBatchAnnotateImages.java | 3 +++ .../com/example/vision/AsyncBatchAnnotateImagesTest.java | 9 +++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/vision/cloud-client/src/main/java/com/example/vision/AsyncBatchAnnotateImages.java b/vision/cloud-client/src/main/java/com/example/vision/AsyncBatchAnnotateImages.java index bbe76f553fd..4ebb999388d 100644 --- a/vision/cloud-client/src/main/java/com/example/vision/AsyncBatchAnnotateImages.java +++ b/vision/cloud-client/src/main/java/com/example/vision/AsyncBatchAnnotateImages.java @@ -52,8 +52,11 @@ public static void asyncBatchAnnotateImages(String inputImageUri, String outputU // First specify where the vision api can find the image ImageSource source = ImageSource.newBuilder().setImageUri(inputImageUri).build(); Image image = Image.newBuilder().setSource(source).build(); + // Set the type of annotation you want to perform on the image + // https://cloud.google.com/vision/docs/reference/rpc/google.cloud.vision.v1#google.cloud.vision.v1.Feature.Type Feature feature = Feature.newBuilder().setType(Feature.Type.LABEL_DETECTION).build(); + // Build the request object for that one image. Note: for additional images you have to create // additional `AnnotateImageRequest` objects and store them in a list to be used below. AnnotateImageRequest imageRequest = diff --git a/vision/cloud-client/src/test/java/com/example/vision/AsyncBatchAnnotateImagesTest.java b/vision/cloud-client/src/test/java/com/example/vision/AsyncBatchAnnotateImagesTest.java index 6be82073534..b770d3fb57b 100644 --- a/vision/cloud-client/src/test/java/com/example/vision/AsyncBatchAnnotateImagesTest.java +++ b/vision/cloud-client/src/test/java/com/example/vision/AsyncBatchAnnotateImagesTest.java @@ -19,16 +19,17 @@ import static com.google.common.truth.Truth.assertThat; import static junit.framework.TestCase.assertNotNull; +import com.google.api.gax.paging.Page; +import com.google.cloud.storage.Blob; +import com.google.cloud.storage.Storage; +import com.google.cloud.storage.StorageOptions; + import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; import java.util.UUID; import java.util.concurrent.ExecutionException; -import com.google.api.gax.paging.Page; -import com.google.cloud.storage.Blob; -import com.google.cloud.storage.Storage; -import com.google.cloud.storage.StorageOptions; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass;