動画にアノテーションを付ける

モデルの作成(トレーニング)が済んだら、batchPredict メソッドを使用して 1 つ以上の動画の予測をリクエストできます。動画のリストを含む CSV ファイルを batchPredict メソッドに指定します。batchPredict メソッドは、モデルが予測する動画の主要なオブジェクトに基づいて動画にラベルを適用します。

カスタムモデルの最大寿命は 2 年です。その後もコンテンツを分類し続けるには、新しいモデルを作成してトレーニングする必要があります。

curl の使用

このトピックの curl のサンプルを簡単に実行できるようにするには、次の環境変数を設定します。project-id は GCP プロジェクトの名前に置き換えます。

export PROJECT_ID="project-id"

予測の例

AutoML Video からの予測のバッチをリクエストするには、アノテーションを付ける動画の Google Cloud Storage パスをリストした CSV ファイルを作成します。開始時間と終了時間を指定して、動画のセグメントにのみアノテーションを付けるよう AutoML Video に指示することもできます。開始時間はゼロ以上で、終了時間より前にする必要があります。終了時間は開始時間より後で、動画の長さ以下にする必要があります。inf を使用して動画の終わりを示すこともできます。

gs://my-videos-vcm/short_video_1.avi,0.0,5.566667
gs://my-videos-vcm/car_chase.avi,0.0,3.933333
gs://my-videos-vcm/northwest_wildlife_01.avi,0.0,3.7
gs://my-videos-vcm/northwest_wildlife_02.avi,0.0,1.666667
gs://my-videos-vcm/motorcycles_and_cars.avi,0.0,2.633333
gs://my-videos-vcm/drying_paint.avi,0.0,inf

AutoML Video がモデルによる予測の結果を書き込む出力ファイルのパスも指定する必要があります。このパスは、書き込み権限がある Google Cloud Storage バケットとオブジェクトである必要があります。

各動画の長さは 3 時間までで、最大ファイルサイズは 50 GB です。AutoML Video では、12 時間の処理時間で約 100 時間分の動画の予測を生成できます。

必要に応じて、動画の予測をリクエストするときに params セクションで次のオプションを設定できます。これらのいずれのオプションも指定しなかった場合は、デフォルトのスコアしきい値が適用され、segment-classification が使用されます。

  • score_threshold - 0.0 から 1.0 までの値。モデルによって動画を予測するとき、ここで指定した信頼スコア以上の結果のみが生成されます。デフォルトは 0.5 です。

  • segment-classification - セグメント レベルの分類を有効にするには、true に設定します。この場合、AutoML Video から、リクエストの構成で指定した動画のセグメント全体のラベルとその信頼スコアが返されます。デフォルトは true です。

  • shot-classification - ショットレベルの分類を有効にするには、true に設定します。この場合、AutoML Video により、リクエストの構成で指定した動画のセグメント全体で各カメラショットの境界が特定されます。そして、検出されたショットごとのラベルとその信頼スコアが、ショットの開始時間と終了時間とともに返されます。デフォルトは false です。

  • 1s_interval - 1 秒間隔での動画の分類を有効にするには、true に設定します。この場合、AutoML Video から、リクエストの構成で指定した動画のセグメント全体の 1 秒ごとにラベルとその信頼スコアが返されます。デフォルトは false です。

ウェブ UI

  1. Google Cloud Platform Console を開きます。
  2. 表示されたリストから、使用するカスタムモデルをクリックします。 Cloud Console でのカスタム AutoML Video Intelligence モデルのリスト
  3. モデルの [Predict] タブで、次の操作を行います。
    • [Test your model on new videos] で、予測に使用する CSV ファイルを選択します。この CSV ファイルには、アノテーションを付ける動画のリストが含まれている必要があります。
    • [Test your model on new videos] で、アノテーション結果を受け取る Cloud Storage バケット内のディレクトリを選択します。

      アノテーション結果を保持する特定の結果フォルダを Cloud Storage バケットに実際に作成してもかまいません。そうすれば、結果ディレクトリに含まれている video_classification.csv ファイルを読み込むことで、以前の予測に簡単にアクセスできます。

    • [Get Predictions] をクリックします。
    AutoML Video Intelligence に対する予測リクエストを構成する

アノテーションを付ける動画の数によっては、予測を取得する処理に時間がかかることがあります。

処理が完了すると、モデルページの [Recent Predictions] の下に結果が表示されます。結果を見るには、次の手順に従います。

  1. [Recent Predictions] の [Predictions] 列で、表示する予測の [View] をクリックします。
  2. [Video] で、結果を表示する動画の名前を選択します。

AutoML Video Intelligence による予測の結果

コマンドライン

