Skip to content

Commit

Permalink
Update samples due to changes (#1083)
Browse files Browse the repository at this point in the history
  • Loading branch information
nnegrey committed Apr 6, 2018
1 parent c5d7c11 commit beb762b
Show file tree
Hide file tree
Showing 4 changed files with 6 additions and 203 deletions.
9 changes: 0 additions & 9 deletions video/beta/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
```
Expand Down
2 changes: 1 addition & 1 deletion video/beta/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-video-intelligence</artifactId>
<version>0.41.0-beta</version>
<version>0.43.0-beta</version>
</dependency>
<!-- [END dependencies] -->

Expand Down
176 changes: 3 additions & 173 deletions video/beta/src/main/java/com/example/video/Detect.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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.
*/
Expand All @@ -64,7 +58,7 @@ public static void argsHelper(String[] args) throws Exception {
System.out.printf(
"\tjava %s \"<command>\" \"<path-to-video>\"\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());
Expand All @@ -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<AnnotateVideoResponse, AnnotateVideoProgress> 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<AnnotateVideoResponse, AnnotateVideoProgress> 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.
Expand All @@ -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<AnnotateVideoResponse, AnnotateVideoProgress> response =
client.annotateVideoAsync(request);

Expand Down
22 changes: 2 additions & 20 deletions video/beta/src/test/java/com/example/video/DetectIT.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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();

Expand Down

0 comments on commit beb762b

Please sign in to comment.