1. 目標
概要
この Codelab では、リアルタイムの交通状況の動画映像をモニタリング するための Vertex AI Vision アプリケーションをエンドツーエンドで作成する方法について説明します。事前トレーニング済みの Specialized モデル Occupancy analytics' の組み込み機能を使用して、次のことを行います。
- 特定のラインを通過する車両と人の数をカウントする。
- 道路の固定された領域にいる車両または人の数をカウントする。
- 道路の任意の場所の渋滞を検出する。
学習内容
- 動画をストリーミングするための VM を取り込み用に設定する方法
- Vertex AI Vision でアプリケーションを作成する方法
- Occupancy Analytics で使用できるさまざまな機能とその使用方法
- アプリをデプロイする方法
- Vertex AI Vision の Media Warehouse に保存されている動画を検索する方法。
- 出力を BigQuery に接続し、SQL クエリを作成してモデルの JSON 出力から分析情報を抽出し、Looker Studio で結果をリアルタイムで可視化する方法。
2. 始める前に
- Google Cloud コンソールのプロジェクト セレクタ ページで、Google Cloud プロジェクトを選択または Google Cloud プロジェクトを作成します。注: この手順で作成するリソースをそのまま保持する予定でない場合、既存のプロジェクトを選択するのではなく、新しいプロジェクトを作成してください。チュートリアルの終了後にそのプロジェクトを削除すれば、プロジェクトに関連するすべてのリソースを削除できます。プロジェクト セレクタに移動
- Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
- Compute Engine API と Vision AI API を有効にします。API を有効にする
サービス アカウントを作成します。
- Google Cloud コンソールで [サービス アカウントの作成] ページに移動します。[サービス アカウントの作成] に移動
- プロジェクトを選択します。
- [サービス アカウント名] フィールドに名前を入力します。Google Cloud コンソールでは、この名前に基づいて [サービス アカウント ID] フィールドに値が設定されます。[サービス アカウントの説明] フィールドに説明を入力します。例: クイックスタート用のサービス アカウント。
- [作成して続行] をクリックします。
- プロジェクトへのアクセス権限を付与するには、サービス アカウントに次のロールを付与します。Vision AI > Vision AI 編集者、Compute Engine > Compute インスタンス管理者(ベータ版)、Storage > Storage オブジェクト閲覧者 † 。[ロールを選択] リストでロールを選択します。ロールを追加するには、[別のロールを追加] をクリックします。注: ロール フィールドは、サービス アカウントがプロジェクト内のどのリソースにアクセスできるかに影響します。これらのロールは後で取り消すことも、追加のロールを付与することもできます。本番環境では、オーナー、編集者、閲覧者のロールを付与しないでください。代わりに、ニーズに合わせて 事前定義ロール または カスタムロール を付与します。
- [続行] をクリックします。
- [完了] をクリックして、サービス アカウントの作成を完了します。ブラウザ ウィンドウは閉じないでください。次のステップでこれを使用します。
サービス アカウント キーを作成します。
- Google Cloud コンソールで、作成したサービス アカウントのメールアドレスをクリックします。
- [キー] をクリックします。
- [鍵を追加]、[新しい鍵を作成] の順にクリックします。
- [作成] をクリックします。JSON キーファイルがパソコンにダウンロードされます。
- [閉じる] をクリックします。
- Google Cloud CLI をインストールして 初期化します。
† Cloud Storage バケットからサンプル動画ファイルをコピーする場合にのみ必要なロールです。
3. 動画をストリーミングする VM を設定する
Occupancy Analytics でアプリを作成する前に、アプリで後で使用できるストリームを登録する必要があります。
このチュートリアルでは、動画をホストする Compute Engine VM インスタンスを作成し、そのストリーミング動画データを VM から送信します。
Linux VM を作成する
Compute Engine VM インスタンスから動画を送信する最初の手順は、VM インスタンスを作成することです。
- コンソールで [VM インスタンス] ページに移動します。[VM インスタンス] に移動
- プロジェクトを選択し、[続行] をクリックします。
- [インスタンスを作成] をクリックします。
- VM の名前 を指定します。詳しくは、リソースの命名規則をご覧ください。
- (省略可)この VM のゾーン を変更します。Compute Engine は、複数のゾーンで各リージョンが均等に使用されるように、各リージョン内でゾーンのリストをランダム化します。
- 残りのデフォルト オプションはそのままにします。これらのオプションの詳細については、VM を作成して起動するをご覧ください。
- VM を作成して起動するには、[作成] をクリックします。
VM 環境を設定する
VM が起動したら、コンソールを使用してブラウザから VM に SSH 接続できます。次に、vaictl コマンドライン ツールをダウンロードして、動画をストリームに取り込むことができます。
VM への SSH 接続を確立する
- コンソールで [VM インスタンス] ページに移動します。[VM インスタンス] に移動
- 作成したインスタンス行の [接続] セクションで、[SSH] をクリックします。新しいブラウザ ウィンドウで SSH 接続が開きます。

