diff --git a/automl/resources/salad.jpg b/automl/resources/salad.jpg new file mode 100644 index 0000000000..a7f960b503 Binary files /dev/null and b/automl/resources/salad.jpg differ diff --git a/automl/test/vision_object_detection_create_dataset.test.js b/automl/test/vision_object_detection_create_dataset.test.js new file mode 100644 index 0000000000..b85c44c049 --- /dev/null +++ b/automl/test/vision_object_detection_create_dataset.test.js @@ -0,0 +1,57 @@ +// 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. + +'use strict'; + +const {assert} = require('chai'); +const {after, describe, it} = require('mocha'); +const {AutoMlClient} = require('@google-cloud/automl').v1; + +const cp = require('child_process'); +const uuid = require('uuid'); + +const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'}); + +const CREATE_DATASET_REGION_TAG = 'vision_object_detection_create_dataset'; +const LOCATION = 'us-central1'; + +describe('Automl Vision Object Detection Create Dataset Test', () => { + const client = new AutoMlClient(); + let datasetId; + + it('should create a dataset', async () => { + const projectId = await client.getProjectId(); + const displayName = `test_${uuid + .v4() + .replace(/-/g, '_') + .substring(0, 26)}`; + + // create + const create_output = await execSync( + `node ${CREATE_DATASET_REGION_TAG}.js ${projectId} ${LOCATION} ${displayName}` + ); + assert.match(create_output, /Dataset id:/); + + datasetId = create_output.split('Dataset id: ')[1].split('\n')[0]; + }); + + after('delete created dataset', async () => { + const projectId = await client.getProjectId(); + const request = { + name: client.datasetPath(projectId, LOCATION, datasetId), + }; + const [operation] = await client.deleteDataset(request); + await operation.promise(); + }); +}); diff --git a/automl/test/vision_object_detection_create_model.test.js b/automl/test/vision_object_detection_create_model.test.js new file mode 100644 index 0000000000..0fdd43b519 --- /dev/null +++ b/automl/test/vision_object_detection_create_model.test.js @@ -0,0 +1,49 @@ +// 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. + +'use strict'; + +const {assert} = require('chai'); +const {after, describe, it} = require('mocha'); +const {AutoMlClient} = require('@google-cloud/automl').v1; + +const cp = require('child_process'); + +const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'}); + +const CREATE_MODEL_REGION_TAG = 'vision_object_detection_create_model'; +const LOCATION = 'us-central1'; +const DATASET_ID = 'IOD4700715673951666176'; + +describe('Automl Vision Object Detection Create Model Test', () => { + const client = new AutoMlClient(); + let operationId; + + it('should create a model', async () => { + const projectId = await client.getProjectId(); + const create_output = execSync( + `node ${CREATE_MODEL_REGION_TAG}.js ${projectId} ${LOCATION} ${DATASET_ID} object_test_create_model` + ); + + assert.match(create_output, /Training started/); + + operationId = create_output + .split('Training operation name: ')[1] + .split('\n')[0]; + }); + + after('cancel model training', async () => { + await client.operationsClient.cancelOperation({name: operationId}); + }); +}); diff --git a/automl/test/vision_object_detection_deploy_model_node_count.test.js b/automl/test/vision_object_detection_deploy_model_node_count.test.js new file mode 100644 index 0000000000..a3203812ee --- /dev/null +++ b/automl/test/vision_object_detection_deploy_model_node_count.test.js @@ -0,0 +1,42 @@ +// 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. + +'use strict'; + +const {assert} = require('chai'); +const {describe, it} = require('mocha'); +const {AutoMlClient} = require('@google-cloud/automl').v1; + +const cp = require('child_process'); + +const DEPLOY_MODEL_REGION_TAG = + 'vision_object_detection_deploy_model_node_count'; +const LOCATION = 'us-central1'; +const MODEL_ID = '0000000000000000000000'; + +describe('Automl Vision Object Detection Deploy Model Test', () => { + const client = new AutoMlClient(); + + it('should deploy a model with a specified node count', async () => { + // As model deployment can take a long time, instead try to deploy a + // nonexistent model and confirm that the model was not found, but other + // elements of the request were valid. + const projectId = await client.getProjectId(); + const args = [DEPLOY_MODEL_REGION_TAG, projectId, LOCATION, MODEL_ID]; + const output = cp.spawnSync('node', args, {encoding: 'utf8'}); + + assert.match(output.stderr, /NOT_FOUND/); + assert.match(output.stderr, /The model does not exist./); + }); +}); diff --git a/automl/test/vision_object_detection_predict.test.js b/automl/test/vision_object_detection_predict.test.js new file mode 100644 index 0000000000..772bb615a3 --- /dev/null +++ b/automl/test/vision_object_detection_predict.test.js @@ -0,0 +1,60 @@ +// 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. + +'use strict'; + +const {assert} = require('chai'); +const {before, describe, it} = require('mocha'); +const {AutoMlClient} = require('@google-cloud/automl').v1; + +const cp = require('child_process'); + +const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'}); + +const MODEL_ID = 'IOD1656537412546854912'; +const PREDICT_REGION_TAG = 'vision_object_detection_predict'; +const LOCATION = 'us-central1'; + +describe('Automl Vision Object Detection Predict Test', () => { + const client = new AutoMlClient(); + + before('should verify the model is deployed', async () => { + const projectId = await client.getProjectId(); + const request = { + name: client.modelPath(projectId, LOCATION, MODEL_ID), + }; + + const [response] = await client.getModel(request); + if (response.deploymentState === 'DEPLOYED') { + const request = { + name: client.modelPath(projectId, LOCATION, MODEL_ID), + }; + + const [operation] = await client.deployModel(request); + + // Wait for operation to complete. + await operation.promise(); + } + }); + + it('should predict', async () => { + const projectId = await client.getProjectId(); + const filePath = 'resources/salad.jpg'; + + const predictOutput = execSync( + `node ${PREDICT_REGION_TAG}.js ${projectId} ${LOCATION} ${MODEL_ID} ${filePath}` + ); + assert.match(predictOutput, /Predicted class name/); + }); +}); diff --git a/automl/vision_object_detection_create_dataset.js b/automl/vision_object_detection_create_dataset.js new file mode 100644 index 0000000000..deca836c1c --- /dev/null +++ b/automl/vision_object_detection_create_dataset.js @@ -0,0 +1,65 @@ +// 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. + +'use strict'; + +function main( + projectId = 'YOUR_PROJECT_ID', + location = 'us-central1', + displayName = 'YOUR_DISPLAY_NAME' +) { + // [START automl_vision_object_detection_create_dataset] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'YOUR_PROJECT_ID'; + // const location = 'us-central1'; + // const displayName = 'YOUR_DISPLAY_NAME'; + + // Imports the Google Cloud AutoML library + const {AutoMlClient} = require(`@google-cloud/automl`).v1; + + // Instantiates a client + const client = new AutoMlClient(); + + async function createDataset() { + // Construct request + const request = { + parent: client.locationPath(projectId, location), + dataset: { + displayName: displayName, + imageObjectDetectionDatasetMetadata: {}, + }, + }; + + // Create dataset + const [operation] = await client.createDataset(request); + + // Wait for operation to complete. + const [response] = await operation.promise(); + + console.log(`Dataset name: ${response.name}`); + console.log(` + Dataset id: ${ + response.name + .split('/') + [response.name.split('/').length - 1].split('\n')[0] + }`); + } + + createDataset(); + // [END automl_vision_object_detection_create_dataset] +} + +main(...process.argv.slice(2)); diff --git a/automl/vision_object_detection_create_model.js b/automl/vision_object_detection_create_model.js new file mode 100644 index 0000000000..233600b6da --- /dev/null +++ b/automl/vision_object_detection_create_model.js @@ -0,0 +1,59 @@ +// 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. + +'use strict'; + +function main( + projectId = 'YOUR_PROJECT_ID', + location = 'us-central1', + datasetId = 'YOUR_DATASET_ID', + displayName = 'YOUR_DISPLAY_NAME' +) { + // [START automl_vision_object_detection_create_model] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'YOUR_PROJECT_ID'; + // const location = 'us-central1'; + // const dataset_id = 'YOUR_DATASET_ID'; + // const displayName = 'YOUR_DISPLAY_NAME'; + + // Imports the Google Cloud AutoML library + const {AutoMlClient} = require(`@google-cloud/automl`).v1; + + // Instantiates a client + const client = new AutoMlClient(); + + async function createModel() { + // Construct request + const request = { + parent: client.locationPath(projectId, location), + model: { + displayName: displayName, + datasetId: datasetId, + imageObjectDetectionModelMetadata: {}, + }, + }; + + // Don't wait for the LRO + const [operation] = await client.createModel(request); + console.log(`Training started... ${operation}`); + console.log(`Training operation name: ${operation.name}`); + } + + createModel(); + // [END automl_vision_object_detection_create_model] +} + +main(...process.argv.slice(2)); diff --git a/automl/vision_object_detection_deploy_model_node_count.js b/automl/vision_object_detection_deploy_model_node_count.js new file mode 100644 index 0000000000..9a1be8eef4 --- /dev/null +++ b/automl/vision_object_detection_deploy_model_node_count.js @@ -0,0 +1,56 @@ +// 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. + +'use strict'; + +function main( + projectId = 'YOUR_PROJECT_ID', + location = 'us-central1', + modelId = 'YOUR_MODEL_ID' +) { + // [START automl_vision_object_detection_deploy_model_node_count] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'YOUR_PROJECT_ID'; + // const location = 'us-central1'; + // const modelId = 'YOUR_MODEL_ID'; + + // Imports the Google Cloud AutoML library + const {AutoMlClient} = require(`@google-cloud/automl`).v1; + + // Instantiates a client + const client = new AutoMlClient(); + + async function deployModelWithNodeCount() { + // Construct request + const request = { + name: client.modelPath(projectId, location, modelId), + imageObjectDetectionModelDeploymentMetadata: { + nodeCount: 2, + }, + }; + + const [operation] = await client.deployModel(request); + + // Wait for operation to complete. + const [response] = await operation.promise(); + console.log(`Model deployment finished. ${response}`); + } + + deployModelWithNodeCount(); + // [END automl_vision_object_detection_deploy_model_node_count] +} + +main(...process.argv.slice(2)); diff --git a/automl/vision_object_detection_predict.js b/automl/vision_object_detection_predict.js new file mode 100644 index 0000000000..c415c18520 --- /dev/null +++ b/automl/vision_object_detection_predict.js @@ -0,0 +1,77 @@ +// 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. + +'use strict'; + +function main( + projectId = 'YOUR_PROJECT_ID', + location = 'us-central1', + modelId = 'YOUR_MODEL_ID', + filePath = 'path_to_local_file.jpg' +) { + // [START automl_vision_object_detection_predict] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'YOUR_PROJECT_ID'; + // const location = 'us-central1'; + // const modelId = 'YOUR_MODEL_ID'; + // const filePath = 'path_to_local_file.jpg'; + + // Imports the Google Cloud AutoML library + const {PredictionServiceClient} = require(`@google-cloud/automl`).v1; + const fs = require(`fs`); + + // Instantiates a client + const client = new PredictionServiceClient(); + + // Read the file content for translation. + const content = fs.readFileSync(filePath); + + async function predict() { + // Construct request + // params is additional domain-specific parameters. + // score_threshold is used to filter the result + const request = { + name: client.modelPath(projectId, location, modelId), + payload: { + image: { + imageBytes: content, + }, + }, + params: { + score_threshold: '0.8', + }, + }; + + const [response] = await client.predict(request); + + for (const annotationPayload of response.payload) { + console.log(`Predicted class name: ${annotationPayload.displayName}`); + console.log( + `Predicted class score: ${annotationPayload.imageObjectDetection.score}` + ); + console.log(`Normalized vertices:`); + for (const vertex of annotationPayload.imageObjectDetection.boundingBox + .normalizedVertices) { + console.log(`\tX: ${vertex.x}, Y: ${vertex.y}`); + } + } + } + + predict(); + // [END automl_vision_object_detection_predict] +} + +main(...process.argv.slice(2));