Vertex AI Vision は、動画 データの取り込み、分析、保存に使用できる AI を活用したプラットフォームです。Vertex AI Vision を使用すると、AI アプリケーションを構築してデプロイできます。Vertex AI Vision の他のプロダクト コンポーネントとの統合を活用して、エンドツーエンドの Vertex AI Vision ソリューションを構築できます。
Vertex AI Vision プラットフォームを使用してソリューションの実装を開始するには、次の Vertex AI Vision のコンセプトとコンポーネントを確認してください。
ストリーム: ソリューションの動画ストリーミング レイヤを表します。ストリーム ソースは、ライブ動画(IP カメラなど)または動画ファイル(MP4 ファイルなど)にできます。
アプリケーション: ストリームと AI プロセッサ間の接続を有効にして、動画に対して ML オペレーションを実行します。たとえば、カメラ ストリームを、カメラの前を通り過ぎる人の数をカウントする AI モデルに接続できます。
アプリの出力先: 分析されたデータをストレージの宛先(Vertex AI Vision の Media Warehouse または BigQuery)に送信するか、ライブデータを受信します。Vertex AI Vision の Media Warehouse に保存すると、取り込まれたストリームのデータで使用される AI プロセッサから分析出力とメタデータを検索できます。BigQuery に保存すると、プロダクトのオフライン分析機能を使用できます。アプリの出力を直接受け取っている場合は、分析情報を使用してビジネス上の意思決定を即座に行うことができます。詳細については、概要: アプリの出力をデータ接続に接続するをご覧ください。
データを受信するように BigQuery を設定する
分析アプリのデータからデータを受信して予測を行うには、処理された情報と一致する BigQuery データセットとテーブルを作成する必要があります。
データセットを作成する
BigQuery テーブルを作成する前に、アプリから分析された情報を受け取るためのデータセットを作成する必要があります。
コンソール
Google Cloud コンソールで [BigQuery] ページを開きます。
[エクスプローラ] パネルで、データセットを作成するプロジェクトを選択します。
アクション オプションを開いて、[データセットを作成] をクリックします。
[データセットを作成] ページで次の操作を行います。
- [データセット ID] に「
occupancy_dataset」と入力します。 [データのロケーション] で、データセットの地理的なロケーションを選択します。データセットの作成後はロケーションを変更できません。
[デフォルトのテーブルの有効期限] で、以下のいずれかのオプションを選択します。
- 無期限: (デフォルト)データセット内に作成されたテーブルが自動的に削除されることはありません。テーブルを削除する場合は、手動で削除する必要があります。
テーブル作成後の日数: この値は、データセット内に新しく作成されたテーブルがいつ削除されるかを決定します。この値が適用されるのは、テーブルの作成時にテーブルの有効期限を設定しなかった場合です。
[データセットを作成] をクリックします。
- [データセット ID] に「
BigQuery テーブルを作成する
コンソール
Google Cloud コンソールで、[BigQuery] ページに移動します。
- [エクスプローラ] ペインでプロジェクトを開き、
occupancy_datasetデータセットを選択します。 - [データセット情報] セクションで、[ テーブルを作成] をクリックします。
- [テーブルを作成] パネルで、次の詳細を指定します。
- [ソース] セクションの [テーブルの作成元] リストで [空のテーブル] を選択します。
- [宛先] セクションで、次の詳細を指定します。
- [データセット] フィールドに
occupancy_datasetが指定されていることを確認します。 - [テーブル] フィールドに「
occupancy_dataset_table」と入力します。 - [テーブルタイプ] フィールドが [ネイティブ テーブル] に設定されていることを確認します。
- [データセット] フィールドに
- [スキーマ] セクションでスキーマ定義を入力します。スキーマ情報は、次の手順で手動で入力できます。
-
テキストとして編集をクリックし、次の JSON 配列スキーマを貼り付けます。JSON 配列を使用する場合は、JSON スキーマ ファイルの作成と同じプロセスを使用してスキーマを生成します。
[ { "name": "ingestion_time", "type": "TIMESTAMP", "mode": "REQUIRED" }, { "name": "application", "type": "STRING", "mode": "REQUIRED" }, { "name": "instance", "type": "STRING", "mode": "REQUIRED" }, { "name": "node", "type": "STRING", "mode": "REQUIRED" }, { "name": "annotation", "type": "STRING" } ]
-
テキストとして編集をクリックし、次の JSON 配列スキーマを貼り付けます。JSON 配列を使用する場合は、JSON スキーマ ファイルの作成と同じプロセスを使用してスキーマを生成します。
- [テーブルを作成] をクリックします。
利用人数カウント アプリケーションを作成する
BigQuery データセットとテーブルを設定したら、これらの BigQuery リソースに送信されたデータを処理するアプリを作成できます。
空白のアプリを作成する
アプリグラフにデータを入力する前に、まず空のアプリを作成する必要があります。
コンソール
Google Cloud コンソールでアプリを作成します。
Vertex AI Vision ダッシュボードの [アプリケーション] タブを開きます。
[作成] ボタンをクリックします。
アプリ名として「
occupancy-bq-app」と入力し、地域を選択します。[作成] をクリックします。
アプリ コンポーネント ノードを追加する
空のアプリケーションを作成したら、次の 3 つのノードをアプリグラフに追加できます。
- 取り込みノード: 作成した Compute Engine VM インスタンスから送信されたデータを取り込むストリーム リソース。
- 処理ノード: 取り込まれたデータに対して動作する占有率分析モデル。
- BigQuery ノード: アプリが BigQuery テーブルにメタデータを保存できるようにするコネクタ ノード。
コンソール
コンソールでアプリにコンポーネント ノードを追加します。
Vertex AI Vision ダッシュボードの [アプリケーション] タブを開きます。
occupancy-bq-app行で、グラフを表示を選択します。これで、処理パイプラインのグラフ ビジュアリゼーションが表示されます。
データ取り込みノードを追加する
入力ストリーム ノードを追加するには、サイドメニューの [コネクタ] セクションで [ストリーム] オプションを選択します。
[ストリーム] メニューの [ソース] セクションで、[ストリームを追加] を選択します。
[ストリームを追加] メニューで、 [新しいストリームを登録] を選択し、ストリーム名として
occupancy-bq-streamを追加します。ストリームをアプリグラフに追加するには、[ストリームを追加] をクリックします。
データ処理ノードを追加する
占有数モデルノードを追加するには、サイドメニューの [特殊モデル] セクションで [占有分析] オプションを選択します。
デフォルトの選択肢である [人物] と [車両] はそのままにします。
BigQuery ノードを追加する
出力先(ストレージ)ノードを追加するには、サイドメニューの [コネクタ] セクションで [BigQuery] オプションを選択します。
[BigQuery] メニューで
occupancy_dataset_tableを検索し、テーブルを選択します。[メタデータの保存元:] セクションで、[ストリーム] と [占有率分析] の両方を選択します。
アプリをデプロイして使用できるようにする
必要なコンポーネントをすべて使用してエンドツーエンドのアプリを構築したら、アプリを使用するための最後のステップとして、アプリをデプロイします。
コンソール
Vertex AI Vision ダッシュボードの [アプリケーション] タブを開きます。
リスト内の
occupancy-bq-appアプリの横にある [グラフを表示] を選択します。アプリケーション グラフ ビルダーのページで、 [デプロイ] ボタンをクリックします。
次の確認ダイアログで、[デプロイ] を選択します。
デプロイ オペレーションが完了するまでに数分かかることがあります。デプロイが完了すると、ノードの横に緑色のチェックマークが表示されます。
動画をストリーミングするようにリモート マシンを設定する
ストリーミング データを受信、処理、BigQuery テーブルに保存する準備ができた占有率カウント アプリをデプロイしたので、実際に動画データをアプリにストリーミングする必要があります。
このチュートリアルでは、動画をホストする Compute Engine VM インスタンスを作成し、そのストリーミング動画データを VM から送信します。
Linux VM を作成
Compute Engine VM インスタンスから動画を送信する最初の手順は、VM インスタンスの作成です。
コンソール
コンソールで [VM インスタンス] ページに移動します。
プロジェクトを選択し、[続行] をクリックします。
[インスタンスを作成] をクリックします。
VM の名前を指定します。詳しくは、リソースの命名規則をご覧ください。
(省略可)この VM のゾーンを変更します。Compute Engine は、複数のゾーンで各リージョンが均等に使用されるように、各リージョン内でゾーンのリストをランダム化します。
残りのデフォルト オプションはそのままにします。これらのオプションの詳細については、VM を作成して起動するをご覧ください。
VM を作成して起動するには、[作成] をクリックします。
VM 環境を設定する
VM が起動したら、コンソールを使用してブラウザで SSH 接続を確立できます。この接続を確立したら、vaictl コマンドライン ツールをダウンロードして、動画をアプリに取り込むことができます。
コンソール
VM への SSH 接続を確立する
コンソールで [VM インスタンス] ページに移動します。
作成したインスタンス行の [接続] セクションで、[SSH] をクリックします。新しいブラウザ ウィンドウに SSH 接続が開きます。

