Video Intelligence API と Cloud Vision API を使用したユーザー作成コンテンツの処理(チュートリアル)

このチュートリアルでは、Cloud Vision APICloud Video Intelligence API で画像と動画を処理するために一連の Cloud Functions の関数をデプロイする方法について説明します。この機能については、Video Intelligence API と Cloud Vision API を使用したユーザー作成コンテンツの処理をご覧ください。

このチュートリアルに従って、Cloud Functions と、ソリューションで必要なその他の Google Cloud Platform(GCP)のコンポーネントをデプロイします。

目標

料金

このチュートリアルでは、以下を含む、Cloud Platform の有料コンポーネントを使用します。

  • Cloud Functions
  • Cloud Pub/Sub
  • Cloud Storage
  • BigQuery
  • Vision API
  • Video Intelligence API

このチュートリアルの実施にかかる費用は、無料枠の料金設定枠内に収まります。無料枠を使用しない場合は、10 個の画像と 10 個の動画をテストするために約 $5 の費用がかかります。料金計算ツールを使用すると、予想使用量に基づいて費用の見積もりを作成できます。Cloud Platform を初めて使用する方は、無料トライアルをご利用いただけます。

始める前に

  1. Google Cloud Platform(GCP)プロジェクトを作成するか、既存のプロジェクトを使用します。

    プロジェクト ページに移動

  2. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  3. Cloud Functions, Cloud Storage, BigQuery, Vision, and Video Intelligence API を有効にします。

    API を有効にする

  4. Google Cloud SDK をインストールして初期化します。

  5. gcloud コンポーネントを更新してインストールします。

    gcloud components update && gcloud components install beta
  6. Node.js 開発用の環境を準備します。

    セットアップ ガイドに移動

アーキテクチャ

以下の図に、アーキテクチャの概要を示します。

アーキテクチャの概要

GitHub リポジトリのクローン作成

このチュートリアルのすべての Cloud Functions が GitHub 上に用意されています。任意のツールを使用して GitHub からコードをダウンロードするか、以下のコマンドを使用できます。

git clone https://github.com/GoogleCloudPlatform/cloud-functions-intelligentcontent-nodejs

クローンされたリポジトリ ディレクトリに移動します。

cd cloud-functions-intelligentcontent-nodejs

Cloud Storage バケットの作成

Cloud Storage バケットは、画像と動画をアップロードする際の保管場所となります。以下の手順に従って、4 つの異なる Cloud Storage バケットを作成します。

  1. 画像ファイルと動画ファイルを保存するバケットを作成します。[IV_BUCKET_NAME] は、有効な Cloud Storage バケット名に置き換えます。

    gsutil mb gs://[IV_BUCKET_NAME]
  2. フィルタリングされた画像ファイルと動画ファイルを保存するバケットを作成します。[FILTERED_BUCKET_NAME] は、有効な Cloud Storage バケット名に置き換えます。

    gsutil mb gs://[FILTERED_BUCKET_NAME]
  3. フラグが立てられた画像ファイルと動画ファイルを保存するバケットを作成します。[FLAGGED_BUCKET_NAME] は、有効な Cloud Storage バケット名に置き換えます。

    gsutil mb gs://[FLAGGED_BUCKET_NAME]
  4. Cloud Functions でステージングの場所として使用するバケットを作成します。[STAGING_BUCKET_NAME] は、有効な Cloud Storage バケット名に置き換えます。

    gsutil mb gs://[STAGING_BUCKET_NAME]

Cloud Pub/Sub トピックの作成

Cloud Storage 通知メッセージと、Cloud Functions の関数間のメッセージには、Cloud Pub/Sub トピックを使用します。

  1. いずれかのファイルが Cloud Storage にアップロードされるたびに Cloud Storage 通知を受信するトピックを作成します。[UPLOAD_NOTIFICATION_TOPIC] は、有効な Cloud Pub/Sub トピック名に置き換えます。

    gcloud pubsub topics create [UPLOAD_NOTIFICATION_TOPIC]
  2. Vision API からメッセージを受信するトピックを作成します。[VISION_TOPIC_NAME] は、有効なトピック名に置き換えます。config.json ファイル内のデフォルト値は visionapiservice です。

    gcloud pubsub topics create [VISION_TOPIC_NAME]
  3. Video Intelligence API からメッセージを受信するトピックを作成します。[VIDEOIQ_TOPIC_NAME] は、有効なトピック名に置き換えます。config.json ファイル内のデフォルト値は videointelligenceservice です。

    gcloud pubsub topics create [VIDEOIQ_TOPIC_NAME]
  4. BigQuery に保存するメッセージを受信するトピックを作成します。[BIGQUERY_TOPIC_NAME] は、有効なトピック名に置き換えます。config.json ファイル内のデフォルト値は bqinsert です。

    gcloud pubsub topics create [BIGQUERY_TOPIC_NAME]

