BigQuery 予測を使用して宿泊状況分析アプリを作成する

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 テーブルを作成する前に、アプリから分析された情報を受け取るためのデータセットを作成する必要があります。

コンソール

  1. Google Cloud コンソールで [BigQuery] ページを開きます。

    [BigQuery] ページに移動

  2. [エクスプローラ] パネルで、データセットを作成するプロジェクトを選択します。

  3. アクション オプションを開いて、[データセットを作成] をクリックします。

  4. [データセットを作成] ページで次の操作を行います。

    • [データセット ID] に「occupancy_dataset」と入力します。
    • [データのロケーション] で、データセットの地理的なロケーションを選択します。データセットの作成後はロケーションを変更できません。

    • [デフォルトのテーブルの有効期限] で、以下のいずれかのオプションを選択します。

      • 無期限: (デフォルト)データセット内に作成されたテーブルが自動的に削除されることはありません。テーブルを削除する場合は、手動で削除する必要があります。
      • テーブル作成後の日数: この値は、データセット内に新しく作成されたテーブルがいつ削除されるかを決定します。この値が適用されるのは、テーブルの作成時にテーブルの有効期限を設定しなかった場合です。

    • [データセットを作成] をクリックします。

BigQuery テーブルを作成する

コンソール

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. [エクスプローラ] ペインでプロジェクトを開き、occupancy_dataset データセットを選択します。
  3. [データセット情報] セクションで、[ テーブルを作成] をクリックします。
  4. [テーブルを作成] パネルで、次の詳細を指定します。
    1. [ソース] セクションの [テーブルの作成元] リストで [空のテーブル] を選択します。
    2. [宛先] セクションで、次の詳細を指定します。
      1. [データセット] フィールドに occupancy_dataset が指定されていることを確認します。
      2. [テーブル] フィールドに「occupancy_dataset_table」と入力します。
      3. [テーブルタイプ] フィールドが [ネイティブ テーブル] に設定されていることを確認します。
    3. [スキーマ] セクションでスキーマ定義を入力します。スキーマ情報は、次の手順で手動で入力できます。
      • テキストとして編集をクリックし、次の 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"
            }
        ]
    4. [テーブルを作成] をクリックします。

利用人数カウント アプリケーションを作成する

BigQuery データセットとテーブルを設定したら、これらの BigQuery リソースに送信されたデータを処理するアプリを作成できます。

空白のアプリを作成する

アプリグラフにデータを入力する前に、まず空のアプリを作成する必要があります。

コンソール

Google Cloud コンソールでアプリを作成します。

  1. Vertex AI Vision ダッシュボードの [アプリケーション] タブを開きます。

    [アプリケーション] タブに移動

  2. [作成] ボタンをクリックします。

  3. アプリ名として「occupancy-bq-app」と入力し、地域を選択します。

  4. [作成] をクリックします。

アプリ コンポーネント ノードを追加する

空のアプリケーションを作成したら、次の 3 つのノードをアプリグラフに追加できます。

  1. 取り込みノード: 作成した Compute Engine VM インスタンスから送信されたデータを取り込むストリーム リソース。
  2. 処理ノード: 取り込まれたデータに対して動作する占有率分析モデル。
  3. BigQuery ノード: アプリが BigQuery テーブルにメタデータを保存できるようにするコネクタ ノード。

コンソール

コンソールでアプリにコンポーネント ノードを追加します。

  1. Vertex AI Vision ダッシュボードの [アプリケーション] タブを開きます。

    [アプリケーション] タブに移動

  2. occupancy-bq-app 行で、グラフを表示を選択します。これで、処理パイプラインのグラフ ビジュアリゼーションが表示されます。

データ取り込みノードを追加する

  1. 入力ストリーム ノードを追加するには、サイドメニューの [コネクタ] セクションで [ストリーム] オプションを選択します。

  2. [ストリーム] メニューの [ソース] セクションで、[ストリームを追加] を選択します。

  3. [ストリームを追加] メニューで、 [新しいストリームを登録] を選択し、ストリーム名として occupancy-bq-stream を追加します。

  4. ストリームをアプリグラフに追加するには、[ストリームを追加] をクリックします。

