1. 目標
概要
この Codelab では、イベント管理機能を使用してイベントを送信する Vertex AI Vision アプリケーションをエンドツーエンドで作成することに重点を置きます。事前トレーニング済みの専用モデルの利用人数の分析に組み込まれている機能を使用して、以下のキャプチャに基づいてイベントを生成します。
- 特定の線で道路を横断する車両と人の数をカウントします。
- 道路の任意の固定領域にある車両/人の数をカウントします。
- 道路の任意の部分で渋滞を検出する。
学習内容
- ストリーミング用に動画を取り込む方法
- Vertex AI Vision でアプリケーションを作成する方法
- 宿泊状況アナリティクスで利用できるさまざまな機能とその使用方法
- アプリをデプロイする方法
- Vertex AI Vision のメディア ウェアハウス内の動画を検索する方法。
- 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 インスタンス管理者(ベータ版)]、[ストレージ] > [ストレージ オブジェクト閲覧者] †。[ロールを選択] リストでロールを選択します。ロールを追加するには、[別のロールを追加] をクリックして各ロールを追加します。注: [ロール] フィールドは、サービス アカウントがプロジェクト内のどのリソースにアクセスできるかに影響します。これらのロールは後で取り消すことも、追加のロールを付与することもできます。本番環境では、オーナー、編集者、閲覧者のロールを付与しないでください。代わりに、ニーズに合わせて事前定義ロールまたはカスタムロールを付与します。
- [続行] をクリックします。
- [完了] をクリックして、サービス アカウントの作成を完了します。ブラウザ ウィンドウは閉じないでください。次のステップでこれを使用します。
サービス アカウント キーを作成します。
- Google Cloud コンソールで、作成したサービス アカウントのメールアドレスをクリックします。
- [キー] をクリックします。
- [鍵を追加]、[新しい鍵を作成] の順にクリックします。
- [作成] をクリックします。JSON キーファイルがパソコンにダウンロードされます。
- [閉じる] をクリックします。
- Google Cloud CLI をインストールして初期化します。
† ロールは、Cloud Storage バケットからサンプル動画ファイルをコピーする場合にのみ必要です。
3. ストリーミング用に動画ファイルを取り込む
vaictl を使用して、占有率分析アプリに動画データをストリーミングできます。
まず、Cloud コンソールで 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 の関数を参照する際に使用されます。
- リージョンがアプリケーションと一致していることを確認します。
- 調整してから、トリガーの設定を保存します。
- 次のボタンをクリックして「コード」部分に移動します。
- 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 ダッシュボードの [アプリケーション] タブを開きます。
- 追加アイコン Create ボタンをクリックします。
- アプリ名として traffic-app を入力し、リージョンを選択します。
- [作成] をクリックします。
アプリ コンポーネント ノードを追加する
空のアプリを作成したら、次の 3 つのノードをアプリグラフに追加できます。
- 取り込みノード: データを取り込むストリーム リソース。
- 処理ノード: 取り込まれたデータを処理する占有率分析モデル。
- ストレージ ノード: 処理済みの動画を保存するメディア ウェアハウス。メタデータ ストアとして機能します。メタデータ ストアには、取り込まれた動画データに関する分析情報と、AI モデルによって推測された情報が含まれます。
コンソールでコンポーネント ノードをアプリに追加します。
- Vertex AI Vision ダッシュボードの [アプリケーション] タブを開きます。[アプリケーション] タブに移動
- traffic-app 行で [グラフを表示] を選択します。処理パイプラインのグラフ ビジュアリゼーションが表示されます。
データ取り込みノードを追加する
- 入力ストリーム ノードを追加するには、サイドメニューの [コネクタ] セクションで [ストリーム] オプションを選択します。
- 表示された [ストリーム] メニューの [ソース] セクションで、[ストリームを追加] を選択します。
- [ストリームを追加] メニューで [新しいストリームを登録] を選択し、ストリーム名として traffic-stream を追加します。
- アプリグラフにストリームを追加するには、[Add streams] をクリックします。
データ処理ノードを追加する
- 占有人数モデルノードを追加するには、サイドメニューの [特殊モデル] セクションで [占有人数分析] オプションを選択します。
- [People] と [Vehicles] のデフォルト選択はそのままにします。
- 線の交差に線を追加しました。マルチポイント線ツールを使用して、車両や人の出入りを検出する必要がある場所に線を描画します。
- アクティブ ゾーンを描画して、そのゾーン内の人や車両をカウントします。
- アクティブ ゾーンが描画された場合に混雑を検出するための滞在時間の設定を追加しました。
- (現在、アクティブなゾーンとラインの交差は同時にサポートされていません。一度に使用できる機能は 1 つだけです)。
データ ストレージ ノードを追加する
- 出力先(ストレージ)ノードを追加するには、サイドメニューの [コネクタ] セクションで [Vertex AI Vision のメディア ウェアハウス] オプションを選択します。
- [Vertex AI Vision のメディア ウェアハウス] メニューで、[ウェアハウスを接続] をクリックします。
- [ウェアハウスを接続] メニューで、[新しいウェアハウスを作成] を選択します。ウェアハウスに traffic-warehouse という名前を付け、TTL の期間は 14 日のままにします。
- [作成] ボタンをクリックしてウェアハウスを追加します。
7. イベント管理を構成する
所要時間 02:00
後処理のために、モデルを前回作成した Cloud Functions 関数に接続します。この関数は、モデルの出力を自由に処理し、ニーズに合わせてイベントを生成できます。次に、先ほど作成した Pub/Sub トピックをターゲットとして構成し、イベント チャネルを構成します。最小間隔を設定することもできます。これにより、短時間に同じイベントがイベント チャンネルに大量に送信されるのを防ぐことができます。
後処理用の Cloud Functions の関数を選択する
- アプリケーション グラフ上のデータ処理ノード(占有率分析)をクリックしてサイドメニューを開きます。
- [Post-processing] プルダウンで Cloud Functions の関数(関数名で識別)を選択します。
- アプリケーションのグラフに変更内容が自動的に保存されます。
イベント チャネルを構成する
- アプリケーション グラフのデータ処理ノード(occupancy analytics)をクリックして、サイドメニューを開きます。
- [イベント通知] セクションの [イベント通知を設定] をクリックします。
- プルダウンから Pub/Sub トピックを選択します。
- (省略可)イベント公開の最小間隔または頻度を設定します。
8. アプリをデプロイして使用する
必要なすべてのコンポーネントを使用してエンドツーエンドのアプリをビルドしたら、アプリを使用する最後のステップとして、アプリをデプロイします。
- Vertex AI Vision ダッシュボードの [アプリケーション] タブを開きます。[アプリケーション] タブに移動
- リストの traffic-app アプリの横にある [View graph] を選択します。
- アプリケーション グラフビルダー ページで、[デプロイ] ボタンをクリックします。
- 次の確認ダイアログで [デプロイ] を選択します。デプロイ オペレーションが完了するまでに数分かかることがあります。デプロイが完了すると、ノードの横に緑色のチェックマークが表示されます。
9. Pub/Sub サブスクリプションでイベント/メッセージを確認する
動画データを処理アプリに取り込んだ後、クラウド関数は、占有率分析モデルがアノテーションを出力するとイベントを生成します。その後、これらのイベントは 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
フィードバック
フィードバックを送信するには、こちらをクリックしてください。