Cloud Storage の通知の作成

  1. Cloud Storage のファイル アップロード バケットにいずれかの新しいオブジェクトが配置された場合にのみトリガーされる通知を作成します。[UPLOAD_NOTIFICATION_TOPIC] はトピック名に置き換え、[IV_BUCKET] はファイル アップロード バケット名に置き換えます。

    gsutil notification create -t [UPLOAD_NOTIFICATION_TOPIC] -f json -e OBJECT_FINALIZE gs://[IV_BUCKET_NAME]
  2. このバケットに関する通知が作成されていることを確認します。

    gsutil notification list gs://[IV_BUCKET_NAME]

    上記の関数が成功すると、次の出力が表示されます。

    Filters: Event Types: OBJECT_FINALIZE

BigQuery データセットおよびテーブルの作成

Vision API と Video Intelligence API の結果は BigQuery に格納されます。

  1. BigQuery データセットを作成します。[PROJECT_ID] はプロジェクト ID に置き換え、[DATASET_ID] はデータセット名に置き換えます。config.json ファイル内の [DATASET_ID] のデフォルト値は intelligentcontentfilter です。

    bq --project_id [PROJECT_ID] mk [DATASET_ID]
  2. スキーマ ファイルから BigQuery テーブルを作成します。[PROJECT_ID] はプロジェクト ID に置き換え、[DATASET_ID].[TABLE_NAME] はデータセット ID とテーブル名に置き換えます。config.json ファイル内の [DATASET_ID] のデフォルト値は intelligentcontentfilter であり、[TABLE_NAME] のデフォルト値は filtered_content です。

    bq --project_id [PROJECT_ID] mk --schema intelligent_content_bq_schema.json -t [DATASET_ID].[TABLE_NAME]
  3. BigQuery テーブルが作成されていることを確認します。[PROJECT_ID] はプロジェクト ID に置き換え、[DATASET_ID].[TABLE_NAME] はデータセット ID とテーブル名に置き換えます。

    bq --project_id [PROJECT_ID] show [DATASET_ID].[TABLE_NAME]

    出力結果:

    BigQuery テーブル

Cloud Functions のデプロイ

次のステップは Cloud Functions のデプロイです。

JSON 構成ファイルの編集

コードをダウンロードしたら、特定の Cloud Storage バケット、Cloud Pub/Sub トピック名、BigQuery データセット ID およびテーブル名を使用するように config.json ファイルを編集します。

{
  "VISION_TOPIC": "projects/[PROJECT-ID]/topics/visionapiservice",
  "VIDEOINTELLIGENCE_TOPIC": "projects/[PROJECT-ID]/topics/videointelligenceservice",
  "BIGQUERY_TOPIC": "projects/[PROJECT-ID]/topics/bqinsert",
  "REJECTED_BUCKET": "[FLAGGED_BUCKET_NAME]",
  "RESULT_BUCKET": "[FILTERED_BUCKET_NAME]",
  "DATASET_ID": "[DATASET_ID]",
  "TABLE_NAME": "[TABLE_NAME]",
  "GCS_AUTH_BROWSER_URL_BASE": "https://storage.cloud.google.com/" ,
  "API_Constants": {
  	"ADULT" : "adult",
  	"VIOLENCE" : "violence",
  	"SPOOF" : "spoof",
  	"MEDICAL" : "medical"
  }
}

GCStoPubsub 関数をデプロイする

Cloud Functions の関数 GCStoPubsub をデプロイします。この関数には、Cloud Pub/Sub から Cloud Storage の通知メッセージを受信し、別の Cloud Pub/Sub メッセージを使用して受信メッセージを適切な関数に転送するロジックが含まれています。

  • [STAGING_BUCKET_NAME] は Cloud Storage ステージング バケット名に置き換え、[UPLOAD_NOTIIFICATION_TOPIC] はファイル アップロード通知トピック名に置き換えます。

    gcloud functions deploy GCStoPubsub \
      --stage-bucket [STAGING_BUCKET_NAME] \
      --trigger-topic [UPLOAD_NOTIIFICATION_TOPIC] \
      --entry-point GCStoPubsub \
      --runtime=nodejs10

