Vertex AI Vision のトラフィック モニタリング アプリ

1. 目標

概要

この Codelab では、リアルタイムの交通状況の動画映像をモニタリングするための Vertex AI Vision アプリケーションをエンドツーエンドで作成することに焦点を当てます。事前トレーニング済みの Specialized モデル Occupancy analytics の組み込み機能を使用して、次のものをキャプチャします。

  • 特定のラインで道路を横断する車両と人の数をカウントします。
  • 道路の任意の固定領域内の車両数/人数をカウントします。
  • 道路の任意の場所の渋滞を検出する。

学習内容

  • ストリーミング用の動画を取り込むように VM を設定する方法
  • Vertex AI Vision でアプリケーションを作成する方法
  • Occupancy Analytics で利用できるさまざまな機能とその使用方法
  • アプリをデプロイする方法
  • ストレージの Vertex AI Vision の Media Warehouse で動画を検索する方法。
  • 出力を BigQuery に接続する方法、モデルの JSON 出力から分析情報を抽出する SQL クエリを記述する方法、Looker Studio で結果をリアルタイムで可視化する方法について説明します。

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. 動画をストリーミングする VM を設定する

Occupancy Analytics でアプリを作成する前に、アプリで後で使用できるストリームを登録する必要があります。

このチュートリアルでは、動画をホストする Compute Engine VM インスタンスを作成し、その VM からストリーミング動画データを送信します。

Linux VM を作成する

Compute Engine VM インスタンスから動画を送信する最初の手順は、VM インスタンスの作成です。

  1. コンソールで [VM インスタンス] ページに移動します。[VM インスタンス] に移動
  2. プロジェクトを選択し、[続行] をクリックします。
  3. [インスタンスを作成] をクリックします。
  4. VM の名前を指定します。詳細については、リソースの命名規則をご覧ください。
  5. (省略可)この VM のゾーンを変更します。Compute Engine は、複数のゾーンで各リージョンが均等に使用されるように、各リージョン内でゾーンのリストをランダム化します。
  6. 残りのデフォルト オプションはそのままにします。これらのオプションの詳細については、VM を作成して起動するをご覧ください。
  7. VM を作成して起動するには、[作成] をクリックします。

VM 環境を設定する

VM が起動したら、コンソールを使用してブラウザから VM に SSH 接続できます。次に、vaictl コマンドライン ツールをダウンロードして、動画をストリームに取り込むことができます。

VM への SSH 接続を確立する

  1. コンソールで [VM インスタンス] ページに移動します。[VM インスタンス] に移動
  2. 作成したインスタンス行の [接続] セクションで、[SSH] をクリックします。新しいブラウザ ウィンドウに SSH 接続が開きます。UI の SSH オプション

vaictl コマンドライン ツールをダウンロードする

  1. ブラウザ内 SSH ウィンドウで、次のコマンドを使用して Vertex AI Vision(vaictl)コマンドライン ツールをダウンロードします。
wget https://github.com/google/visionai/releases/download/v0.0.4/visionai_0.0-4_amd64.deb
  1. 次のコマンドを実行して、コマンドライン ツールをインストールします。
sudo apt install ./visionai_0.0-4_amd64.deb
  1. インストールをテストするには、次のコマンドを実行します。
vaictl --help

4. ストリーミング用の動画ファイルを取り込む

VM 環境を設定したら、サンプル動画ファイルをコピーし、vaictl を使用して動画データを占有率分析アプリにストリーミングできます。

まず、Cloud Console で Vision AI API を有効にします。

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

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

ストリームの登録には数分かかります。

サンプル動画を VM にコピーする

  1. VM の [ブラウザでの SSH] ウィンドウで、次の 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 .

VM から動画をストリーミングし、ストリームにデータを取り込む

  1. このローカル動画ファイルをアプリの入力ストリームに送信するには、次のコマンドを使用します。次の変数を置き換える必要があります。
  • 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
