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

1. 目標

概要

この Codelab では、リアルタイムの交通動画の映像をモニタリングするためのエンドツーエンドの Vertex AI Vision アプリケーションの作成に焦点を当てます。事前トレーニング済みの専用モデルの利用人数の分析を使用します。次のようなものをキャプチャします。

  • 特定の線で道路を横断する車両や人の数を数える。
  • 道路の一定の区間にある車両/人の数をカウントします。
  • 道路のあらゆる部分の渋滞を検出します。

学習内容

  • ストリーミング用の動画を取り込むために VM を設定する方法
  • Vertex AI Vision でアプリケーションを作成する方法
  • Occupancy Analytics で利用可能なさまざまな機能と使用方法
  • アプリをデプロイする方法
  • Vertex AI Vision のメディア ウェアハウス内の動画を検索する方法。
  • 出力を 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 オブジェクト閲覧者 † .[ロールを選択] リストで、ロールを選択します。ロールを追加するには、[別のロールを追加] をクリックして各ロールを追加します。: [ロール] フィールドは、サービス アカウントがプロジェクト内のどのリソースにアクセスできるかに影響します。これらのロールは後で取り消すことも、追加のロールを付与することもできます。本番環境では、オーナー、編集者、閲覧者のロールを付与しないでください。代わりに、ニーズに合わせて事前定義ロールまたはカスタムロールを付与します。
  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 が起動したら、コンソールを使用してブラウザから SSH で VM に接続できます。次に、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. [Register] をクリックします。
  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. [作成] の追加ボタンをクリックします。
  2. アプリ名として「traffic-app」と入力し、リージョンを選択します。
  3. [作成] をクリックします。

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

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

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

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

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

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

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

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

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

3acdb6f1e8474e07.png ce63449d601995e9.png

194c54d2bbcf7e8a.png

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

  1. 出力先(ストレージ)ノードを追加するには、サイドメニューの [コネクタ] セクションで [Vertex AI Vision のメディア ウェアハウス] オプションを選択します。
  2. [Vertex AI Vision のメディア ウェアハウス] メニューで、[ウェアハウスを接続] をクリックします。
  3. [Connect warehouse] メニューで、[Create new warehouse] を選択します。ウェアハウスの 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. リストのアプリケーション名の横にある [View app] を選択します。
  3. アプリケーション ビルダー ページの [Connectors] セクションで、[BigQuery] を選択します。
  4. [BigQuery のパス] フィールドは空のままにします。ee0b67d4ab2263d.png
  5. [ストアのメタデータ] で、[occupancy Analytics] のみを選択します。ストリームのチェックボックスをオフにします。

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

1787242465fd6da7.png

7. 使用するアプリをデプロイする

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

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

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

動画データを処理アプリに取り込むと、分析された動画データを表示し、利用人数の分析情報に基づいてデータを検索できます。

  1. Vertex AI Vision ダッシュボードの [ウェアハウス] タブを開きます。[ウェアハウス] タブに移動
  2. リストでトラフィック ウェアハウス ウェアハウスを見つけて、[アセットを表示] をクリックします。
  3. [People count] または [Vehicle count] セクションで、[Min] の値を 1、[Max] の値を 5 に設定します。
  4. Vertex AI Vision のメディア ウェアハウスに保存されている処理済みの動画データをフィルタするには、[検索] をクリックします。

e636361b19738c8d.png

Google Cloud コンソールの検索条件に一致する動画データのビュー。動画クレジット: Elizabeth MavorPixabay検索条件適用)。

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

BigQuery に移動

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

テーブルを選択: APPLICATION_ID(この場合は 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

クエリ 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 のサンプルデータと可視化についてのみ説明します。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 はどの程度役に立ちましたか?

<ph type="x-smartling-placeholder"></ph> とても役に立った 役に立った