それぞれの Cloud Functions の関数で、このコマンドラインの出力は以下のようになります。

Copying file:///var/folders/69/wsyfjkld5fq1w_wf7d5pxbv80030br/T/tmphzfCsc/fun.zip [Content-Type=application/zip]...
/ [1 files][138.4 KiB/138.4 KiB]
Operation completed over 1 objects/138.4 KiB.
Deploying function (may take a while - up to 2 minutes)...
...............................................................done.
availableMemoryMb: 256
entryPoint: GCStoPubsub
eventTrigger:
  eventType: providers/cloud.pubsub/eventTypes/topic.publish
  failurePolicy: {}
  resource: projects/[PROJECT-ID]/topics/intelligentcontentfileupload
latestOperation: operations/c2VjcmV0LXplcGh5ci0xMTIxL3VzLWNlbnRyYWwxL0dDU3RvUHVic3ViL0tRaGxHeVFhZHdR
name: projects/[PROJECT-ID]/locations/us-central1/functions/GCStoPubsub
serviceAccount: [PROJECT-ID]@appspot.gserviceaccount.com
sourceArchiveUrl: gs://[STAGING_BUCKET_NAME]/us-central1-GCStoPubsub-bnnmzdzqtjoo.zip
status: READY
timeout: 60s
updateTime: '2017-09-01T14:59:03Z'
versionId: '01'

visionAPI 関数をデプロイする

  • Cloud Functions の関数 visionAPI をデプロイします。この関数には、Cloud Pub/Sub を使用してメッセージを受信し、Vision API を呼び出して、別の Cloud Pub/Sub メッセージを使用しメッセージを Cloud Functions の関数 insertIntoBigQuery に転送するロジックが含まれています。[STAGING_BUCKET_NAME] は Cloud Storage ステージング バケット名に置き換え、[VISION_TOPIC_NAME] は Vision API トピック名に置き換えます。

    gcloud functions deploy visionAPI \
      --stage-bucket [STAGING_BUCKET_NAME] \
      --trigger-topic [VISION_TOPIC_NAME] \
      --entry-point visionAPI \
      --runtime=nodejs10

videoIntelligenceAPI 関数をデプロイする

  • Cloud Functions の関数 videoIntelligenceAPI をデプロイします。この関数には、Cloud Pub/Sub を使用してメッセージを受信し、Video Intelligence API を呼び出して、別の Cloud Pub/Sub メッセージを使用しメッセージを Cloud Functions の関数 insertIntoBigQuery に転送するロジックが含まれています。[STAGING_BUCKET_NAME] は Cloud Storage ステージング バケット名に置き換え、[VIDEOIQ_TOPIC_NAME] は Video Intelligence API トピック名に置き換えます。

    gcloud functions deploy videoIntelligenceAPI \
      --stage-bucket [STAGING_BUCKET_NAME] \
      --trigger-topic [VIDEOIQ_TOPIC_NAME] \
      --entry-point videoIntelligenceAPI \
      --timeout 540 \
      --runtime=nodejs10

insertIntoBigQuery 関数をデプロイする

  • Cloud Functions の関数 insertIntoBigQuery をデプロイします。この関数には、Cloud Pub/Sub を使用してメッセージを受信し、BigQuery API を呼び出して BigQuery テーブルにデータを挿入するロジックが含まれています。[STAGING_BUCKET_NAME] は Cloud Storage ステージング バケット名に置き換え、[BIGQUERY_TOPIC_NAME] は BigQuery トピック名に置き換えます。

    gcloud functions deploy insertIntoBigQuery \
      --stage-bucket [STAGING_BUCKET_NAME] \
      --trigger-topic [BIGQUERY_TOPIC_NAME] \
      --entry-point insertIntoBigQuery \
      --runtime=nodejs10

フローのテスト

以下の図に、処理フローの概要を示します。

処理フロー

