Vertex AI Vision モーション フィルタ

1. 目標

概要

この Codelab では、エンドツーエンドの Vertex AI Vision アプリケーションを作成して、モーション フィルタリング機能を使用して動画を送信する方法を説明します。このチュートリアルでは、モーション フィルタの構成におけるさまざまなパラメータについて説明します。

  • モーション検知の感度
  • 最小アクティビティ時間
  • ルックバック ウィンドウ
  • クールダウン時間
  • モーション検出ゾーン

学習内容

  • ストリーミング用の動画を取り込む方法
  • モーション フィルタで利用できるさまざまな機能とその使い方
  • モーション フィルターの統計情報を確認する方法
  • 動画に合わせて設定を調整する方法

2. 始める前に

  1. Google Cloud コンソールのプロジェクト セレクタ ページで、Google Cloud プロジェクトを選択または作成します。: この手順で作成するリソースをそのまま保持する予定でない場合、既存のプロジェクトを選択するのではなく、新しいプロジェクトを作成してください。チュートリアルの終了後にそのプロジェクトを削除すれば、プロジェクトに関連するすべてのリソースを削除できます。プロジェクト セレクタに移動
  2. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
  3. Compute Engine API と Vision AI API を有効にします。API を有効にする

サービス アカウントを作成します。

  1. Google Cloud コンソールで [サービス アカウントの作成] ページに移動します。[サービス アカウントの作成] に移動
  2. プロジェクトを選択します。
  3. [サービス アカウント名] フィールドに名前を入力します。Google Cloud コンソールでは、この名前に基づいて [サービス アカウント ID] フィールドに値が設定されます。[サービス アカウントの説明] フィールドに説明を入力します。たとえば、クイックスタート用のサービス アカウントなどです。
  4. [作成して続行] をクリックします。
  5. プロジェクトへのアクセス権限を付与するには、サービス アカウントに次のロールを付与します。Vision AI > Vision AI 編集者、Compute Engine > Compute インスタンス管理者(ベータ版)、Storage > Storage オブジェクト閲覧者 †。[ロールを選択] リストでロールを選択します。ロールを追加するには、[別のロールを追加] をクリックして各ロールを追加します。: [ロール] フィールドは、サービス アカウントがプロジェクト内のどのリソースにアクセスできるかに影響します。これらのロールは後で取り消すことも、追加のロールを付与することもできます。本番環境では、オーナー、編集者、閲覧者のロールを付与しないでください。代わりに、ニーズに合わせて事前定義ロールまたはカスタムロールを付与します。
  6. [続行] をクリックします。
  7. [完了] をクリックして、サービス アカウントの作成を完了します。ブラウザ ウィンドウは閉じないでください。次のステップでこれを使用します。

サービス アカウント キーを作成します。

  1. Google Cloud コンソールで、作成したサービス アカウントのメールアドレスをクリックします。
  2. [キー] をクリックします。
  3. [鍵を追加]、[新しい鍵を作成] の順にクリックします。
  4. [作成] をクリックします。JSON キーファイルがパソコンにダウンロードされます。
  5. [閉じる] をクリックします。
  6. Google Cloud CLI をインストールして初期化します。

† Cloud Storage バケットからサンプル動画ファイルをコピーする場合にのみ、このロールが必要です。

3. モーション フィルタ

モーション フィルタは、モーション イベントを含むモーションと商品の動画セグメントをキャプチャします。動きの感度、イベントの最小長、ルックバック ウィンドウ、クールダウン期間、動き検出ゾーンを調整することで、ユーザーは自分のニーズに基づいてフィルタを構成できます。

モーション フィルタの構成

モーション フィルタには、カスタマイズ可能な 5 つの設定があります。

  1. 動きに対する感度: 動きがトリガーされる感度。
  2. 最小アクティビティ時間: モーション イベントがキャプチャされる最小時間。
  3. ルックバック ウィンドウ: モーション イベントが検出される前に動画の録画を開始する時間。
  4. クールダウン期間: モーション イベントが終了すると、指定された期間のクールダウンが発生します。クールダウン期間中は、モーション イベントはトリガーされません。
  5. モーション検出ゾーン: モーション検出を実行する場所を指定するためにユーザーが構成したゾーン。(後のセクションで詳しく説明します)