データ処理ノードを追加する

  1. 占有数モデルノードを追加するには、サイドメニューの [特殊モデル] セクションで [占有分析] オプションを選択します。

  2. デフォルトの選択肢である [人物] と [車両] はそのままにします。

BigQuery ノードを追加する

  1. 出力先(ストレージ)ノードを追加するには、サイドメニューの [コネクタ] セクションで [BigQuery] オプションを選択します。

  2. [BigQuery] メニューで occupancy_dataset_table を検索し、テーブルを選択します。

  3. [メタデータの保存元:] セクションで、[ストリーム] と [占有率分析] の両方を選択します。

アプリをデプロイして使用できるようにする

必要なコンポーネントをすべて使用してエンドツーエンドのアプリを構築したら、アプリを使用するための最後のステップとして、アプリをデプロイします。

コンソール

  1. Vertex AI Vision ダッシュボードの [アプリケーション] タブを開きます。

    [アプリケーション] タブに移動

  2. リスト内の occupancy-bq-app アプリの横にある [グラフを表示] を選択します。

  3. アプリケーション グラフ ビルダーのページで、 [デプロイ] ボタンをクリックします。

  4. 次の確認ダイアログで、[デプロイ] を選択します。

    デプロイ オペレーションが完了するまでに数分かかることがあります。デプロイが完了すると、ノードの横に緑色のチェックマークが表示されます。

動画をストリーミングするようにリモート マシンを設定する

ストリーミング データを受信、処理、BigQuery テーブルに保存する準備ができた占有率カウント アプリをデプロイしたので、実際に動画データをアプリにストリーミングする必要があります。

このチュートリアルでは、動画をホストする Compute Engine VM インスタンスを作成し、そのストリーミング動画データを VM から送信します。

Linux VM を作成

Compute Engine VM インスタンスから動画を送信する最初の手順は、VM インスタンスの作成です。

コンソール

  1. コンソールで [VM インスタンス] ページに移動します。

    [VM インスタンス] に移動

  2. プロジェクトを選択し、[続行] をクリックします。

  3. [インスタンスを作成] をクリックします。

  4. VM の名前を指定します。詳しくは、リソースの命名規則をご覧ください。

  5. (省略可)この VM のゾーンを変更します。Compute Engine は、複数のゾーンで各リージョンが均等に使用されるように、各リージョン内でゾーンのリストをランダム化します。

  6. 残りのデフォルト オプションはそのままにします。これらのオプションの詳細については、VM を作成して起動するをご覧ください。

  7. VM を作成して起動するには、[作成] をクリックします。

VM 環境を設定する

VM が起動したら、コンソールを使用してブラウザで SSH 接続を確立できます。この接続を確立したら、vaictl コマンドライン ツールをダウンロードして、動画をアプリに取り込むことができます。

コンソール

VM への SSH 接続を確立する

  1. コンソールで [VM インスタンス] ページに移動します。

    [VM インスタンス] に移動

  2. 作成したインスタンス行の [接続] セクションで、[SSH] をクリックします。新しいブラウザ ウィンドウに SSH 接続が開きます。

    UI の SSH オプション

vaictl コマンドライン ツールをダウンロードする

  1. [ブラウザでの SSH] ウィンドウで、次のコマンドを使用して Vertex AI Vision(vaictl)コマンドライン ツールをダウンロードします。

    wget https://github.com/google/visionai/releases/download/v0.0.5/visionai_0.0-5_amd64.deb
    
  2. 次のコマンドを実行して、コマンドライン ツールをインストールします。

    sudo apt install ./visionai_0.0-5_amd64.deb
    
  3. インストールをテストするには、次のコマンドを実行します。

    vaictl --help
    

アプリに動画ファイルを取り込む

VM 環境を設定したら、サンプル動画ファイルをコピーし、vaictl を使用して動画データを占有数アプリにストリーミングできます。

このコマンドを送信したら、次のステップに進む前に、数時間分のデータをストリーミングする必要があります。

ブラウザでの SSH