export LOCAL_FILE=street_vehicles_people.mp4
  1. このコマンドは、動画ファイルをストリームにストリーミングします。–loop フラグを使用すると、コマンドを停止するまで動画がストリームにループされます。このコマンドはバックグラウンド ジョブとして実行されるため、VM が切断された後もストリーミングが継続されます。
  • (nohup を先頭に追加し、末尾に「&」を追加してバックグラウンド ジョブにします)。
nohup vaictl -p $PROJECT_ID \
    -l $LOCATION_ID \
    -c application-cluster-0 \
    --service-endpoint visionai.googleapis.com \
send video-file to streams 'traffic-stream' --file-path $LOCAL_FILE --loop &

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

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

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

UI でライブ動画がストリーミングされている様子Google Cloud コンソールで、ストリームに取り込まれる動画のライブビュー。動画提供: Elizabeth MavorPixabay)(ピクセル化を追加)。

5. アプリケーションを作成する

最初のステップは、データを処理するアプリを作成することです。アプリは、次のものを接続する自動化されたパイプラインと考えることができます。

  • データの取り込み: 動画フィードがストリームに取り込まれます。
  • データ分析: 取り込み後に AI(コンピュータ ビジョン)モデルを追加できます。
  • データ ストレージ: 動画フィードの 2 つのバージョン(元のストリームと AI モデルで処理されたストリーム)をメディア ウェアハウスに保存できます。

Google Cloud コンソールでは、アプリはグラフとして表されます。

空のアプリを作成する

アプリグラフにデータを入力する前に、まず空のアプリを作成する必要があります。

Google Cloud コンソールでアプリを作成します。

  1. Google Cloud のコンソールに移動します。
  2. Vertex AI Vision ダッシュボードの [アプリケーション] タブを開きます。

[アプリケーション] タブに移動

  1. [作成] ボタンをクリックします。
  2. アプリ名として「traffic-app」と入力し、リージョンを選択します。
  3. [作成] をクリックします。

アプリ コンポーネント ノードを追加する

空のアプリケーションを作成したら、次の 3 つのノードをアプリグラフに追加できます。

  1. 取り込みノード: 作成した Compute Engine VM インスタンスから送信されたデータを取り込むストリーム リソース。
  2. 処理ノード: 取り込まれたデータに対して動作する占有率分析モデル。
  3. ストレージ ノード: 処理済みの動画を保存し、メタデータ ストアとして機能するメディア ウェアハウス。メタデータ ストアには、取り込まれた動画データに関する分析情報と、AI モデルによって推論された情報が含まれます。

コンソールでアプリにコンポーネント ノードを追加します。

  1. Vertex AI Vision ダッシュボードの [アプリケーション] タブを開きます。[アプリケーション] タブに移動
  2. トラフィック アプリの行で、[グラフを表示] を選択します。処理パイプラインのグラフ表示が表示されます。

データ取り込みノードを追加する

  1. 入力ストリーム ノードを追加するには、サイドメニューの [コネクタ] セクションで [ストリーム] オプションを選択します。
  2. 開いた [ストリーム] メニューの [ソース] セクションで、[ストリームを追加] を選択します。
  3. [ストリームを追加] メニューで、[新しいストリームを登録] を選択し、ストリーム名として traffic-stream を追加します。
  4. ストリームをアプリグラフに追加するには、[ストリームを追加] をクリックします。

データ処理ノードを追加する

  1. 占有数モデルノードを追加するには、サイドメニューの [Specialized models] セクションで [occupancy analytics] オプションを選択します。
  2. デフォルトで選択されている [人物] と [車両] はそのままにします。
  3. ライン クロッシングにラインを追加します。マルチポイント線ツールを使用して、車両や人の出入りを検出する必要がある場所に線を描画します。
  4. アクティブ ゾーンを描画して、そのゾーン内の人や車両をカウントします。
  5. アクティブ ゾーンが描画された場合に混雑を検出するための滞留時間の設定を追加しました。
  • (現在、アクティブ ゾーンとライン クロッシングの両方を同時にサポートしていません。一度に使用できる機能は 1 つのみです)。