動きに対する感度

vaictl コマンドでフラグ motion_detection_sensitivity を使用します。
文字列。デフォルトのメディア。[低]、[中]、[高] から選択できます。

モーション検出の感度が高いほど、ノイズや小さな動きに敏感になります。この設定は、小さな動く物体(遠くの人など)があり、照明が安定している設定におすすめします。

一方、感度が低いと、照明の干渉を受けにくくなります。この設定は、屋外などの照明の干渉が多い環境や、ノイズが多い可能性がある画質の低い動画に最適です。この設定は最も積極的なフィルタリングであるため、小さなオブジェクトの動きが無視される可能性があります。

最小アクティビティ時間

vaictl コマンドでフラグ min_event_length_in_seconds を使用します。
整数。デフォルトは 10 秒です。範囲は 0 秒~ 3,600 秒です。

フレーム内でモーション イベント セグメントが検出された後に解析されるモーション イベント動画の最小時間。

ルックバック ウィンドウ

vaictl コマンドでフラグ look_back_window_in_seconds を使用します。
整数。デフォルトは 3 秒です。範囲は 0 秒~ 3,600 秒です。

ルックバック ウィンドウは、モーション イベントが検出される前にキャッシュに保存される期間です。モーション イベントが検出される数秒前のフレームで何が起こっているかを確認したい場合に便利です。

クールダウン期間

vaictl コマンドでフラグ cool_down_period_in_seconds を使用します。
整数。デフォルトは 300 秒です。範囲は 0 秒~ 3,600 秒です。

クールダウン期間とは、動きが検出されてからモーション イベントがキャプチャされるまでの間、モーション検出が一時停止される期間のことです。クールダウン期間中は、モーションを検出するための計算は実行されません。

4. 基本的なモーション フィルタの例

Vaictl SDK マニュアル

モーション フィルタを含む入力ストリームの vaictl マニュアルを確認するには、次のコマンドを使用します。

vaictl send video-file applying motion-filter -h

