Skip to content

Commit

Permalink
feat: add streaming automl classification samples (#284)
Browse files Browse the repository at this point in the history
* Add streaming automl + test

* Make the thing work, with lots of debugs

* passing tests, Remove debug statements + lint

* Fix the license quotes

* Revert license quotes

* Remove commas from license

* Remove commas take 2

* fix typo

* Fix header

* Update model

* Change video codec, add comment
  • Loading branch information
leahecole authored and ahrarmonsur committed Nov 17, 2022
1 parent 3f2926b commit f1df8cf
Show file tree
Hide file tree
Showing 5 changed files with 133 additions and 3 deletions.
95 changes: 95 additions & 0 deletions video-intelligence/analyze-streaming-automl-classification.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
/**
* Copyright 2019 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.
*/

'use strict';

async function main(
path = 'YOUR_LOCAL_FILE',
projectId = 'YOUR_GCP_PROJECT',
modelId = 'YOUR_AUTOML_MODELID'
) {
// [START video_streaming_automl_classification_beta]
/**
* TODO(developer): Uncomment these variables before running the sample.
*/
// const path = 'Local file to analyze, e.g. ./my-file.mp4';
// const modelId = 'autoMl model'
// const projectId = 'Your GCP Project'

const {
StreamingVideoIntelligenceServiceClient,
} = require('@google-cloud/video-intelligence').v1p3beta1;
const fs = require('fs');

// Instantiates a client
const client = new StreamingVideoIntelligenceServiceClient();

// Streaming configuration
const modelPath = `projects/${projectId}/locations/us-central1/models/${modelId}`;
const configRequest = {
videoConfig: {
feature: 'STREAMING_AUTOML_CLASSIFICATION',
automlClassificationConfig: {
modelName: modelPath,
},
},
};

const readStream = fs.createReadStream(path, {
highWaterMark: 5 * 1024 * 1024, //chunk size set to 5MB (recommended less than 10MB)
encoding: 'base64',
});
//Load file content
// Note: Input videos must have supported video codecs. See
// https://cloud.google.com/video-intelligence/docs/streaming/streaming#supported_video_codecs
// for more details.
const chunks = [];
readStream
.on('data', chunk => {
const request = {
inputContent: chunk.toString(),
};
chunks.push(request);
})
.on('close', function() {
// configRequest should be the first in the stream of requests
stream.write(configRequest);
for (let i = 0; i < chunks.length; i++) {
stream.write(chunks[i]);
}
stream.end();
});

const stream = client
.streamingAnnotateVideo()
.on('data', response => {
//Gets annotations for video
const annotations = response.annotationResults;
const labels = annotations.labelAnnotations;
labels.forEach(label => {
console.log(
`Label ${label.entity.description} occurs at: ${label.frames[0]
.timeOffset.seconds || 0}` +
`.${(label.frames[0].timeOffset.nanos / 1e6).toFixed(0)}s`
);
console.log(` Confidence: ${label.frames[0].confidence}`);
});
})
.on('error', response => {
console.error(response);
});
// [END video_streaming_automl_classification_beta]
}
main(...process.argv.slice(2)).catch(console.error());
2 changes: 1 addition & 1 deletion video-intelligence/analyze-streaming-labels.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Copyright 2019, Google, LLC
* Copyright 2019 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
Expand Down
Binary file modified video-intelligence/resources/googlework_short.mp4
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Copyright 2019, Google, LLC.
* Copyright 2019 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
Expand All @@ -20,7 +20,7 @@ const {assert} = require('chai');
const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'});

const cmd = `node analyze-streaming-annotation-to-storage.js`;
const project = process.env.GLCOUD_PROJECT;
const project = process.env.GCLOUD_PROJECT;
const file = 'resources/cat.mp4';
const outputUri = 'gs://' + project + '/VIDEO_STREAMING_OUTPUT';

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/**
* Copyright 2019 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.
*/

'use strict';

const cp = require('child_process');
const {assert} = require('chai');

const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'});

const cmd = `node analyze-streaming-automl-classification.js`;
const modelId = `VCN3094808572840640512`;
const project = process.env.GCLOUD_PROJECT;
const file = 'resources/cat.mp4';

describe('streaming automl classification', () => {
it('should classify the action in the streaming video', async () => {
const output = execSync(`${cmd} ${file} ${project} ${modelId}`);
assert.match(output, /brush_hair/);
assert.match(output, /cartwheel/);
assert.match(output, /Confidence: \d+\.\d+/);
});
});

0 comments on commit f1df8cf

Please sign in to comment.