diff --git a/video/beta/README.md b/video/beta/README.md index a77add90782..3615bf35a56 100644 --- a/video/beta/README.md +++ b/video/beta/README.md @@ -36,15 +36,6 @@ export GOOGLE_APPLICATION_CREDENTIALS=/path/to/your-project-credentials.json After you have authorized, you can analyze videos. -Detect Faces' Bounding Boxes -``` -mvn exec:java -DDetect -Dexec.args="faces-bounding-boxes gs://YOUR_BUCKET/YOUR_VIDEO.mp4" -``` - -Detect Faces' Emotions -``` -mvn exec:java -DDetect -Dexec.args="faces-emotions gs://YOUR_BUCKET/YOUR_VIDEO.mp4" -``` Video Transcription ``` diff --git a/video/beta/pom.xml b/video/beta/pom.xml index ae129963c7c..683f378143a 100644 --- a/video/beta/pom.xml +++ b/video/beta/pom.xml @@ -40,7 +40,7 @@ com.google.cloud google-cloud-video-intelligence - 0.41.0-beta + 0.43.0-beta diff --git a/video/beta/src/main/java/com/example/video/Detect.java b/video/beta/src/main/java/com/example/video/Detect.java index 25512b7466e..5b77d5db9ea 100644 --- a/video/beta/src/main/java/com/example/video/Detect.java +++ b/video/beta/src/main/java/com/example/video/Detect.java @@ -20,13 +20,7 @@ import com.google.cloud.videointelligence.v1p1beta1.AnnotateVideoProgress; import com.google.cloud.videointelligence.v1p1beta1.AnnotateVideoRequest; import com.google.cloud.videointelligence.v1p1beta1.AnnotateVideoResponse; -import com.google.cloud.videointelligence.v1p1beta1.EmotionAttribute; -import com.google.cloud.videointelligence.v1p1beta1.FaceConfig; -import com.google.cloud.videointelligence.v1p1beta1.FaceDetectionAnnotation; -import com.google.cloud.videointelligence.v1p1beta1.FaceDetectionFrame; -import com.google.cloud.videointelligence.v1p1beta1.FaceSegment; import com.google.cloud.videointelligence.v1p1beta1.Feature; -import com.google.cloud.videointelligence.v1p1beta1.NormalizedBoundingBox; import com.google.cloud.videointelligence.v1p1beta1.SpeechRecognitionAlternative; import com.google.cloud.videointelligence.v1p1beta1.SpeechTranscription; import com.google.cloud.videointelligence.v1p1beta1.SpeechTranscriptionConfig; @@ -39,7 +33,7 @@ public class Detect { /** - * Detects face's bounding boxes, emotions, and video transcription using the Video Intelligence + * Detects video transcription using the Video Intelligence * API * @param args specifies features to detect and the path to the video on Google Cloud Storage. */ @@ -64,7 +58,7 @@ public static void argsHelper(String[] args) throws Exception { System.out.printf( "\tjava %s \"\" \"\"\n" + "Commands:\n" - + "\tfaces-bounding-boxes | faces-emotions | speech-transcription\n" + + "\tspeech-transcription\n" + "Path:\n\tA URI for a Cloud Storage resource (gs://...)\n" + "Examples: ", Detect.class.getCanonicalName()); @@ -73,175 +67,11 @@ public static void argsHelper(String[] args) throws Exception { String command = args[0]; String path = args.length > 1 ? args[1] : ""; - if (command.equals("faces-bounding-boxes")) { - analyzeFacesBoundingBoxes(path); - } - if (command.equals("faces-emotions")) { - analyzeFaceEmotions(path); - } if (command.equals("speech-transcription")) { speechTranscription(path); } } - - // [START video_face_bounding_boxes] - /** - * Detects faces' bounding boxes on the video at the provided Cloud Storage path. - * - * @param gcsUri the path to the video file to analyze. - */ - public static void analyzeFacesBoundingBoxes(String gcsUri) throws Exception { - // Instantiate a com.google.cloud.videointelligence.v1p1beta1.VideoIntelligenceServiceClient - try (VideoIntelligenceServiceClient client = VideoIntelligenceServiceClient.create()) { - // Set the configuration to include bounding boxes - FaceConfig config = FaceConfig.newBuilder() - .setIncludeBoundingBoxes(true) - .build(); - - // Set the video context with the above configuration - VideoContext context = VideoContext.newBuilder() - .setFaceDetectionConfig(config) - .build(); - - // Create the request - AnnotateVideoRequest request = AnnotateVideoRequest.newBuilder() - .setInputUri(gcsUri) - .addFeatures(Feature.FACE_DETECTION) - .setVideoContext(context) - .build(); - - // asynchronously perform facial analysis on videos - OperationFuture response = - client.annotateVideoAsync(request); - - System.out.println("Waiting for operation to complete..."); - boolean faceFound = false; - // Display the results - for (VideoAnnotationResults results : response.get(900, TimeUnit.SECONDS) - .getAnnotationResultsList()) { - int faceCount = 0; - // Display the results for each face - for (FaceDetectionAnnotation faceAnnotation : results.getFaceDetectionAnnotationsList()) { - faceFound = true; - System.out.println("\nFace: " + ++faceCount); - // Each FaceDetectionAnnotation has only one segment. - for (FaceSegment segment : faceAnnotation.getSegmentsList()) { - double startTime = segment.getSegment().getStartTimeOffset().getSeconds() - + segment.getSegment().getStartTimeOffset().getNanos() / 1e9; - double endTime = segment.getSegment().getEndTimeOffset().getSeconds() - + segment.getSegment().getEndTimeOffset().getNanos() / 1e9; - System.out.printf("Segment location: %.3fs to %.3f\n", startTime, endTime); - } - // There are typically many frames for each face, - try { - // Here we process only the first frame. - if (faceAnnotation.getFramesCount() > 0) { - FaceDetectionFrame frame = faceAnnotation.getFrames(0); // get the first frame - double timeOffset = frame.getTimeOffset().getSeconds() - + frame.getTimeOffset().getNanos() / 1e9; - System.out.printf("First frame time offset: %.3fs\n", timeOffset); - // print info on the first normalized bounding box - NormalizedBoundingBox box = frame.getAttributes(0).getNormalizedBoundingBox(); - System.out.printf("\tLeft: %.3f\n", box.getLeft()); - System.out.printf("\tTop: %.3f\n", box.getTop()); - System.out.printf("\tBottom: %.3f\n", box.getBottom()); - System.out.printf("\tRight: %.3f\n", box.getRight()); - } else { - System.out.println("No frames found in annotation"); - } - } catch (IndexOutOfBoundsException ioe) { - System.out.println("Could not retrieve frame: " + ioe.getMessage()); - } - } - } - - if (!faceFound) { - System.out.println("No faces detected in " + gcsUri); - } - } - } - // [END video_face_bounding_boxes] - - // [START video_face_emotions] - /** - * Analyze faces' emotions over frames on the video at the provided Cloud Storage path. - * - * @param gcsUri the path to the video file to analyze. - */ - public static void analyzeFaceEmotions(String gcsUri) throws Exception { - // Instantiate a com.google.cloud.videointelligence.v1p1beta1.VideoIntelligenceServiceClient - try (VideoIntelligenceServiceClient client = VideoIntelligenceServiceClient.create()) { - // Set the configuration to include bounding boxes - FaceConfig config = FaceConfig.newBuilder() - .setIncludeEmotions(true) - .build(); - - // Set the video context with the above configuration - VideoContext context = VideoContext.newBuilder() - .setFaceDetectionConfig(config) - .build(); - - // Create the request - AnnotateVideoRequest request = AnnotateVideoRequest.newBuilder() - .setInputUri(gcsUri) - .addFeatures(Feature.FACE_DETECTION) - .setVideoContext(context) - .build(); - - // asynchronously perform facial analysis on videos - OperationFuture response = - client.annotateVideoAsync(request); - - System.out.println("Waiting for operation to complete..."); - boolean faceFound = false; - // Display the results - for (VideoAnnotationResults results : response.get(600, TimeUnit.SECONDS) - .getAnnotationResultsList()) { - int faceCount = 0; - // Display the results for each face - for (FaceDetectionAnnotation faceAnnotation : results.getFaceDetectionAnnotationsList()) { - faceFound = true; - System.out.println("\nFace: " + ++faceCount); - // Each FaceDetectionAnnotation has only one segment. - for (FaceSegment segment : faceAnnotation.getSegmentsList()) { - double startTime = segment.getSegment().getStartTimeOffset().getSeconds() - + segment.getSegment().getStartTimeOffset().getNanos() / 1e9; - double endTime = segment.getSegment().getEndTimeOffset().getSeconds() - + segment.getSegment().getEndTimeOffset().getNanos() / 1e9; - System.out.printf("Segment location: %.3fs to %.3f\n", startTime, endTime); - } - - try { - // Print each frame's highest emotion - for (FaceDetectionFrame frame : faceAnnotation.getFramesList()) { - double timeOffset = frame.getTimeOffset().getSeconds() - + frame.getTimeOffset().getNanos() / 1e9; - float highestScore = 0.0f; - String emotion = ""; - // Get the highest scoring emotion for the current frame - for (EmotionAttribute emotionAttribute : frame.getAttributes(0).getEmotionsList()) { - if (emotionAttribute.getScore() > highestScore) { - highestScore = emotionAttribute.getScore(); - emotion = emotionAttribute.getEmotion().name(); - } - } - System.out.printf("\t%4.2fs: %14s %4.3f\n", timeOffset, emotion, highestScore); - } - - } catch (IndexOutOfBoundsException ioe) { - System.out.println("Could not retrieve frame: " + ioe.getMessage()); - } - } - } - - if (!faceFound) { - System.out.println("No faces detected in " + gcsUri); - } - } - } - // [END video_face_emotions] - // [START video_speech_transcription] /** * Transcribe speech from a video stored on GCS. @@ -268,7 +98,7 @@ public static void speechTranscription(String gcsUri) throws Exception { .setVideoContext(context) .build(); - // asynchronously perform facial analysis on videos + // asynchronously perform speech transcription on videos OperationFuture response = client.annotateVideoAsync(request); diff --git a/video/beta/src/test/java/com/example/video/DetectIT.java b/video/beta/src/test/java/com/example/video/DetectIT.java index d6d78e5adc5..e4de93f34b0 100644 --- a/video/beta/src/test/java/com/example/video/DetectIT.java +++ b/video/beta/src/test/java/com/example/video/DetectIT.java @@ -34,7 +34,7 @@ public class DetectIT { private ByteArrayOutputStream bout; private PrintStream out; - static final String FACES_FILE_LOCATION = + static final String FILE_LOCATION = "gs://java-docs-samples-testing/video/googlework_short.mp4"; @Before @@ -49,27 +49,9 @@ public void tearDown() { System.setOut(null); } - @Test - public void testFacesBoundingBoxes() throws Exception { - String[] args = {"faces-bounding-boxes", FACES_FILE_LOCATION}; - Detect.argsHelper(args); - String got = bout.toString(); - - assertThat(got).contains("Top:"); - } - - @Test - public void testFacesEmotions() throws Exception { - String[] args = {"faces-emotions", FACES_FILE_LOCATION}; - Detect.argsHelper(args); - String got = bout.toString(); - - assertThat(got).contains("CONCENTRATION"); - } - @Test public void testSpeechTranscription() throws Exception { - String[] args = {"speech-transcription", FACES_FILE_LOCATION}; + String[] args = {"speech-transcription", FILE_LOCATION}; Detect.argsHelper(args); String got = bout.toString();