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

このチュートリアルでは、一般公開データセットからの画像に基づいてオブジェクト テーブルを作成し、ResNet 50 モデルを使用してそのオブジェクト テーブルで推論を行う方法を説明します。

ResNet 50 モデル

ResNet 50 モデルは、画像ファイルを解析し、ある画像が対応するクラスに属する可能性を表す一連のベクトル(ロジット)を出力します。詳細については、モデルの TensorFlow Hub ページUsage セクションをご覧ください。

ResNet 50 モデルの入力は、形状 [-1, 224, 224, 3]DTypefloat32 のテンソルを取ります。出力は、形状 [-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

データセットを作成する

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

SQL

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

    [BigQuery] に移動

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

    CREATE SCHEMA `PROJECT_ID.resnet_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. [接続情報] ペインで、[サービス アカウント ID] フィールドの値をコピーし、任意の場所に保存します。接続のサービス アカウントに権限を付与するには、この情報が必要です。

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 バケットを作成する

モデルファイルを格納する Cloud Storage バケットを作成します。

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

コンソール

  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 は、さきほど作成したバケットの名前に置き換えます。

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

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

一般公開されている gs://cloud-samples-data/vision バケット内の画像ファイルに基づいて、vision_images という名前のオブジェクト テーブルを作成します。

SQL

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

    [BigQuery] に移動

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

    CREATE EXTERNAL TABLE resnet_inference_test.vision_images
    WITH CONNECTION `us.lake-connection`
    OPTIONS(
      object_metadata = 'SIMPLE',
      uris = ['gs://cloud-samples-data/vision/*.jpg']
    );

bq

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

bq mk --table \
--external_table_definition='gs://cloud-samples-data/vision/*.jpg@us.lake-connection' \
--object_metadata=SIMPLE \
resnet_inference_test.vision_images

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

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

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

モデルを BigQuery ML に読み込む

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

    [BigQuery] に移動

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

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

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

モデルを検査する

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

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

    [BigQuery] に移動

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

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

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

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

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

推論を実行する

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

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

    [BigQuery] に移動

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

    SELECT *
    FROM ML.PREDICT(
      MODEL `resnet_inference_test.resnet`,
      (SELECT uri, ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data), 224, 224, FALSE) AS input_1
      FROM resnet_inference_test.vision_images)
    );

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

    -------------------------------------------------------------------------------------------------------------------------------------
    | activation_49           | uri                                                                                           | input_1 |
    ------------------------------------------------------------------------------------------------------------------------------------
    | 1.0254175464297077e-07  | gs://cloud-samples-data/vision/automl_classification/flowers/daisy/21652746_cc379e0eea_m.jpg  | 0.0     |
    ------------------------------------------------------------------------------------------------------------------------------------
    | 2.1671139620593749e-06  |                                                                                               | 0.0     |
    --------------------------                                                                                               -----------
    | 8.346052027263795e-08   |                                                                                               | 0.0     |
    --------------------------                                                                                               -----------
    | 1.159310958342985e-08   |                                                                                               | 0.0     |
    ------------------------------------------------------------------------------------------------------------------------------------
    

クリーンアップ

  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.