Cloud 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. プロジェクトに対して課金が有効になっていることを確認します。

    課金を有効にする方法について

  3. Cloud Functions、Cloud Storage、BigQuery、Vision、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

Cloud Storage バケットの作成

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

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

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

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

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

    gsutil mb [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 [IV_BUCKET_NAME]
  2. このバケットに関する通知が作成されていることを確認します。

    gsutil notification list [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

それぞれの 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

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

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

フローのテスト

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

processing-flow

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

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

    gsutil cp [LOCAL_FILE_NAME] [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 Platform アカウントに課金されないようにする手順は次のとおりです。

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

プロジェクトの削除

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

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

  1. GCP 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 [IV_BUCKET_NAME]
    gsutil -m rm -r [FLAGGED_BUCKET_NAME]
    gsutil -m rm -r [FILTERED_BUCKET_NAME]
    gsutil -m rm -r [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]

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...