チュートリアル: 特徴ベクトルモデルを使用してオブジェクト テーブルで推論を実行する

このチュートリアルでは、花のデータセットからの画像に基づいてオブジェクト テーブルを作成し、MobileNet V3 モデルを使用してそのオブジェクト テーブルに対する推論を実行する方法を示します。

MobileNet V3 モデル

MobileNet V3 モデルは、画像ファイルを分析して、特徴ベクトル配列を返します。特徴ベクトル配列は、分析された画像の特性を記述する数値要素からなるリストです。各特徴ベクトルは多次元特徴空間を表し、この空間における画像の座標を提供します。画像の特徴ベクトル情報を使用して、画像をさらに分類できます。たとえば、コサイン類似度を使用してよく似た画像をグループ化できます。

MobileNet V3 モデルの入力は、形状 [-1, 224, 224, 3]DTypetf.float32 のテンソルを受け入れます。出力は、形状 [-1, 1024]tf.float32 のテンソルの配列です。

必要な権限

  • データセットを作成するには、bigquery.datasets.create 権限が必要です。
  • 接続リソースを作成するには、次の権限が必要です。

    • bigquery.connections.create
    • bigquery.connections.get
  • 接続のサービス アカウントに権限を付与するには、次の権限が必要です。

    • resourcemanager.projects.setIamPolicy
  • オブジェクト テーブルを作成するには、次の権限が必要です。

    • bigquery.tables.create
    • bigquery.tables.update
    • bigquery.connections.delegate
  • バケットを作成するには、storage.buckets.create 権限が必要です。

  • データセットとモデルを Cloud Storage にアップロードするには、storage.objects.create 権限と storage.objects.get 権限が必要です。

  • モデルを BigQuery ML に読み込むには、次の権限が必要です。

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
  • 推論を実行するには、次の権限が必要です。

    • オブジェクト テーブルに対する bigquery.tables.getData
    • モデルに対する bigquery.models.getData
    • bigquery.jobs.create

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

  • BigQuery: You incur storage costs for the object table you create in BigQuery.
  • BigQuery ML: You incur costs for the model you create and the inference you perform in BigQuery ML.
  • Cloud Storage: You incur costs for the objects you store in Cloud Storage.

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

BigQuery ストレージの料金について詳しくは、BigQuery のドキュメントのストレージの料金をご覧ください。

BigQuery ML の料金について詳しくは、BigQuery ドキュメントの BigQuery ML の料金をご覧ください。

Cloud Storage の料金について詳しくは、クラウドの料金設定ページをご覧ください。

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the BigQuery and BigQuery Connection API APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery and BigQuery Connection API APIs.

    Enable the APIs

データセットを作成する

mobilenet_inference_test という名前のデータセットを作成します。

SQL

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. [エディタ] ペインで、次の SQL ステートメントを実行します。

    CREATE SCHEMA `PROJECT_ID.mobilenet_inference_test`;

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

bq

  1. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

  2. bq mk コマンドを実行してリソースを作成します。

    bq mk --dataset --location=us PROJECT_ID:resnet_inference_test

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

接続を作成する

lake-connection という名前の接続を作成します。

コンソール

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. [ データを追加] をクリックし、[外部データソース] をクリックします。

  3. [接続タイプ] リストで、[BigLake とリモート関数(クラウド リソース)] を選択します。

  4. [接続 ID] フィールドに「lake-connection」と入力します。

  5. [接続を作成] をクリックします。

  6. [エクスプローラ] ペインでプロジェクトを開き、[外部接続] ノードを開いて、us.lake-connection 接続を選択します。

  7. [接続情報] ペインで、[サービス アカウント ID] フィールドの値をコピーします。この情報は、次の手順で作成する Cloud Storage バケットで接続のサービス アカウントに権限を付与する際に必要になります。

bq

  1. Cloud Shell で bq mk コマンドを実行して、接続を作成します。

    bq mk --connection --location=us --connection_type=CLOUD_RESOURCE \
    lake-connection
    
  2. bq show コマンドを実行して、接続に関する情報を取得します。

    bq show --connection us.lake-connection
    
  3. properties 列から serviceAccountId プロパティの値をコピーし、任意の場所に保存します。接続のサービス アカウントに権限を付与するには、この情報が必要です。

Cloud Storage バケットを作成する

  1. Cloud Storage バケットを作成します。
  2. バケット内に 2 つのフォルダを作成します。1 つはモデルファイル用の mobilenet という名前で、もう 1 つはデータセット用の flowers という名前のフォルダです。

接続のサービス アカウントに権限を付与する

コンソール

  1. [IAM と管理] ページに移動します。

    [IAM と管理] に移動

  2. [アクセス権を付与] をクリックします。

    [プリンシパルを追加] ダイアログが開きます。

  3. [新しいプリンシパル] フィールドに、前の手順でコピーしたサービス アカウント ID を入力します。

  4. [ロールを選択] フィールドで、[Cloud Storage] を選択し、続いて [Storage オブジェクト閲覧者] を選択します。

  5. [保存] をクリックします。