サンプル動画を準備する

  1. 次の gsutil cp コマンドを使用して、サンプル動画をコピーできます。次の変数を置き換えます。
  • SOURCE: 使用する動画ファイルの場所。独自の動画ファイル ソース(gs://BUCKET_NAME/FILENAME.mp4 など)を使用するか、サンプル動画(gs://cloud-samples-data/vertex-ai-vision/street_vehicles_people.mp4)(人物と車両の動画、ソース)を使用できます。
export SOURCE=gs://cloud-samples-data/vertex-ai-vision/street_vehicles_people.mp4
gsutil cp $SOURCE .

環境変数を準備する

提供されたコマンド テンプレートを使用するには、次の環境変数を設定します。

vaictl 変数

  • PROJECT_ID: Google Cloud プロジェクト ID。
  • LOCATION_ID: ロケーション ID。たとえば、us-central1 などです。詳細については、クラウドのロケーションをご覧ください。
  • LOCAL_FILE: ローカル動画ファイルのファイル名。例: street_vehicles_people.mp4
  • –loop フラグ: 省略可。ストリーミングをシミュレートするためにファイルデータをループします。
export PROJECT_ID=<Your Google Cloud project ID>
export LOCATION_ID=us-central1

モーション フィルタ変数

  • MOTION_SENSITIVITY: モーション検知の感度。
  • MIN_EVENT_LENGTH: モーション イベントの最小長。
  • LOOK_BACK_WINDOW: モーション イベントの最初のモーションの前にキャプチャする期間。
  • COOL_DOWN_PERIOD: モーション イベントがキャプチャされた後、モーション検出が一時停止する期間。
export MOTION_SENSITIVITY=<low or medium or high>
export MIN_EVENT_LENGTH=<0-3600>
export LOOK_BACK_WINDOW=<0-3600>
export COOL_DOWN_PERIOD=<0-3600>

モーション フィルタ コマンドを準備する

入力ストリームでモーション フィルタを使用するには、次の 2 つの方法があります。1 つ目のオプションは、モーション イベントを Cloud コンソールのストリームに送信することです。2 つ目のオプションは、モーション イベントをローカル ストレージに送信することです。

結果を Cloud コンソールに送信する

vaictl を使用して、出力動画データを Cloud コンソールにストリーミングできます。まず、Cloud コンソールで Vision AI API を有効にします。

新しいストリームを登録する

  1. Vertex AI Vision の左側のパネルで [ストリーム] タブをクリックします。
  2. [登録] をクリックします。
  3. [ストリーム名] に「motion-detection-stream」と入力します。
  4. [地域] に「us-central1」と入力します。
  5. [登録] をクリックします。

ストリームに結果を送信する

このコマンドは、動画ファイルをストリームにストリーミングします。–loop フラグを使用すると、コマンドを停止するまで動画がストリームにループされます。このコマンドはバックグラウンド ジョブとして実行され、ストリーミングが継続されます。

先頭に nohup、末尾に & を追加して、バックグラウンド ジョブにします。

INPUT_VIDEO=street_vehicles_people.mp4

vaictl -p $PROJECT \
       -l $LOCATION_ID \
       -c application-cluster-0 \
       --service-endpoint visionai.googleapis.com \
  send video-file  --file-path $INPUT_VIDEO \
  applying motion-filter
         --motion-sensitivity=$MOTION_SENSITIVITY \
         --min-event-length=$MIN_EVENT_LENGTH \
         --lookback-length=$LOOK_BACK_WINDOW \
         --cooldown-length=$COOL_DOWN_PERIOD \
  to streams motion-detection-stream --loop

vaictl 取り込みオペレーションの開始から動画がダッシュボードに表示されるまで、約 100 秒かかることがあります。

ストリームの取り込みが完了すると、トラフィック ストリームを選択して、Vertex AI Vision ダッシュボードの [ストリーム] タブで動画フィードを確認できます。

[ストリーム] タブに移動

結果をローカル ストレージに送信する

このコマンドは、動画ファイルをストリームにストリーミングします。

先頭に nohup、末尾に & を追加して、バックグラウンド ジョブにします。

INPUT_VIDEO=street_vehicles_people.mp4
OUTPUT_PATH=<path_to_store_motion_events_on_local_disk>

nohup vaictl -p $PROJECT \
             -l $LOCATION_ID \
             -c application-cluster-0 \
             --service-endpoint visionai.googleapis.com \
  send video-file  --file-path $INPUT_VIDEO \
  applying motion-filter
         --motion-sensitivity=$MOTION_SENSITIVITY \
         --min-event-length=$MIN_EVENT_LENGTH \
         --lookback-length=$LOOK_BACK_WINDOW \
         --cooldown-length=$COOL_DOWN_PERIOD \
  to mp4file --mp4-file-path=$OUTPUT_PATH --loop

5. モーション検出ゾーン

このセクションでは、動作検出ゾーンの使用方法と構成方法について説明します。このゾーンは、興味のないエリアからの動きをマスクすることで、モーション検知を改善することを目的としています。

モーション検出ゾーンには、次の 2 種類があります。(1)モーション検出がアノテーション付きエリアでのみ実行されるポジティブ ゾーン、(2)モーション検出がアノテーション付きエリアでの動きを無視するネガティブ ゾーン。

ゾーンの注釈

vaictl コマンドで zone_annotation フラグを使用して、ゾーン ポリゴンの座標を入力します。
文字列。ゾーン アノテーションのデフォルトは空です。

ゾーン アノテーションは、ユーザーが入力する文字列で、ユーザーが非表示にしたり、フォーカスしたりしたいフレーム内のゾーンを示します。ゾーンに注釈を付けるには、ゾーン内の各ノードの x 軸と y 軸の画像座標を指定する必要があります。ポリゴンを形成するには、ゾーンに 3 つ以上のノードが必要です。フレームには複数のゾーンを含めることができます。ゾーンが重複している場合でも、両方のゾーンでカバーされるエリアはカバーされます。

ゾーン アノテーションには、従うべき特定の入力構文があります。

  • 単一のノードを示すには、: を使用して画像座標の x 軸と y 軸を接続します。たとえば、左上隅の (0,0) のノードは 0:0 と表記されます。
  • 単一ゾーン内のすべてのノードを示すには、; を使用してノードを接続します。たとえば、(0,0)(100,0)(100,100)(0, 100) のノードがあるゾーンは、0:0;100:0;100:100;0:100 と表記されます。ノードは常に隣接する接続ノードとして入力します。順序は時計回りでも反時計回りでもかまいません。

モーション検出ゾーン - 正方形*4 つのノードを持つ正方形のゾーン。

モーション検出ゾーン - 三角形*3 つのノードを持つ三角形のゾーン。

  • 1 つのフレームに複数のゾーンを示すには、- を使用して異なるゾーンを接続します。たとえば、(0,0)(100,0)(100,100)(0,100)(120,120)(110,150)(200,160) の両方を入力したい場合、入力ゾーンのアノテーションは 0:0;100:0;100:100;0:100-120:120;110:150;200:160 になります。

モーション検出ゾーン - 2 つのゾーンを含むフレーム*フレーム内の 2 つのゾーン。

画像から座標を取得するには、オンラインで利用できるツールがいくつかあります。たとえば、Wolfram - Get Coordinates from Image をご覧ください。

注釈付きゾーンを除外する

vaictl コマンドで exclude_annotated_zone フラグを使用して、ゾーン内またはゾーン外の動きを検出するように構成します。
ブール値。デフォルト: false。

除外する注釈付きゾーンは、ユーザーからのブール値入力です。モーション検出で注釈付きゾーンを除外するかどうかを示します。

  • true に設定すると、アノテーション付きゾーンはネガティブ ゾーンとして機能します。注釈付きゾーン内の動きは検出されません。

モーション検出ゾーン - 除外オプション *入力ゾーン外でのみモーション検知を実行します。

  • false に設定すると、ゾーンはモーション検出の対象となるポジティブ ゾーンとして機能します。

モーション検出ゾーン - 範囲に含めるオプション *入力ゾーンでのみモーション検出を実行します。

6. モーション検出ゾーンの例を含むモーション フィルタ

この例では、前景で木が常に動いている動画を例として使用します。通常のモーション フィルタ設定では、モーション フィルタが動く木を「動画全体を通して常に動いている」と登録するため、動画は元の動画の長さのモーション イベントを 1 つだけ生成します。しかし、モーション検出ゾーンを使用すると、木の動きを適切にマスクして、車や歩行者の動きに焦点を当てることができます。

動画の準備

サンプル動画(gs://cloud-samples-data/vertex-ai-vision/dynamic-background-fall.mp4)には、www.changedetection.net の木、車、歩行者が含まれています。

動画提供: N. Goyette, P.-M. Jodoin, F. Porikli, J. Konrad、P. Ishwar, changedetection.net: A new change detection benchmark dataset, in Proc. IEEE Workshop on Change Detection (CDW-2012) at CVPR-2012, Providence, RI, 16-21 Jun., 2012

環境変数の準備

Google Cloud プロジェクト変数。

export PROJECT_ID=<Your Google Cloud project ID>
export LOCATION_ID=us-central1
export LOCAL_FILE=street_vehicles_people.mp4

基本的なモーション フィルタの構成。

export MOTION_SENSITIVITY=<low or medium or high>
export MIN_EVENT_LENGTH=<0-3600>
export LOOK_BACK_WINDOW=<0-3600>
export COOL_DOWN_PERIOD=<0-3600>

モーション検知ゾーンの構成。

モーション検知ゾーンのさまざまな使用方法については、以下から選択してください。

モーション検出のツリーを除外します。

export ZONE_ANNOTATION="0:0;680:0;660:70;380:320;100:150"
export EXCLUDE_ANNOTATED_ZONE=true

モーション検知ゾーン - サンプル動画のアノテーション付きゾーンからモーション検知を除外する *入力ゾーン外でのみモーション検知を実行します。

モーション検知の対象を道路に絞ります。

export ZONE_ANNOTATION="0:300;780:300;780:480;0:480"
export EXCLUDE_ANNOTATED_ZONE=false

モーション検知ゾーン - サンプル動画のアノテーション付きゾーンからモーション検知を実行する *入力ゾーン外でのみモーション検知を実行します。

モーション フィルタを使用して動画ストリームを送信する

モーション イベントを Cloud コンソールに送信する

vaictl を使用して、出力動画データを Cloud コンソールにストリーミングできます。まず、Cloud コンソールで Vision AI API を有効にします。

新しいストリームを登録する

  1. Vertex AI Vision の左側のパネルで [ストリーム] タブをクリックします。
  2. [登録] をクリックします。
  3. [ストリーム名] に「motion-detection-stream」と入力します。
  4. [地域] に「us-central1」と入力します。
  5. [登録] をクリックします。

ストリームに結果を送信する

このコマンドは、動画ファイルをストリームにストリーミングします。–loop フラグを使用すると、コマンドを停止するまで動画がストリームにループされます。このコマンドはバックグラウンド ジョブとして実行され、ストリーミングが継続されます。

先頭に nohup、末尾に & を追加して、バックグラウンド ジョブにします。

vaictl -p $PROJECT \
       -l $LOCATION_ID \
       -c application-cluster-0 \
       --service-endpoint visionai.googleapis.com \
  send video-file  --file-path $INPUT_VIDEO \
  applying motion-filter
         --motion-sensitivity=$MOTION_SENSITIVITY \
         --min-event-length=$MIN_EVENT_LENGTH \
         --lookback-length=$LOOK_BACK_WINDOW \
         --cooldown-length=$COOL_DOWN_PERIOD \
         --zone_annotation=ZONE_ANNOTATION \
         --exclude_annotated_zone=$EXCLUDE_ANNOTATED_ZONE \
  to streams motion-detection-stream --loop

vaictl 取り込みオペレーションの開始から動画がダッシュボードに表示されるまで、約 100 秒かかることがあります。

ストリームの取り込みが完了すると、トラフィック ストリームを選択して、Vertex AI Vision ダッシュボードの [ストリーム] タブで動画フィードを確認できます。

[ストリーム] タブに移動

結果をローカル ストレージに送信する

このコマンドは、動画ファイルをストリームにストリーミングします。–loop フラグを使用すると、コマンドを停止するまで動画がストリームにループされます。このコマンドはバックグラウンド ジョブとして実行され、ストリーミングが継続されます。

先頭に nohup、末尾に & を追加して、バックグラウンド ジョブにします。

OUTPUT_PATH=<path_to_store_motion_events>

vaictl -p $PROJECT \
       -l $LOCATION_ID \
       -c application-cluster-0 \
       --service-endpoint visionai.googleapis.com \
  send video-file  --file-path $INPUT_VIDEO \
  applying motion-filter
         --motion-sensitivity=$MOTION_SENSITIVITY \
         --min-event-length=$MIN_EVENT_LENGTH \
         --lookback-length=$LOOK_BACK_WINDOW \
         --cooldown-length=$COOL_DOWN_PERIOD \
         --zone_annotation=$ZONE_ANNOTATION \
         --exclude_annotated_zone=$EXCLUDE_ANNOTATED_ZONE \
  to mp4file --mp4-file-path=$OUTPUT_PATH --loop

7. 完了

お疲れさまでした。これでラボは完了です。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、コマンドラインで ctrl + z を使用して vaictl SDK オペレーションを終了します。

リソース

https://cloud.google.com/vision-ai/docs/overview

https://cloud.google.com/vision-ai/docs/motion-filtering-model

https://cloud.google.com/vision-ai/docs/create-manage-streams

フィードバック

こちらをクリックしてフィードバックをお送りください

アンケート

このチュートリアルをどのように使用されますか?

通読するのみ 通読し、演習を行う

この Codelab はお役に立ちましたか?

非常に役に立った ある程度役に立った