次の例では、動画の予測をリクエストします。

  • model-id をモデルの ID に置き換えます。この ID は、モデルの名前の最後の要素です。たとえば、モデルの名前が projects/434039606874/locations/us-central1/models/3745331181667467569 の場合、モデルの ID は 3745331181667467569 です。

  • your-bucket-name を Google Cloud Storage バケットの名前に置き換えます。たとえば my-project-vcm などです。

  • your-input-file を、アノテーションを付ける動画を指定した CSV ファイルの名前に置き換えます。

  • your-output-storage-path を、予測の出力を保存する Google Cloud Storage のパスに置き換えます。AutoML Video はこのパスに、prediction-model_name-timestamp 形式の名前を付けたサブフォルダを作成します。このサブフォルダには、バッチ リクエスト内の各動画の予測ファイルが格納されます。このパスに対する書き込み権限が必要です。

curl -X POST \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" \
https://automl.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/us-central1/models/your-model-id:batchPredict -d '{
  "inputConfig": {
    "gcsSource": {
      "inputUris": ["gs://your-bucket-name/your-input-file.csv"]
    }
  },
  "outputConfig": {
    "gcsDestination": {
      "outputUriPrefix": "gs://your-storage-path"
    }
  }
}'

バッチ予測リクエストのオペレーション ID が返されます(例: VCN926615623331479552)。

{
  "name": "projects/915378992997/locations/us-central1/operations/VCN926615623331479552",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.automl.v1beta1.OperationMetadata",
    "createTime": "2018-10-19T21:22:27.003694Z",
    "updateTime": "2018-10-19T21:22:27.003694Z",
    "batchPredictDetails": {}
  }
}

バッチ予測オペレーションのステータスを確認するには、次の curl コマンドを使用します。

  • your-operation-id をバッチ予測オペレーションのオペレーション ID に置き換えます。
curl -X GET -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" \
https://${ENDPOINT}/v1beta1/projects/${PROJECT_ID}/locations/us-central1/operations/your-operation-id

CSV ファイルで指定した動画の数によっては、バッチ予測タスクが完了するまでに時間がかかることがあります。タスクが終了すると、次の例に示すように、オペレーションのステータスに done: true が表示され、エラーはリストされません。

{
  "name": "projects/915378992997/locations/us-central1/operations/VCN926615623331479552",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.automl.v1beta1.OperationMetadata",
    "createTime": "2018-10-18T21:23:15.181451Z",
    "updateTime": "2018-10-18T21:26:10.354502Z",
    "importDataDetails": {}
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.protobuf.Empty"
  }
}

バッチ予測タスクが完了すると、コマンドで指定した Google Cloud Storage バケットに予測の出力が保存されます。動画セグメントごとに JSON ファイルがあります。次に例を示します。

my-video-01.avi.json

{
  "input_uri": "automl-video-sample/sample_video.avi",
  "segment_classification_annotations": [ {
    "annotation_spec": {
      "display_name": "ApplyLipstick",
      "description": "ApplyLipstick"
    },
    "segments": [ {
      "segment": {
        "start_time_offset": {
        },
        "end_time_offset": {
          "seconds": 4,
          "nanos": 960000000
        }
      },
      "confidence": 0.43253016
    }, {
      "segment": {
        "start_time_offset": {
        },
        "end_time_offset": {
          "seconds": 4,
          "nanos": 960000000
        }
      },
      "confidence": 0.56746984
    } ],
    "frames": [ ]
  } ],
  "shot_classification_annotations": [ {
    "annotation_spec": {
      "display_name": "ApplyLipstick",
      "description": "ApplyLipstick"
    },
    "segments": [ {
      "segment": {
        "start_time_offset": {
        },
        "end_time_offset": {
          "seconds": 5
        }
      },
      "confidence": 0.43253016
    }, {
      "segment": {
        "start_time_offset": {
        },
        "end_time_offset": {
          "seconds": 5
        }
      },
      "confidence": 0.56746984
    } ],
    "frames": [ ]
  } ],
  "one_second_sliding_window_classification_annotations": [ {
    "annotation_spec": {
      "display_name": "ApplyLipstick",
      "description": "ApplyLipstick"
    },
    "segments": [ ],
    "frames": [ {
      "time_offset": {
        "nanos": 800000000
      },
      "confidence": 0.54533803
    }, {
      "time_offset": {
        "nanos": 800000000
      },
      ...
      "confidence": 0.57945728
    }, {
      "time_offset": {
        "seconds": 4,
        "nanos": 300000000
      },
      "confidence": 0.42054281
    } ]
  } ],
  "object_annotations": [ ],
  "error": {
    "details": [ ]
  }
}

Java

