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

1. 目標

概要

この Codelab では、リアルタイムの交通動画をモニタリングする Vertex AI Vision アプリケーションをエンドツーエンドで作成することに焦点を当てます。事前トレーニング済みの専門モデル「占有率分析」の組み込み機能を使用して、次の情報をキャプチャします。

  • 特定の線で道路を横断する車両と人の数をカウントします。
  • 道路の任意の固定領域内の車両数や人数をカウントします。
  • 道路の任意の部分で渋滞を検出する。

学習内容

  • ストリーミング用に動画を取り込む VM を設定する方法
  • Vertex AI Vision でアプリケーションを作成する方法
  • 宿泊状況アナリティクスで利用できるさまざまな機能とその使用方法
  • アプリをデプロイする方法
  • ストレージ Vertex AI Vision の Media Warehouse で動画を検索する方法。
  • 出力を BigQuery に接続し、SQL クエリを記述してモデルの JSON 出力から分析情報を抽出し、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 インスタンス管理者(ベータ版)]、[ストレージ] > [ストレージ オブジェクト閲覧者] †。[ロールを選択] リストでロールを選択します。ロールを追加するには、[別のロールを追加] をクリックして各ロールを追加します。: [ロール] フィールドは、サービス アカウントがプロジェクト内のどのリソースにアクセスできるかに影響します。これらのロールは後で取り消すことも、追加のロールを付与することもできます。本番環境では、オーナー、編集者、閲覧者のロールを付与しないでください。代わりに、ニーズに合わせて事前定義ロールまたはカスタムロールを付与します。
  6. [続行] をクリックします。
  7. [完了] をクリックして、サービス アカウントの作成を完了します。ブラウザ ウィンドウは閉じないでください。次のステップでこれを使用します。

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

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

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

3. 動画をストリーミングする VM を設定する

占有状況アナリティクスでアプリを作成する前に、アプリで後で使用できるストリームを登録する必要があります。

このチュートリアルでは、動画をホストする 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 コンソールで Vision AI API を有効にします。

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

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

ストリームの登録が完了するまでに数分かかります。

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

  1. VM のブラウザでの SSH ウィンドウで、次の gsutil cp コマンドを使用してサンプル動画をコピーします。次の変数を置き換えます。
  • ソース: 使用する動画ファイルの場所。独自の動画ファイルのソース(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. 追加アイコン Create ボタンをクリックします。
  2. アプリ名として traffic-app を入力し、リージョンを選択します。
  3. [作成] をクリックします。

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

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

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

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

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

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

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

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

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

3acdb6f1e8474e07.png ce63449d601995e9.png

194c54d2bbcf7e8a.png

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

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

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

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

独自の 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. [メタデータを取得するソース:] で [occupancy Analytics] のみを選択し、[streams] のチェックを外します。

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

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 コンソールの検索条件に一致する動画データのビュー。動画提供者: PixabayElizabeth Mavor検索条件が適用されています)。

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

BigQuery に移動

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

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

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

次のクエリを記述します。

クエリ 1: 各レーンを 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

クエリ 2: 各ゾーンにおける 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」に変更し、人数をカウントできます。

この Codelab では、Query1 のサンプルデータと可視化についてのみ説明します。クエリ 2 についても同様のプロセスを使用できます。

e6fd891f3a46246.png

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

9e737ddb4d0d25b6.png

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

上のグラフは、各ラインを 1 分あたり通過した車両/人の数を示しています。

濃い青色と薄い青色の棒は、2 つの異なるライン ID を示しています。

10.完了

これでラボは終了です。

クリーンアップ

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

プロジェクトの削除

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

リソース

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

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

フィードバック

フィードバックを送信する

アンケート

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

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

この Codelab はどの程度役に立ちましたか?

とても役立っている 役に立った