Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update samples due to changes #1083

Merged
merged 1 commit into from
Apr 6, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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