vaictl コマンドライン ツールをダウンロードする
- [ブラウザでの SSH] ウィンドウで、次のコマンドを使用して Vertex AI Vision(vaictl)コマンドライン ツールをダウンロードします。
wget https://github.com/google/visionai/releases/download/v0.0.4/visionai_0.0-4_amd64.deb
- 次のコマンドを実行して、 コマンドライン ツールをインストールします。
sudo apt install ./visionai_0.0-4_amd64.deb
- 次のコマンドを実行して、インストールをテストできます。
vaictl --help
4. ストリーミング用の動画ファイルを取り込む
VM 環境を設定したら、サンプル動画ファイルをコピーし、vaictl を使用して動画データを Occupancy Analytics アプリにストリーミングできます。
まず、Cloud Console で Vision AI API を有効にします。
新しいストリームを登録する
- Vertex AI Vision の左側のパネルで [ストリーム] タブをクリックします。
- [登録] をクリックします。
- [ストリーム名] に「traffic-stream」と入力します。
- [リージョン] に「us-central1」と入力します。
- [登録] をクリックします。
ストリームが登録されるまでに数分かかります。
サンプル動画を VM にコピーする
- 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 から動画をストリーミングし、ストリームにデータを取り込む
- このローカル動画ファイルをアプリの入力ストリームに送信するには、次のコマンドを使用します。次の変数を置き換える必要があります。
- 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
- このコマンドは、動画ファイルをストリームにストリーミングします。–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 ingest オペレーションを開始してから、ダッシュボードに動画が表示されるまで 100 秒ほどかかることがあります。
ストリームの取り込みが利用可能になったら、traffic-stream ストリームを選択して、Vertex AI Vision ダッシュボードの [ストリーム] タブで動画フィードを確認できます。
Google Cloud コンソールでストリームに取り込まれる動画のライブビュー。Pixabay
5. アプリケーションを作成する
最初の手順は、データを処理するアプリを作成することです。アプリは、次のものを接続する自動パイプラインと考えることができます。
- データの取り込み: 動画フィードがストリームに取り込まれます。
- データ分析: 取り込み後に AI(Computer Vision)モデルを追加できます。
- データ ストレージ: 動画フィードの 2 つのバージョン(元のストリームと AI モデルで処理されたストリーム)をメディア ウェアハウスに保存できます。
Google Cloud コンソールでは、アプリはグラフとして表されます。
空のアプリを作成する
アプリグラフにデータを入力する前に、まず空のアプリを作成する必要があります。
Google Cloud コンソールでアプリを作成します。
- Google Cloud コンソールに移動します。
- Vertex AI Vision ダッシュボードの [アプリケーション] タブを開きます。
- add [作成] ボタンをクリックします。
- アプリ名として「traffic-app」と入力し、リージョンを選択します。
- [作成] をクリックします。
アプリ コンポーネント ノードを追加する
空のアプリケーションを作成したら、次の 3 つのノードをアプリグラフに追加できます。
- 取り込みノード: 作成した Compute Engine VM インスタンスから送信されたデータを取り込むストリーム リソース。
- 処理ノード: 取り込まれたデータに対して動作する Occupancy Analytics モデル。
- ストレージ ノード: 処理された動画を保存し、メタデータ ストアとして機能するメディア ウェアハウス。メタデータ ストアには、取り込まれた動画データに関する分析情報と、AI モデルによって推測された情報が含まれます。
コンソールでアプリにコンポーネント ノードを追加します。
- Vertex AI Vision ダッシュボードの [アプリケーション] タブを開きます。[アプリケーション] タブに移動
- traffic-app 行で、[**グラフを表示**] を選択します。処理パイプラインのグラフ表示に移動します。
データの取り込みノードを追加する
- 入力ストリーム ノードを追加するには、サイドメニューの [コネクタ] セクションで [ストリーム] オプションを選択します。
- 開いた [ストリーム] メニューの [ソース] セクションで、[ストリームを追加] を選択します。
- [ストリームを追加] メニューで、[新しいストリームを登録] を選択し、ストリーム名として「traffic-stream」を追加します。
- ストリームをアプリグラフに追加するには、[ストリームを追加] をクリックします。
データ処理ノードを追加する
- Occupancy Count モデルノードを追加するには、サイドメニューの [Specialized models] セクションで [Occupancy Analytics] オプションを選択します。
- デフォルトの選択 [人物] と [車両] はそのままにします。
- [Line crossing] に線を追加します。マルチポイント線ツールを使用して、車両や人が出入りする場所の線を描画します。
- アクティブ ゾーンを描画して、そのゾーン内の人や車両をカウントします。
- アクティブ ゾーンが描画されている場合は、滞留時間の設定を追加して渋滞を検出します。
- (現在、アクティブ ゾーンとライン クロッシングの両方を同時にサポートしていません。一度に 1 つの機能のみを使用してください)。