vaictl コマンドライン ツールをダウンロードする
[ブラウザでの SSH] ウィンドウで、次のコマンドを使用して Vertex AI Vision(
vaictl)コマンドライン ツールをダウンロードします。wget https://github.com/google/visionai/releases/download/v0.0.5/visionai_0.0-5_amd64.deb次のコマンドを実行して、コマンドライン ツールをインストールします。
sudo apt install ./visionai_0.0-5_amd64.debインストールをテストするには、次のコマンドを実行します。
vaictl --help
アプリに動画ファイルを取り込む
VM 環境を設定したら、サンプル動画ファイルをコピーし、vaictl を使用して動画データを占有数アプリにストリーミングできます。
このコマンドを送信したら、次のステップに進む前に、数時間分のデータをストリーミングする必要があります。
ブラウザでの SSH
サンプル動画を VM にコピーする
- VM の [ブラウザでの SSH] ウィンドウで、次の
gcloud storage cpコマンドを使用してサンプル動画をコピーします。次の変数を置き換えます。- SOURCE: 使用する動画ファイルの場所。独自の動画ファイル ソース(
gs://BUCKET_NAME/FILENAME.mp4など)を使用することも、サンプル動画のいずれかを使用することもできます。
gcloud storage cp SOURCE .
- SOURCE: 使用する動画ファイルの場所。独自の動画ファイル ソース(
VM から動画をストリーミングし、アプリにデータを取り込む
- このローカル動画ファイルをアプリの入力ストリームに送信するには、次のコマンドを使用します。次の変数を置き換える必要があります。
- PROJECT_ID: 実際の Google Cloud プロジェクト ID。
- LOCATION_ID: ロケーション ID。例:
us-central1詳細 - LOCAL_FILE.EXT: ローカル動画ファイルのファイル名。例:
my-video.mp4。 --loopフラグ: 省略可。ファイルデータをループしてストリーミングをシミュレートします。
このコマンドは、動画ファイルをストリームにストリーミングします。
--loopフラグを使用すると、コマンドを停止するまで動画がストリームにループされます。vaictl -p PROJECT_ID \ -l LOCATION_ID \ -c application-cluster-0 \ --service-endpoint visionai.googleapis.com \ send video-file to streams 'occupancy-bq-stream' --file-path LOCAL_FILE.EXT --loop
vaictl 取り込みオペレーションの開始から動画がダッシュボードに表示されるまで、約 100 秒かかることがあります。
ストリームの取り込みが完了すると、Vertex AI Vision ダッシュボードの [ストリーム] タブで occupancy-bq-stream ストリームを選択して、動画フィードを確認できます。
BigQuery ML で予測モデルを構築する
これで、メタデータを BigQuery に保存するアプリが機能するようになりました。アプリに数時間分のデータがストリーミングされたら、BigQuery ML を使用して予測モデルの構築を開始できます。
省略可: 占有率クエリを実行する
簡単なクエリを実行すると、アプリで生成されたテーブルに保存されたデータを表示できます。
コンソール
Google Cloud コンソールで、[BigQuery] ページを開きます。
occupancy_datasetの横にある 展開を選択し、occupancy_dataset_tableを選択します。テーブルの詳細ビューで、クエリを新規作成()をクリックします。
[クエリエディタ] テキスト領域に、次の Google 標準 SQL クエリを入力します。
SELECT * FROM ( SELECT TIMESTAMP_TRUNC(PARSE_TIMESTAMP('"%Y-%m-%dT%H:%M:%E*SZ"', JSON_QUERY(annotation, "$.currentTime")), MINUTE) currentTime, CAST(JSON_QUERY(annotation, '$.stats.fullFrameCount[0].count') AS INT64) AS count, JSON_QUERY(annotation, '$.stats.fullFrameCount[0].entity.labelString') AS type FROM `PROJECT_ID.occupancy_dataset.occupancy_dataset_table` ) WHERE count IS NOT NULL
省略可: データを処理するロケーションを変更するには、[展開]、[クエリの設定] の順にクリックします。[処理を行うロケーション] で [自動選択] をクリックし、データのロケーションを選択します。最後に [保存] をクリックしてクエリの設定を更新します。
[実行] をクリックします。
これにより、出力を一時テーブルに書き込むクエリジョブが作成されます。
このクエリを実行すると、動画に人が映っている時間と人数に関する情報を含むテーブルが生成されます。
| currentTime | count | type |
|---|---|---|
| 2022-08-10 16:17:00 UTC | 2 | 「人物」 |
| 2022-08-10 16:17:00 UTC | 2 | 「人物」 |
| 2022-08-10 16:17:00 UTC | 4 | 「人物」 |
| 2022-08-10 16:17:00 UTC | 1 | 「人物」 |
| 2022-08-10 16:17:00 UTC | 5 | 「人物」 |
| 2022-08-10 16:17:00 UTC | 2 | 「人物」 |
トレーニング用のビューを作成する
テーブルに保存されたデータを確認したら、ビューを作成して、結果のテーブルの内容を調べることができます。このビューデータを使用して、予測モデルをトレーニングします。
ビューを作成するには、ビューにアクセス可能なデータを定義する SQL クエリを作成します。SQL クエリは、SELECT ステートメントで構成する必要があります。BigQuery ビューの詳細については、ビューの概要をご覧ください。
トレーニング テーブル ビューを作成するには:
コンソール
Google Cloud コンソールで、[BigQuery] ページを開きます。
occupancy_datasetの横にある 展開を選択し、occupancy_dataset_tableを選択します。テーブルの詳細ビューで、クエリを新規作成()をクリックします。
[クエリエディタ] テキスト領域に、次の Google 標準 SQL クエリを入力します。
CREATE VIEW `PROJECT_ID.occupancy_dataset.forecast_training_data` AS ( WITH raw_counts AS ( SELECT * FROM ( SELECT TIMESTAMP_TRUNC( PARSE_TIMESTAMP('"%Y-%m-%dT%H:%M:%E*SZ"', JSON_QUERY(annotation, "$.currentTime")), MINUTE) AS currentTime, CAST(JSON_QUERY(annotation, '$.stats.fullFrameCount[0].count') AS INT64) AS count, JSON_QUERY(annotation, '$.stats.fullFrameCount[0].entity.labelString') AS type FROM `PROJECT_ID.occupancy_dataset.occupancy_dataset_table` ) WHERE count IS NOT NULL ) SELECT currentTime, SUM(count) AS total_count, type FROM raw_counts GROUP BY currentTime, type)
[実行] をクリックします。
省略可: ビューをクエリする
次のクエリを実行して、新しいビューのトレーニング データの結果を表示します。
コンソール
occupancy_dataset_tableテーブルの詳細ビューで、[クエリを新規作成] をクリックします。[クエリエディタ] テキスト領域に、次の Google 標準 SQL クエリを入力します。
SELECT * FROM `PROJECT_ID.occupancy_dataset.forecast_training_data` ORDER BY currentTime, type LIMIT 100
[実行] をクリックします。
これにより、次のような時間で並べ替えられた結果が返されます。
| currentTime | total_count | type |
|---|---|---|
| 2022-08-10 16:17:00 UTC | 129 | 「人物」 |
| 2022-08-10 16:18:00 UTC | 150 | 「人物」 |
| 2022-08-10 16:19:00 UTC | 80 | 「人物」 |
| 2022-08-10 16:20:00 UTC | 129 | 「人物」 |
| 2022-08-10 16:21:00 UTC | 142 | 「人物」 |
| 2022-08-10 16:22:00 UTC | 71 | 「人物」 |
| 2022-08-10 16:22:00 UTC | 2 | 「車両」 |
BigQuery ML で予測モデルをトレーニングする
トレーニング データとして使用するデータがビューにあるので、BigQuery ML で予測モデルをトレーニングできます。
コンソール
occupancy_dataset_tableテーブルの詳細ビューで、[クエリを新規作成] をクリックします。[クエリエディタ] テキスト領域に、次の Google 標準 SQL クエリを入力します。
CREATE OR REPLACE MODEL `PROJECT_ID.occupancy_dataset.occupancy_forecast_model` OPTIONS( MODEL_TYPE = "ARIMA_PLUS", TIME_SERIES_TIMESTAMP_COL = "currentTime", TIME_SERIES_DATA_COL = "total_count", TIME_SERIES_ID_COL = "type" ) AS SELECT * FROM `PROJECT_ID.occupancy_dataset.forecast_training_data`
[実行] をクリックします。
クエリが完了するまでに数分かかります。最初のイテレーションが完了すると、モデル(occupancy_forecast_model)がナビゲーション パネルに表示されます。クエリは CREATE MODEL ステートメントを使用してモデルを作成するため、クエリの結果は表示されません。
[モデルの統計情報] タブを表示すると、トレーニング中のモデルを確認できます。最初のイテレーションが完了すると、タブが更新されます。イテレーションが完了するたびに、統計情報が更新されます。
BigQuery で占有率の予測を取得する
モデルのトレーニングが完了したら、モデルから占有数の予測を取得できます。
次の ML.FORECAST クエリは、HORIZON 関数の入力を使用して、次の 60 分間の予測を行います。
コンソール
occupancy_dataset_tableテーブルの詳細ビューで、[クエリを新規作成] をクリックします。[クエリエディタ] テキスト領域に、次の Google 標準 SQL クエリを入力します。
SELECT * FROM ML.FORECAST(MODEL `PROJECT_ID.occupancy_dataset.occupancy_forecast_model`, STRUCT(60 AS HORIZON))
[実行] をクリックします。
モデルは、タイプが "Person" の将来のタイムスタンプの forecast_value で予測を生成します。たとえば、11:06:00 の 2022-08-12 では、モデルは合計で約 15.26 人の「人物」がいると予測しています。
| type | forecast_timestamp | forecast_value | standard_error | confidence_level | prediction_interval_lower_bound | prediction_interval_upper_bound |
|---|---|---|---|---|---|---|
| 「人物」 | 2022-08-12 11:06:00 UTC | 15.2621986941298 | 2.56470066 | 0.95 | 10.2444693 | 20.2799280 |
| 「人物」 | 2022-08-12 11:07:00 UTC | 13.235260043001354 | 3.19379743 | 0.95 | 6.98672921 | 19.4837908 |
| 「人物」 | 2022-08-12 11:08:00 UTC | 16.257331475128712 | 3.87581375 | 0.95 | 8.67446430 | 23.8401986 |
| 「人物」 | 2022-08-12 11:09:00 UTC | 31.432229611853742 | 4.24905293 | 0.95 | 23.1191356 | 39.7453236 |
| 「人物」 | 2022-08-12 11:10:00 UTC | 26.199214148193725 | 4.26157413 | 0.95 | 17.8616229 | 34.5368053 |
| 「人物」 | 2022-08-12 11:11:00 UTC | 26.211573546307324 | 4.27962512 | 0.95 | 17.8386663 | 34.5844807 |