1. 目標
概要
この Codelab では、イベント管理機能を使用してイベントを送信する Vertex AI Vision アプリケーションをエンドツーエンドで作成する方法について説明します。事前トレーニング済みの Specialized モデル 利用人数分析' の組み込み機能を使用して、次のキャプチャに基づいてイベントを生成します。
- 特定のラインで道路を横断する車両と人の数をカウントします。
- 道路の固定された領域内の車両/人の数をカウントします。
- 道路の任意の場所の混雑を検出します。
学習内容
- ストリーミング用の動画を取り込む方法
- Vertex AI Vision でアプリケーションを作成する方法
- 利用人数分析で利用できるさまざまな機能とその使用方法
- アプリをデプロイする方法
- ストレージ Vertex AI Vision のメディア ウェアハウスで動画を検索する方法。
- 利用人数分析モデルのデータを処理する Cloud Functions の関数を作成する方法。
- Pub/Sub トピックとサブスクリプションを作成する方法。
- Pub/Sub トピックを介してイベントを送信するようにイベント管理を設定する方法。
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. ストリーミング用の動画ファイルを取り込む
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 ingest オペレーションを開始してから、ダッシュボードに動画が表示されるまで 100 秒ほどかかることがあります。
ストリームの取り込みが完了すると、traffic-stream ストリームを選択して、Vertex AI Vision ダッシュボードの [ストリーム] タブで動画フィードを確認できます。
Google Cloud コンソールでストリームに取り込まれる動画のライブビュー。動画提供: Elizabeth Mavor on Pixabay(ピクセル化を追加)
4. Cloud Functions の関数を作成する
モデルのデータを解析し、後でイベントチャネルを介して送信されるイベントを生成するには、Cloud Functions の関数が必要です。
Cloud Functions の詳細については、こちらをご覧ください。
モデルをリッスンする Cloud Functions の関数を作成する
- Cloud Functions の関数 UI 作成ページに移動します。
- 関数名を設定します。この名前は、後でイベント管理の設定でこの Cloud Functions の関数を参照するために使用されます。
- リージョンがアプリケーションと一致していることを確認します。
- トリガー設定を調整して保存します。
- 次のボタンをクリックして [コード] 部分に移動します。

- 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 ダッシュボードの [アプリケーション] タブを開きます。
- add [作成] ボタンをクリックします。
- アプリ名として「traffic-app」と入力し、リージョンを選択します。
- [作成] をクリックします。
アプリ コンポーネント ノードを追加する
空のアプリケーションを作成したら、次の 3 つのノードをアプリグラフに追加できます。
- 取り込みノード: データを取り込むストリーム リソース。
- 処理ノード: 取り込まれたデータに対して動作する利用人数分析モデル。
- ストレージ ノード: 処理された動画を保存し、メタデータ ストアとして機能するメディア ウェアハウス。メタデータ ストアには、取り込まれた動画データの分析情報と、AI モデルによって推測された情報が含まれます。
コンソールでアプリにコンポーネント ノードを追加します。
- Vertex AI Vision ダッシュボードの [アプリケーション] タブを開きます。[アプリケーション] タブに移動
- traffic-app 行で [**グラフを表示**] を選択します。処理パイプラインのグラフ表示が表示されます。
データの取り込みノードを追加する
- 入力ストリーム ノードを追加するには、サイドメニューの [コネクタ] セクションで [ストリーム] オプションを選択します。
- 開いた [ストリーム] メニューの [ソース] セクションで、[ストリームを追加] を選択します。
- [ストリームを追加] メニューで、[新しいストリームを登録] を選択し、ストリーム名として「traffic-stream」を追加します。
- ストリームをアプリグラフに追加するには、[ストリームを追加] をクリックします。
データ処理ノードを追加する
- 利用人数カウント モデルノードを追加するには、サイドメニューの [Specialized models] セクションで [利用人数分析] オプションを選択します。
- デフォルトの選択肢である [人物] と [車両] はそのままにします。
- [ラインの交差] でラインを追加します。マルチポイント ラインツールを使用して、車両や人が出入りする場所のラインを描画します。
- アクティブ ゾーンを描画して、そのゾーン内の人や車両をカウントします。
- アクティブ ゾーンが描画されている場合は、滞留時間の設定を追加して混雑を検出します。
- (現在、アクティブ ゾーンとラインの交差の両方を同時にサポートしていません。一度に 1 つの機能のみを使用してください)。


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

イベントチャネルを構成する
- アプリケーション グラフのデータ処理ノード(利用人数分析 )をクリックして、サイドメニューを開きます。
- [イベント通知] セクションで [イベント通知を設定] をクリックします。

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

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

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

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