データ ストレージ ノードを追加する
- 出力先(ストレージ)ノードを追加するには、サイドメニューの [コネクタ] セクションで [Vertex AI Vision's Media Warehouse] オプションを選択します。
- [Vertex AI Vision の Media Warehouse] メニューで、[ウェアハウスを接続] をクリックします。
- [ウェアハウスを接続] メニューで、[新しいウェアハウスを作成] を選択します。ウェアハウスに「traffic-warehouse」という名前を付け、TTL の期間を 14 日のままにします。
- [作成] ボタンをクリックしてウェアハウスを追加します。
6. 出力を BigQuery テーブルに接続する
Vertex AI Vision アプリに BigQuery コネクタを追加すると、接続されているアプリモデルの出力がすべてターゲット テーブルに取り込まれます。
独自の BigQuery テーブルを作成し、アプリに BigQuery コネクタを追加するときにそのテーブルを指定することも、Vertex AI Vision アプリ プラットフォームでテーブルを自動的に作成することもできます。
テーブルの自動作成
Vertex AI Vision アプリ プラットフォームでテーブルを自動的に作成する場合は、BigQuery コネクタ ノードを追加するときにこのオプションを指定できます。
テーブルの自動作成を使用する場合は、次のデータセットとテーブルの条件が適用されます。
- データセット: 自動的に作成されるデータセット名は visionai_dataset です。
- テーブル: 自動的に作成されるテーブル名は visionai_dataset.APPLICATION_ID です。
- エラー処理:
- 同じデータセットに同じ名前のテーブルが存在する場合、自動作成は行われません。
- Vertex AI Vision ダッシュボードの [アプリケーション] タブを開きます。[アプリケーション] タブに移動
- リストからアプリケーション名の横にある [アプリを表示] を選択します。
- アプリケーション ビルダーページで、[コネクタ] セクションから [BigQuery] を選択します。
- [BigQuery のパス] フィールドは空のままにします。

- [store metadata from:] で [Occupancy Analytics] のみを選択し、ストリームのチェックを外します。
最終的なアプリグラフは次のようになります。

7. アプリをデプロイして使用できるようにする
必要なコンポーネントをすべて含むエンドツーエンドのアプリを構築したら、アプリを使用するための最後の手順として、アプリをデプロイします。
- Vertex AI Vision ダッシュボードの [アプリケーション] タブを開きます。[アプリケーション] タブに移動
- リストで traffic-app アプリの横にある [グラフを表示] を選択します。
- アプリケーション グラフ ビルダーページで、[デプロイ] ボタンをクリックします。
- 次の確認ダイアログで、[デプロイ] を選択します。デプロイ オペレーションが完了するまでに数分かかることがあります。デプロイが完了すると、ノードの横に緑色のチェックマークが表示されます。

8. ストレージ ウェアハウスで動画コンテンツを検索する
処理アプリに動画データを取り込んだら、分析された動画データを表示し、Occupancy Analytics 情報に基づいてデータを検索できます。
- Vertex AI Vision ダッシュボードの [ウェアハウス] タブを開きます。[ウェアハウス] タブに移動
- リストで traffic-warehouse ウェアハウスを見つけて、[アセットを表示] をクリックします。
- [People count] または [Vehicle count] セクションで、[Min] の値を 1 に、[Max] の値を 5 に設定します。
- Vertex AI Vision の Media Warehouse に保存されている処理済み動画データをフィルタするには、[検索] をクリックします。

Google Cloud コンソールで検索条件に一致する保存済み動画データのビュー。Pixabay
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 では、クエリ 1 のサンプルデータと可視化のみを示します。クエリ 2 についても同様の手順を行うことができます。

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

[ディメンション] ペインで [時間] を追加し、時間構成を [日付と時刻] に変更します。[内訳ディメンション] に line_id を追加します。 
上のグラフは、各ラインを通過する車両または人の数を 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
フィードバック