サンプル動画を VM にコピーする

  1. VM の [ブラウザでの SSH] ウィンドウで、次の gcloud storage cp コマンドを使用してサンプル動画をコピーします。次の変数を置き換えます。
    • SOURCE: 使用する動画ファイルの場所。独自の動画ファイル ソース(gs://BUCKET_NAME/FILENAME.mp4 など)を使用することも、サンプル動画のいずれかを使用することもできます。
      • gs://cloud-samples-data/vertex-ai-vision/street_vehicles_people.mp4(人物と車両が映っている動画、 動画のソース
      • gs://cloud-samples-data/vertex-ai-vision/highway_vehicles.mp4(車両のみの動画、動画ソース
    gcloud storage cp SOURCE .

VM から動画をストリーミングし、アプリにデータを取り込む

  1. このローカル動画ファイルをアプリの入力ストリームに送信するには、次のコマンドを使用します。次の変数を置き換える必要があります。
    • 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 を使用して予測モデルの構築を開始できます。

省略可: 占有率クエリを実行する

簡単なクエリを実行すると、アプリで生成されたテーブルに保存されたデータを表示できます。

コンソール

  1. Google Cloud コンソールで、[BigQuery] ページを開きます。

    BigQuery に移動

  2. occupancy_dataset の横にある 展開を選択し、occupancy_dataset_table を選択します。

  3. テーブルの詳細ビューで、クエリを新規作成)をクリックします。

    クエリを新規作成

  4. [クエリエディタ] テキスト領域に、次の 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
  5. 省略可: データを処理するロケーションを変更するには、[展開]、[クエリの設定] の順にクリックします。[処理を行うロケーション] で [自動選択] をクリックし、データのロケーションを選択します。最後に [保存] をクリックしてクエリの設定を更新します。

  6. [実行] をクリックします。

これにより、出力を一時テーブルに書き込むクエリジョブが作成されます。

このクエリを実行すると、動画に人が映っている時間と人数に関する情報を含むテーブルが生成されます。

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 ビューの詳細については、ビューの概要をご覧ください。

トレーニング テーブル ビューを作成するには:

コンソール

  1. Google Cloud コンソールで、[BigQuery] ページを開きます。

    BigQuery に移動

  2. occupancy_dataset の横にある 展開を選択し、occupancy_dataset_table を選択します。

  3. テーブルの詳細ビューで、クエリを新規作成)をクリックします。

    クエリを新規作成

  4. [クエリエディタ] テキスト領域に、次の 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)
  5. [実行] をクリックします。

省略可: ビューをクエリする

次のクエリを実行して、新しいビューのトレーニング データの結果を表示します。

コンソール

  1. occupancy_dataset_table テーブルの詳細ビューで、[クエリを新規作成] をクリックします。

  2. [クエリエディタ] テキスト領域に、次の Google 標準 SQL クエリを入力します。

    SELECT
     *
    FROM
      `PROJECT_ID.occupancy_dataset.forecast_training_data`
    ORDER BY
     currentTime, type
    LIMIT
     100
  3. [実行] をクリックします。

これにより、次のような時間で並べ替えられた結果が返されます。

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 で予測モデルをトレーニングできます。

コンソール

  1. occupancy_dataset_table テーブルの詳細ビューで、[クエリを新規作成] をクリックします。

  2. [クエリエディタ] テキスト領域に、次の 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`
  3. [実行] をクリックします。

クエリが完了するまでに数分かかります。最初のイテレーションが完了すると、モデル(occupancy_forecast_model)がナビゲーション パネルに表示されます。クエリは CREATE MODEL ステートメントを使用してモデルを作成するため、クエリの結果は表示されません。

[モデルの統計情報] タブを表示すると、トレーニング中のモデルを確認できます。最初のイテレーションが完了すると、タブが更新されます。イテレーションが完了するたびに、統計情報が更新されます。

BigQuery で占有率の予測を取得する

モデルのトレーニングが完了したら、モデルから占有数の予測を取得できます。

次の ML.FORECAST クエリは、HORIZON 関数の入力を使用して、次の 60 分間の予測を行います。

コンソール

  1. occupancy_dataset_table テーブルの詳細ビューで、[クエリを新規作成] をクリックします。

  2. [クエリエディタ] テキスト領域に、次の Google 標準 SQL クエリを入力します。

    SELECT
      *
    FROM
      ML.FORECAST(MODEL `PROJECT_ID.occupancy_dataset.occupancy_forecast_model`,
      STRUCT(60 AS HORIZON))
  3. [実行] をクリックします。

モデルは、タイプが "Person" の将来のタイムスタンプの forecast_value で予測を生成します。たとえば、11:06:002022-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