3acdb6f1e8474e07.png ce63449d601995e9.png

194c54d2bbcf7e8a.png

データ ストレージ ノードを追加する

  1. 出力先(ストレージ)ノードを追加するには、サイドメニューの [コネクタ] セクションで [Vertex AI Vision の Media Warehouse] オプションを選択します。
  2. [Vertex AI Vision のメディア ウェアハウス] メニューで、[ウェアハウスを接続] をクリックします。
  3. [ウェアハウスを接続] メニューで、[新しいウェアハウスを作成] を選択します。ウェアハウスに traffic-warehouse という名前を付け、TTL の期間を 14 日のままにします。
  4. [作成] ボタンをクリックしてウェアハウスを追加します。

6. 出力を BigQuery テーブルに接続する

BigQuery コネクタを Vertex AI Vision アプリに追加すると、接続されているすべてのアプリモデルの出力がターゲット テーブルに取り込まれます。

独自の BigQuery テーブルを作成し、アプリに BigQuery コネクタを追加するときにそのテーブルを指定するか、Vertex AI Vision アプリ プラットフォームにテーブルを自動的に作成させることができます。

テーブルの自動作成

Vertex AI Vision アプリ プラットフォームでテーブルを自動的に作成する場合は、BigQuery コネクタノードを追加するときにこのオプションを指定できます。

テーブルの自動作成を使用する場合は、次のデータセットとテーブルの条件が適用されます。

  • データセット: 自動的に作成されるデータセット名は visionai_dataset です。
  • テーブル: 自動的に作成されるテーブル名は visionai_dataset.APPLICATION_ID です。
  • エラー処理:
  • 同じデータセットに同じ名前のテーブルが存在する場合、自動作成は行われません。
  1. Vertex AI Vision ダッシュボードの [アプリケーション] タブを開きます。[アプリケーション] タブに移動
  2. リストからアプリケーションの名前の横にある [アプリを表示] を選択します。
  3. アプリケーション ビルダーのページで、[コネクタ] セクションから [BigQuery] を選択します。
  4. [BigQuery パス] フィールドは空のままにします。ee0b67d4ab2263d.png
  5. [store metadata from:] で、[occupancy Analytics] のみを選択し、ストリームのチェックを外します。

最終的なアプリグラフは次のようになります。

1787242465fd6da7.png

7. アプリをデプロイして使用できるようにする

必要なコンポーネントをすべて使用してエンドツーエンドのアプリを構築したら、アプリを使用するための最後のステップとして、アプリをデプロイします。

  1. Vertex AI Vision ダッシュボードの [アプリケーション] タブを開きます。[アプリケーション] タブに移動
  2. リストで traffic-app アプリの横にある [グラフを表示] を選択します。
  3. アプリケーション グラフ ビルダーのページで、[デプロイ] ボタンをクリックします。
  4. 次の確認ダイアログで、[デプロイ] を選択します。デプロイ オペレーションが完了するまでに数分かかることがあります。デプロイが完了すると、ノードの横に緑色のチェックマークが表示されます。ee78bbf00e5db898.png

8. ストレージ ウェアハウスで動画コンテンツを検索する

動画データを処理アプリに取り込んだ後、分析された動画データを表示し、占有率分析情報に基づいてデータを検索できます。

  1. Vertex AI Vision ダッシュボードの [ウェアハウス] タブを開きます。[ウェアハウス] タブに移動
  2. リストで traffic-warehouse ウェアハウスを見つけて、[アセットを表示] をクリックします。
  3. [人数] または [車両数] セクションで、[最小] の値を 1 に、[最大] の値を 5 に設定します。
  4. Vertex AI Vision の Media Warehouse に保存されている処理済みの動画データをフィルタするには、[検索] をクリックします。

