1. 目標
概要
この Codelab では、イベント管理機能を使用してイベントを送信するための Vertex AI Vision アプリケーションをエンドツーエンドで作成することに焦点を当てます。事前トレーニング済みの Specialized モデル Occupancy analytics の組み込み機能を使用して、次のキャプチャに基づいてイベントを生成します。
- 特定のラインで道路を横断する車両と人の数をカウントします。
- 道路の任意の固定領域内の車両数/人数をカウントします。
- 道路の任意の場所の渋滞を検出する。
学習内容
- ストリーミング用の動画を取り込む方法
- Vertex AI Vision でアプリケーションを作成する方法
- Occupancy Analytics で利用できるさまざまな機能とその使用方法
- アプリをデプロイする方法
- ストレージの Vertex AI Vision の Media Warehouse で動画を検索する方法。
- Occupancy Analytics モデルのデータを処理する Cloud Functions を作成する方法。
- Pub/Sub トピックとサブスクリプションを作成する方法。
- Pub/Sub トピックを介してイベントを送信するようにイベント管理を設定する方法。
2. 始める前に
- 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. ストリーミング用の動画ファイルを取り込む
vaictl を使用して、占有率分析アプリに動画データをストリーミングできます。
まず、Cloud Console で Vision AI API を有効にします。
新しいストリームを登録する
- Vertex AI Vision の左側のパネルで [ストリーム] タブをクリックします。
- [登録] をクリックします。
- [ストリーム名] に「traffic-stream」と入力します。
- リージョンに「us-central1」と入力します。
- [登録] をクリックします。
ストリームの登録には数分かかります。
サンプル動画を準備する
- 次の 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 .
ストリームにデータを取り込む
- このローカル動画ファイルをアプリの入力ストリームに送信するには、次のコマンドを使用します。次の変数を置き換える必要があります。
- 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 フラグを使用すると、コマンドを停止するまで動画がストリームにループされます。このコマンドはバックグラウンド ジョブとして実行され、ストリーミングが継続されます。
- (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 ダッシュボードの [ストリーム] タブで動画フィードを確認できます。
Google Cloud コンソールで、ストリームに取り込まれる動画のライブビュー。動画提供: Elizabeth Mavor(Pixabay)(ピクセル化を追加)。
4. Cloud Functions の関数を作成する
モデルのデータを処理し、後でイベント チャンネルを介して送信されるイベントを生成する Cloud Functions が必要になります。
Cloud Functions の詳細については、こちらをご覧ください。
モデルをリッスンする Cloud Functions 関数を作成する
- Cloud Functions UI の作成ページに移動します。
- 関数名を設定します。この関数名は、後でイベント管理の設定でこの Cloud Functions を参照するために使用されます。
- リージョンがアプリケーションと一致していることを確認します。
- トリガー設定を調整して保存します。
- [次へ] ボタンをクリックして、[コード] 部分に進みます。

- クラウド関数を編集します。Node.js ランタイムの例を次に示します。
/**
* Responds to any HTTP request.
*
* @param {!express:Request} req HTTP request context.
* @param {!express:Response} res HTTP response context.
*/
exports.hello_http = (req, res) => {
// Logging statement can be read with cmd `gcloud functions logs read {$functionName}`.
// For more about logging, please see https://cloud.google.com/functions/docs/monitoring
// The processor output will be stored in req.body.
const messageString = constructMessage(req.body);
// Send your message to operator output with res HTTP response context.
res.status(200).send(messageString);
};
function constructMessage(data) {
/**
* Typically, your processor output should contains appPlatformMetadata & it's designed output.
* For example here, if your output is of tyoe OccupancyCountingPredictionResult, you will need
* to construct the return annotation as such.
*/
// access appPlatformMetat.
const appPlatformMetadata = data.appPlatformMetadata;
// access annotations.
const annotations = data.annotations.map(annotation => {
// This is a mock OccupancyCountingPredictionResult annotation.
return {"annotation" : {"track_info": {"track_id": "12345"}}};
});
const events = [];
for(const annotation of annotations) {
events.push({
"event_message": "Detection event",
"payload" : {
"description" : "object detected"
},
"event_id" : "track_id_12345"
});
}
/**
* Typically, your cloud function should return a string represent a JSON which has two fields:
* "annotations" must follow the specification of the target model.
* "events" should be of type "AppPlatformEventBody".
*/
const messageJson = {
"annotations": annotations,
"events": events,
};
return JSON.stringify(messageJson);
}
- [デプロイ] ボタンをクリックして関数をデプロイします。
5. Pub/Sub トピックとサブスクリプションを作成する
アプリケーションにイベントを送信できる Pub/Sub トピックを指定する必要があります。イベントを受信するには、Pub/Sub サブスクリプションが構成されたオプティクスに登録する必要があります。
Pub/Sub トピックの詳細についてはこちら、サブスクリプションの詳細についてはこちらをご覧ください。
Pub/Sub トピックを作成する
Pub/Sub トピックを作成するには、gcloud CLI を使用します(SUBSCRIPTION_ID は、設定の実際の値に置き換える必要があります)。
gcloud pubsub topics create TOPIC_ID
または、Pub/Sub UI を使用することもできます。
Pub/Sub サブスクリプションを作成する
Pub/Sub サブスクリプションを作成するには、gcloud CLI を使用します(SUBSCRIPTION_ID と TOPIC_ID は、設定の実際の値に置き換えてください)。
gcloud pubsub subscriptions create SUBSCRIPTION_ID \
--topic=TOPIC_ID \
または、Pub/Sub UI を使用することもできます。
6. アプリケーションを作成する
最初のステップは、データを処理するアプリを作成することです。アプリは、次のものを接続する自動化されたパイプラインと考えることができます。
- データの取り込み: 動画フィードがストリームに取り込まれます。
- データ分析: 取り込み後に AI(コンピュータ ビジョン)モデルを追加できます。
- データ ストレージ: 動画フィードの 2 つのバージョン(元のストリームと AI モデルで処理されたストリーム)をメディア ウェアハウスに保存できます。
Google Cloud コンソールでは、アプリはグラフとして表されます。
空のアプリを作成する
アプリグラフにデータを入力する前に、まず空のアプリを作成する必要があります。
Google Cloud コンソールでアプリを作成します。
- Google Cloud のコンソールに移動します。
- Vertex AI Vision ダッシュボードの [アプリケーション] タブを開きます。
- [作成] ボタンをクリックします。
- アプリ名として「traffic-app」と入力し、リージョンを選択します。
- [作成] をクリックします。
アプリ コンポーネント ノードを追加する
空のアプリケーションを作成したら、次の 3 つのノードをアプリグラフに追加できます。
- 取り込みノード: データを取り込むストリーム リソース。
- 処理ノード: 取り込まれたデータに対して動作する占有率分析モデル。
- ストレージ ノード: 処理済みの動画を保存し、メタデータ ストアとして機能するメディア ウェアハウス。メタデータ ストアには、取り込まれた動画データに関する分析情報と、AI モデルによって推論された情報が含まれます。
コンソールでアプリにコンポーネント ノードを追加します。
- Vertex AI Vision ダッシュボードの [アプリケーション] タブを開きます。[アプリケーション] タブに移動
- トラフィック アプリの行で、[グラフを表示] を選択します。処理パイプラインのグラフ表示が表示されます。
データ取り込みノードを追加する
- 入力ストリーム ノードを追加するには、サイドメニューの [コネクタ] セクションで [ストリーム] オプションを選択します。
- 開いた [ストリーム] メニューの [ソース] セクションで、[ストリームを追加] を選択します。
- [ストリームを追加] メニューで、[新しいストリームを登録] を選択し、ストリーム名として traffic-stream を追加します。
- ストリームをアプリグラフに追加するには、[ストリームを追加] をクリックします。
データ処理ノードを追加する
- 占有数モデルノードを追加するには、サイドメニューの [Specialized models] セクションで [occupancy analytics] オプションを選択します。
- デフォルトで選択されている [人物] と [車両] はそのままにします。
- ライン クロッシングにラインを追加します。マルチポイント線ツールを使用して、車両や人の出入りを検出する必要がある場所に線を描画します。
- アクティブ ゾーンを描画して、そのゾーン内の人や車両をカウントします。
- アクティブ ゾーンが描画された場合に混雑を検出するための滞留時間の設定を追加しました。
- (現在、アクティブ ゾーンとライン クロッシングの両方を同時にサポートしていません。一度に使用できる機能は 1 つのみです)。


データ ストレージ ノードを追加する
- 出力先(ストレージ)ノードを追加するには、サイドメニューの [コネクタ] セクションで [Vertex AI Vision の Media Warehouse] オプションを選択します。
- [Vertex AI Vision のメディア ウェアハウス] メニューで、[ウェアハウスを接続] をクリックします。
- [ウェアハウスを接続] メニューで、[新しいウェアハウスを作成] を選択します。ウェアハウスに traffic-warehouse という名前を付け、TTL の期間を 14 日のままにします。
- [作成] ボタンをクリックしてウェアハウスを追加します。
7. イベント管理を構成する
Duration 02:00
モデルを後処理用に以前に作成した Cloud Functions に接続します。Cloud Functions はモデルの出力を自由に処理し、ニーズに合ったイベントを生成できます。次に、事前に作成した Pub/Sub トピックをターゲットとして構成して、イベント チャネルを構成します。最小間隔を設定することもできます。これにより、イベント チャンネルが短期間に同じイベントで溢れるのを防ぐことができます。
後処理用の Cloud Functions の関数を選択する
- アプリケーション グラフのデータ処理ノード(occupancy analytics)をクリックして、サイドメニューを開きます。
- [後処理] プルダウンで Cloud Functions(関数名で識別)を選択します。
- アプリケーション グラフの変更は自動的に保存されます。

イベント チャネルを構成する
- アプリケーション グラフのデータ処理ノード(occupancy analytics)をクリックして、サイドメニューを開きます。
- [Event Notification] セクションで [SET UP EVENT NOTIFICATION] をクリックします。

- プルダウンで Pub/Sub トピックを選択します。
- (省略可)イベント パブリッシュの最小間隔/頻度を設定します。

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

9. Pub/Sub サブスクリプションでイベント/メッセージを確認する
動画データを処理アプリに取り込んだ後、Cloud Functions は占有率分析モデルがアノテーションを出力するとイベントを生成します。これらのイベントは、Pub/Sub トピックを介してメッセージとしてパブリッシュされ、サブスクリプションによって受信されます。
次の手順は、pull サブスクリプションがあることを前提としています。
- プロジェクトの Pub/Sub サブスクリプション リストを開き、対応するサブスクリプションを見つけます。Pub/Sub サブスクリプション リストページに移動
- [メッセージ] タブに移動します。
- [pull] ボタンをクリックします。
- 表でメッセージを確認します。

また、UI なしでメッセージを受信する方法もご覧ください。[サブスクリプション] ページに移動
10. 完了
お疲れさまでした。これでラボは完了です。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトの削除
リソースを個別に削除する
リソース
https://cloud.google.com/vision-ai/docs/overview
https://cloud.google.com/vision-ai/docs/occupancy-count-tutorial
フィードバック