プロセスをテストするには、ファイルを Cloud Storage にアップロードし、ログを確認して、BigQuery で結果を表示します。

  1. 画像と動画のファイルを [IV_BUCKET_NAME] にアップロードします。[LOCAL_FILE_NAME] はファイル名です。

    gsutil cp [LOCAL_FILE_NAME] gs://[IV_BUCKET_NAME]
  2. Cloud Logging に取り込まれた Cloud Functions のログを表示して、Cloud Functions がトリガーされて正常に実行されたことを確認します。

    1. GCStoPubsub をテストする

      gcloud functions logs read --filter "finished with status" "GCStoPubsub" --limit 100

      出力結果:

      GCStoPubsub ログ

    2. insertIntoBigQuery をテストする

      gcloud functions logs read --filter "finished with status" "insertIntoBigQuery" --limit 100

      出力結果:

      insertIntoBigQuery ログ

  3. BigQuery に対してクエリを実行する SQL コマンドを作成します。[PROJECT_ID][DATASET_ID][TABLE_NAME] は、それぞれプロジェクト ID、データセット ID、BigQuery テーブル名に置き換えます。

    echo "
    #standardSql
    SELECT insertTimestamp,
    contentUrl,
    flattenedSafeSearch.flaggedType,
    flattenedSafeSearch.likelihood
    FROM \`${PROJECT_ID}.${DATASET_ID}.${TABLE_NAME}\`
    CROSS JOIN UNNEST(safeSearch) AS flattenedSafeSearch
    ORDER BY insertTimestamp DESC,
    contentUrl,
    flattenedSafeSearch.flaggedType
    LIMIT 1000
    " > sql.txt
    
  4. 以下のコマンドを使用して BigQuery の結果を表示します。

    bq --project_id [PROJECT_ID] query < sql.txt

    出力結果:

    BigQuery の結果

    あるいは、BigQuery のウェブ UI にログインしてクエリを実行することもできます。

    1. ブラウザで https://bigquery.cloud.google.com を開きます。
    2. [クエリの作成] をクリックして、以下のクエリを開始します。

      クエリを作成

    3. テキスト ボックスに以下の SQL を入力します。[PROJECT_ID][DATASET_ID][TABLE_NAME] は、それぞれプロジェクト ID、データセット ID、BigQuery テーブル名に置き換えます。

      #standardSql
      SELECT insertTimestamp,
      contentUrl,
      flattenedSafeSearch.flaggedType,
      flattenedSafeSearch.likelihood
      FROM `[PROJECT_ID].[DATASET_ID].[TABLE_NAME]`
      CROSS JOIN UNNEST(safeSearch) AS flattenedSafeSearch
      ORDER BY insertTimestamp DESC,
      contentUrl,
      flattenedSafeSearch.flaggedType
      LIMIT 1000
      

      この SQL は UI で次の例のように表示されます。

      SQL クエリ

      出力結果:

      SQL クエリ結果

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

現在のチュートリアルが終了したら、Google Cloud で作成したリソースをクリーンアップして、今後料金が発生しないようにします。次のセクションで、リソースを削除または無効にする方法を説明します。

プロジェクトの削除

課金を停止する最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除する手順は次のとおりです。

  1. Cloud Console で、[プロジェクト] ページに移動します。
  2. プロジェクト リストで、削除するプロジェクトを選択し、[プロジェクトの削除] をクリックします。
  3. ダイアログの [プロジェクト ID] に値を入力し、[シャットダウン] をクリックします。

すべてのコンポーネントの削除

  1. Cloud Functions 関数を削除します。

    gcloud functions delete GCStoPubsub
    gcloud functions delete visionAPI
    gcloud functions delete videoIntelligenceAPI
    gcloud functions delete insertIntoBigQuery
  2. BigQuery テーブルとデータセットを削除します。変数は、該当する値に置き換えます。

    bq --project_id [PROJECT_ID] rm -r -f [DATASET_ID]
  3. Cloud Storage バケットを削除します。変数は、該当する値に置き換えます。

    gsutil -m rm -r gs://[IV_BUCKET_NAME]
    gsutil -m rm -r gs://[FLAGGED_BUCKET_NAME]
    gsutil -m rm -r gs://[FILTERED_BUCKET_NAME]
    gsutil -m rm -r gs://[STAGING_BUCKET_NAME]
  4. Cloud Pub/Sub トピックを削除します。変数は、該当する値に置き換えます。

    gcloud pubsub topics delete [UPLOAD_NOTIFICATION_TOPIC]
    gcloud pubsub topics delete [VISION_TOPIC_NAME]
    gcloud pubsub topics delete [VIDEOIQ_TOPIC_NAME]
    gcloud pubsub topics delete [BIGQUERY_TOPIC_NAME]

次のステップ