/**
 * Demonstrates using the AutoML client to classify the video intelligence
 *
 * @param projectId the Id of the project.
 * @param computeRegion the Region name. (e.g., "us-central1")
 * @param modelId the Id of the model which will be used for video intelligence classification.
 * @param inputUri the GCS bucket path of csv file which contains path of the video to be
 *     classified.
 * @param outputUriPrefix the output GCS bucket folder path which contains one csv file and json
 *     file for each video classification.
 * @throws IOException
 * @throws ExecutionException
 * @throws InterruptedException
 */
public static void predict(
    String projectId,
    String computeRegion,
    String modelId,
    String inputUri,
    String outputUriPrefix)
    throws IOException, InterruptedException, ExecutionException {

  // Create client for prediction service.
  PredictionServiceClient predictionClient = PredictionServiceClient.create();

  // Get full path of model
  ModelName modelName = ModelName.of(projectId, computeRegion, modelId);

  // Set the input URI
  GcsSource.Builder gcsSource = GcsSource.newBuilder();

  // Get multiple training data files to be imported
  String[] inputUris = inputUri.split(",");
  for (String inputFilePath : inputUris) {
    gcsSource.addInputUris(inputFilePath);
  }

  // Set the Batch Input Configuration
  BatchPredictInputConfig batchInputConfig =
      BatchPredictInputConfig.newBuilder().setGcsSource(gcsSource).build();

  // Set the output URI
  GcsDestination.Builder gcsDestination = GcsDestination.newBuilder();
  gcsDestination.setOutputUriPrefix(outputUriPrefix);

  // Set the Batch Input Configuration
  BatchPredictOutputConfig batchOutputConfig =
      BatchPredictOutputConfig.newBuilder().setGcsDestination(gcsDestination).build();

  // Set the modelName, input and output config in the batch prediction
  BatchPredictRequest batchRequest =
      BatchPredictRequest.newBuilder()
          .setInputConfig(batchInputConfig)
          .setOutputConfig(batchOutputConfig)
          .setName(modelName.toString())
          .build();

  // Get the latest state of a long-running operation.
  OperationFuture<BatchPredictResult, OperationMetadata> operation =
      predictionClient.batchPredictAsync(batchRequest);

  System.out.println(
      String.format("Operation Name: %s", operation.getInitialFuture().get().getName()));
}

Node.js

const automl = require(`@google-cloud/automl`);

// Create client for prediction service.
const client = new automl.v1beta1.PredictionServiceClient();

/**
 * Demonstrates using the AutoML client to classify the video intelligence
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const projectId = '[PROJECT_ID]' e.g., "my-gcloud-project";
// const computeRegion = '[REGION_NAME]' e.g., "us-central1";
// const modelId = '[MODEL_ID]' e.g., "IOD2122286140026257408";
// const inputUri = '[GCS_PATH]' e.g., "gs://<bucket-name>/<csv file>",
// `the GCS bucket path of csv file which contains path of the video
// to be classified.`;
// const outputUriPrefix = '[GCS_DIRECTORY_PATH]'
// e.g., "gs://<bucket-name>/<folder>",
// `the output GCS bucket folder path which contains one csv file and
// json file for each video classification.`;

// Get the full path of the model.
const modelFullId = client.modelPath(projectId, computeRegion, modelId);

// Set the input URI
const inputConfig = {
  gcsSource: {
    inputUris: [inputUri],
  },
};

// Set the output URI
const outputUri = outputUriPrefix;
const outputConfig = {
  gcsDestination: {
    outputUriPrefix: outputUri,
  },
};

// Get the latest state of a long-running operation.
client
  .batchPredict({
    name: modelFullId,
    inputConfig: inputConfig,
    outputConfig: outputConfig,
  })
  .then(responses => {
    const response = responses[1];
    console.log(`Operation name: ${response.name}`);
  })
  .catch(err => {
    console.error(err);
  });

Python

# TODO(developer): Uncomment and set the following variables
# project_id = 'PROJECT_ID_HERE'
# compute_region = 'COMPUTE_REGION_HERE'
# model_id = 'MODEL_ID_HERE'
# input_uri = 'gs://path/to/file.csv'
# output_uri_prefix = 'gs://path'

from google.cloud import automl_v1beta1 as automl
import csv

automl_client = automl.AutoMlClient()

# Get the full path of the model.
model_full_id = automl_client.model_path(
    project_id, compute_region, model_id
)

# Create client for prediction service.
prediction_client = automl.PredictionServiceClient()

# Input configuration.
input_config = dict(gcs_source={'input_uris': [input_uri]})

# Output configuration.
output_config = dict(
    gcs_destination={'output_uri_prefix': output_uri_prefix}
)

# Launch long-running batch prediction operation.
response = prediction_client.batch_predict(model_full_id, input_config,
                                            output_config)
print("Making batch prediction... ")
try:
    result = response.result()
except:
    # Hides Any to BatchPredictResult error.
    pass
print("Batch prediction complete.\n{}".format(response.metadata))