1. 目標
概要
この Codelab では、イベント管理機能を使用してイベントを送信する Vertex AI Vision アプリケーションをエンドツーエンドで作成することに重点を置きます。事前トレーニング済みの専用モデルの利用人数の分析を使用します。以下のもののキャプチャに基づいてイベントを生成する組み込み機能:
- 特定の線で道路を横断する車両や人の数を数える。
 - 道路の一定の区間にある車両/人の数をカウントします。
 - 道路のあらゆる部分の渋滞を検出します。
 
学習内容
- ストリーミング用の動画を取り込む方法
 - Vertex AI Vision でアプリケーションを作成する方法
 - Occupancy Analytics で利用可能なさまざまな機能と使用方法
 - アプリをデプロイする方法
 - 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 インスタンス管理者(ベータ版)、ストレージ >Storage オブジェクト閲覧者 † .[ロールを選択] リストで、ロールを選択します。ロールを追加するには、[別のロールを追加] をクリックして各ロールを追加します。注: [ロール] フィールドは、サービス アカウントがプロジェクト内のどのリソースにアクセスできるかに影響します。これらのロールは後で取り消すことも、追加のロールを付与することもできます。本番環境では、オーナー、編集者、閲覧者のロールを付与しないでください。代わりに、ニーズに合わせて事前定義ロールまたはカスタムロールを付与します。
 - [続行] をクリックします。
 - [完了] をクリックして、サービス アカウントの作成を完了します。ブラウザ ウィンドウは閉じないでください。次のステップでこれを使用します。
 
サービス アカウント キーを作成します。
- Google Cloud コンソールで、作成したサービス アカウントのメールアドレスをクリックします。
 - [キー] をクリックします。
 - [鍵を追加]、[新しい鍵を作成] の順にクリックします。
 - [作成] をクリックします。JSON キーファイルがパソコンにダウンロードされます。
 - [閉じる] をクリックします。
 - Google Cloud CLI をインストールして初期化します。
 
† ロールは、Cloud Storage バケットからサンプル動画ファイルをコピーする場合にのみ必要です。
3. ストリーミング用の動画ファイルを取り込む
vaictl を使用して、占有率分析アプリに動画データをストリーミングできます。
まず、Cloud コンソールで Vision AI API を有効にします
新しいストリームを登録する
- Vertex AI Vision の左側のパネルで [ストリーム] タブをクリックします。
 - [Register] をクリックします。
 - ストリーム名に「traffic-stream」と入力します。
 - リージョンに「us-central1」と入力します。
 - [登録] をクリック
 
ストリームの登録が完了するまでに数分かかります。
サンプル動画を準備する
- 次の 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 .
ストリームにデータを取り込む
- このローカル動画ファイルをアプリの入力ストリームに送信するには、次のコマンドを使用します。次の変数置換を行う必要があります。
 
- 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 ダッシュボードの [アプリケーション] タブを開きます。
 
- [作成] の追加ボタンをクリックします。
 - アプリ名として「traffic-app」と入力し、リージョンを選択します。
 - [作成] をクリックします。
 
アプリ コンポーネント ノードを追加する
空のアプリケーションを作成したら、3 つのノードをアプリグラフに追加できます。
- 取り込みノード: データを取り込むストリーム リソース。
 - 処理ノード: 取り込まれたデータを処理する占有率分析モデル。
 - ストレージ ノード: 処理済みの動画を保存するメディア ウェアハウス。メタデータ ストアとして機能します。メタデータ ストアには、取り込まれた動画データに関する分析情報と、AI モデルによって推測された情報が含まれます。
 
コンソールでコンポーネント ノードをアプリに追加します。
- Vertex AI Vision ダッシュボードの [アプリケーション] タブを開きます。[アプリケーション] タブに移動
 - traffic-app の行で [View graph] を選択します。処理パイプラインのグラフ可視化が表示されます。
 
データ取り込みノードを追加する
- 入力ストリーム ノードを追加するには、サイドメニューの [コネクタ] セクションで [ストリーム] オプションを選択します。
 - 表示された [ストリーム] メニューの [ソース] セクションで、[ストリームを追加] を選択します。
 - [ストリームを追加] メニューで [新しいストリームを登録] を選択し、ストリーム名として「traffic-stream」を追加します。
 - アプリグラフにストリームを追加するには、[Add streams] をクリックします。
 
データ処理ノードを追加する
- 宿泊人数モデルノードを追加するには、サイドメニューの [専用モデル] セクションで [定員の分析] オプションを選択します。
 - [People] と [Vehicles] のデフォルト選択はそのままにします。
 - 交差点に線を追加します。マルチポイント ライン ツールを使用すると、車や人が出入りするのを検出する必要がある場所にラインを描くことができます。
 - アクティブ ゾーンを描画して、そのゾーン内の人/車両をカウントします。
 - アクティブ ゾーンが描画された場合に輻輳を検出するための滞留時間の設定を追加しました。
 
- (現在、アクティブ ゾーンとラインを越える両方を同時にサポートすることはできません。一度に 1 つの機能のみを使用する)。
 
 

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

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

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

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

 
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
フィードバック
フィードバックを送信するには、こちらをクリックしてください。