gcloud

Cloud Shell で gcloud storage buckets add-iam-policy-binding コマンドを実行します。

gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
--member=serviceAccount:MEMBER \
--role=roles/storage.objectViewer

MEMBER は、先ほどコピーしたサービス アカウント ID に置き換えます。BUCKET_NAME は、さきほど作成したバケットの名前に置き換えます。

詳細については、バケットレベルのポリシーにプリンシパルを追加するをご覧ください。

データセットを Cloud Storage にアップロードする

データセット ファイルを取得して、Cloud Storage で使用できるようにします。

  1. ローカルマシンに花のデータセットをダウンロードします。
  2. flower_photos.tgz ファイルを解凍します。
  3. flower_photos フォルダを、さきほど作成したバケット内の flowers フォルダにアップロードします。
  4. アップロードが完了したら、flower_photos フォルダ内の LICENSE.txt ファイルを削除します。

オブジェクト テーブルを作成する

アップロードした花のデータセットに基づいて、sample_images という名前のオブジェクト テーブルを作成します。

SQL

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. [エディタ] ペインで、次の SQL ステートメントを実行します。

    CREATE EXTERNAL TABLE mobilenet_inference_test.sample_images
    WITH CONNECTION `us.lake-connection`
    OPTIONS(
      object_metadata = 'SIMPLE',
      uris = ['gs://BUCKET_NAME/flowers/*']);

    BUCKET_NAME は、さきほど作成したバケットの名前に置き換えます。

bq

Cloud Shell で bq mk コマンドを実行して、接続を作成します。

bq mk --table \
--external_table_definition='gs://BUCKET_NAME/flowers/*@us.lake-connection' \
--object_metadata=SIMPLE \
mobilenet_inference_test.sample_images

BUCKET_NAME は、さきほど作成したバケットの名前に置き換えます。

モデルを Cloud Storage にアップロードする

モデルファイルを取得して、Cloud Storage で使用できるようにします。

  1. MobileNet V3 モデルをローカルマシンにダウンロードします。これにより、モデル用の saved_model.pb ファイルと variables フォルダが提供されます。
  2. saved_model.pb ファイルと variables フォルダを、さきほど作成したバケット内の mobilenet フォルダにアップロードします。

モデルを BigQuery ML に読み込む

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. [エディタ] ペインで、次の SQL ステートメントを実行します。

    CREATE MODEL `mobilenet_inference_test.mobilenet`
    OPTIONS(
      model_type = 'TENSORFLOW',
      model_path = 'gs://BUCKET_NAME/mobilenet/*');

    BUCKET_NAME は、さきほど作成したバケットの名前に置き換えます。

モデルを検査する

アップロードされたモデルを調べて、モデルの入力フィールドと出力フィールドを確認します

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. [エクスプローラ] ペインでプロジェクトを開き、mobilenet_inference_test データセットを開き、[モデル] ノードを開きます。

  3. mobilenet モデルをクリックします。

  4. 表示されたモデルペインで、[スキーマ] タブをクリックします。

  5. [ラベル] セクションを確認します。これは、モデルによって出力されるフィールドを示します。この場合、フィールド名の値は feature_vector です。

  6. [特徴] セクションを確認します。これは、モデルに入力する必要があるフィールドを示します。ML.DECODE_IMAGE 関数の SELECT ステートメントでこれらを参照します。この場合、フィールド名の値は inputs です。

推論を実行する

mobilenet モデルを使用して、sample_images オブジェクト テーブルで推論を実行します。

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. [エディタ] ペインで、次の SQL ステートメントを実行します。

    SELECT *
    FROM ML.PREDICT(
      MODEL `mobilenet_inference_test.mobilenet`,
      (SELECT uri, ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data), 224, 224, FALSE) AS inputs
      FROM mobilenet_inference_test.sample_images)
    );

    結果は次のようになります。

    --------------------------------------------------------------------------------------------------------------
    | feature_vector         | uri                                                        | inputs               |
    -------------------------------------------------------------------------------------------------------------
    | 0.850297749042511      | gs://mybucket/flowers/dandelion/3844111216_742ea491a0.jpg  | 0.29019609093666077  |
    -------------------------------------------------------------------------------------------------------------
    | -0.27427938580513      |                                                            | 0.31372550129890442  |
    -------------------------                                                            ------------------------
    | -0.23189745843410492   |                                                            | 0.039215687662363052 |
    -------------------------                                                            ------------------------
    | -0.058292809873819351  |                                                            | 0.29985997080802917  |
    -------------------------------------------------------------------------------------------------------------
    

クリーンアップ

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.