e636361b19738c8d.png

Google Cloud コンソールで検索条件に一致する保存済み動画データのビュー。動画提供者: Elizabeth MavorPixabay)(検索条件を適用)。

9. BigQuery テーブルの出力を分析する

BigQuery に移動

データセットを選択します: visionai_dataset

テーブル(この場合は traffic-app)を選択します。

テーブル名の右にあるその他アイコンをクリックし、[クエリ] をクリックします。

次のクエリを作成します。

Query1: 各ラインを通過する車両数を 1 分ごとに確認するクエリ

abc.sql

- Get list of active marked lines for each timeframe
WITH line_array AS (
  SELECT
  t.ingestion_time AS ingestion_time,
  JSON_QUERY_ARRAY(t.annotation.stats["crossingLineCounts"]) AS lines
  FROM
  `PROJ_ID.visionai_dataset.APP_ID` AS t
),
- Flatten active lines to get individual entities details
flattened AS (
  SELECT
  line_array.ingestion_time,
  JSON_VALUE(line.annotation.id) as line_id,
  JSON_QUERY_ARRAY(line["positiveDirectionCounts"]) AS entities
  FROM line_array, unnest(line_array.lines) as line
 )
- Generate aggregate vehicle count per zone w.r.t time 
SELECT
  STRING(TIMESTAMP_TRUNC(ingestion_time, MINUTE) ) AS time, line_id,
  SUM(INT64(entity["count"])) as vehicle_count
FROM
  flattened, UNNEST(flattened.entities) AS entity
WHERE JSON_VALUE(entity['entity']['labelString']) = 'Vehicle'
GROUP BY time, line_id

Query2: 各ゾーンの 1 分あたりの車両数をチェックするクエリ

- Get list of active zones for each timeframe
WITH zone_array AS (
     SELECT
     t.ingestion_time AS ingestion_time,
     JSON_QUERY_ARRAY(t.annotation.stats["activeZoneCounts"]) AS zones
     FROM
     `PROJ_ID.visionai_dataset.APP_ID` AS t
),
- Flatten active zones to get individual entities details
flattened AS (
   SELECT zone_array.ingestion_time, JSON_VALUE(zone.annotation.id) as zone_id,
         JSON_QUERY_ARRAY(zone["counts"]) AS entities
   FROM zone_array, unnest(zone_array.zones) as zone
 )
- Generate aggregate vehicle count per zone w.r.t time 
SELECT 
STRING(TIMESTAMP_TRUNC(ingestion_time, MINUTE) ) AS time, 
zone_id,
SUM(INT64(entity["count"])) as vehicle_count
FROM flattened, UNNEST(flattened.entities) AS entity
WHERE JSON_VALUE(entity['entity']['labelString']) = 'Vehicle'
GROUP BY time, zone_id

上記のクエリでは、「Vehicle」を「Person」に変更して、Person をカウントできます。

この Codelab では、Query1 のサンプルデータと可視化のみを示します。Query2 についても同様の手順で実行できます。

e6fd891f3a46246.png

右側のメニューで [データを探索] をクリックし、[Looker Studio で調べる] を選択します。

9e737ddb4d0d25b6.png

[ディメンション] ペインで時間を追加し、時間構成を日時に変更します。「内訳ディメンション」に line_id を追加します。b5da9704ccd8db.png

上のグラフは、各ラインを通過する車両/人の数を 1 分ごとに示しています。

濃い青色のバーと薄い青色のバーは、2 つの異なる line-id を示しています。

10. 完了

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

クリーンアップ

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

プロジェクトの削除

リソースを個別に削除する

リソース

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

https://cloud.google.com/vision-ai/docs/occupancy-count-tutorial

フィードバック

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

アンケート

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

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

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

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