画像オブジェクト テーブルで推論を実行する

このドキュメントでは、BigQuery ML を使用して画像のオブジェクト テーブルに対して推論を実行する方法について説明します。

概要

オブジェクト テーブルを ML.PREDICT 関数への入力として使用して、画像データに対して推論を実行できます。

それには、まず適切なモデルを選択して Cloud Storage にアップロードし、CREATE MODEL ステートメントを実行して BigQuery にインポートする必要があります。独自のモデルを作成する、または TensorFlow Hub からモデルをダウンロードすることができます。

制限事項

  • オブジェクト テーブルに対する BigQuery ML は、予約による容量ベースの料金を使用する場合のみサポートされます。オンデマンド料金はサポートされていません。
  • オブジェクト テーブルに関連付けられた画像ファイルは、次の要件を満たす必要があります。
    • サイズが 20 MB 未満。
    • 形式が JPEG、PNG、BMP のいずれか。
  • オブジェクト テーブルに関連付けられている画像ファイルの合計サイズは 1 TB 未満にする必要があります。
  • モデルは次のいずれかである必要があります。

  • モデルは、サポートされている入力で説明されている入力要件と制限を満たしている必要があります。

  • シリアル化されたモデルのサイズは 450 MB 未満にする必要があります。

  • モデルのシリアル化解除された(メモリ内の)サイズは、1,000 MB 未満である必要があります。

  • モデルの入力テンソルは、次の条件を満たす必要があります。

    • [0, 1) の値の tf.float32 のデータ型がある、または [0, 255) の値の tf.uint8 のデータ型がある。
    • 形状は [batch_size, weight, height, 3] である。ここで、
      • batch_size は、-1None、または 1 にする必要がある。
      • widthheight は 0 よりも大きい必要がある。
  • モデルは、次の色空間のいずれかの画像でトレーニングする必要があります。

    • RGB
    • HSV
    • YIQ
    • YUV
    • GRAYSCALE

    ML.CONVERT_COLOR_SPACE 関数を使用して、入力画像をモデルのトレーニングに使用した色空間に変換できます。

サンプルモデル

TensorFlow Hub の次のモデルは、BigQuery ML と画像オブジェクト テーブルで動作します。

必要な権限

  • モデルを 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

始める前に

  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. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. BigQuery and BigQuery Connection API API を有効にします。

    API を有効にする

  5. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  6. Google Cloud プロジェクトで課金が有効になっていることを確認します

  7. BigQuery and BigQuery Connection API API を有効にします。

    API を有効にする

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

モデルをアップロードする手順は次のとおりです。

  1. 独自のモデルを作成した場合は、そのモデルをローカルに保存します。TensorFlow Hub のモデルを使用している場合は、ローカルマシンにモデルをダウンロードします。TensorFlow を使用している場合、saved_model.pb ファイルとモデル用の variables フォルダが提供されます。
  2. 必要に応じて、Cloud Storage バケットを作成します。
  3. モデル アーティファクトをバケットにアップロードします。

モデルを BigQuery ML に読み込む

画像オブジェクト テーブルを操作するモデルの読み込みは、構造化データを操作するモデルの読み込みと同じです。モデルを BigQuery ML に読み込む手順は次のとおりです。

CREATE MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`
OPTIONS(
  model_type = 'MODEL_TYPE',
  model_path = 'BUCKET_PATH');

次のように置き換えます。

  • PROJECT_ID: プロジェクト ID。
  • DATASET_ID: モデルを格納するデータセットの ID。
  • MODEL_NAME: モデルの名前。
  • MODEL_TYPE: 次の値のいずれかを使用します。
    • TENSORFLOW(TensorFlow モデルの場合)
    • ONNX(ONNX 形式の PyTorch モデルの場合)
  • BUCKET_PATH: モデルを含む Cloud Storage バケットへのパス([gs://bucket_name/[folder_name/]*] 形式)。

次の例では、デフォルトのプロジェクトを使用し、gs://my_bucket/my_model_foldersaved_model.pb ファイルと variables フォルダを使用して、TensorFlow モデルを my_vision_model として BigQuery ML に読み込みます。

CREATE MODEL `my_dataset.my_vision_model`
OPTIONS(
  model_type = 'TENSORFLOW',
  model_path = 'gs://my_bucket/my_model_folder/*');

モデルを検査する

アップロードされたモデルを検査すると、モデルの入力フィールドと出力フィールドが何かを確認できます。これらのフィールドは、オブジェクト テーブルに対して推論を実行するときに参照する必要があります。

モデルを検査する手順は次のとおりです。

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

    [BigQuery] に移動

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

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

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

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

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

モデル入力の形状を判断するなど、TensorFlow モデルを詳しく検査する場合は、TensorFlow をインストールして、saved_model_cli show コマンドを使用します。

画像を前処理する

画像のバイトを多次元の ARRAY 表現に変換するには、ML.DECODE_IMAGE 関数を使用する必要があります。ML.DECODE_IMAGE 出力を ML.PREDICT 関数で直接使用できます。または、ML.DECODE_IMAGE の結果をテーブル列に書き込み、ML.PREDICT を読み込む際に、その列を参照できます。

次の例では、ML.DECODE_IMAGE 関数の出力をテーブルに書き込みます。

CREATE OR REPLACE TABLE mydataset.mytable AS (
  SELECT ML.DECODE_IMAGE(data) AS decoded_image FROM mydataset.object_table
  );

次の関数を使用して、モデルに対応するように画像をさらに処理します。

これらは ML.PREDICT 関数の一部として使用することも、ML.DECODE_IMAGE によって出力される画像データを含むテーブル列で実行することもできます。

推論を実行する

適切なモデルを読み込み、必要に応じて画像データを前処理したら、画像データに対して推論を実行できます。

推論を実行するには、次のようにします。

SELECT *
FROM ML.PREDICT(
  MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME`,
  (SELECT [other columns from the object table,] IMAGE_DATA AS MODEL_INPUT
  FROM PROJECT_ID.DATASET_ID.TABLE_NAME)
);

次のように置き換えます。

  • PROJECT_ID: モデルとオブジェクト テーブルを含むプロジェクトのプロジェクト ID。
  • DATASET_ID: モデルとオブジェクト テーブルを含むデータセットの ID。
  • MODEL_NAME: モデルの名前。
  • IMAGE_DATA: ML.DECODE_IMAGE 関数の出力と、ML.DECODE_IMAGE またはその他の画像処理関数によって出力される画像データを含むテーブル列のいずれかによって表される画像データ。
  • MODEL_INPUT: モデルの入力フィールドの名前。この情報を確認するには、モデルの検査を行い、[特徴] セクションでフィールド名を確認します。
  • TABLE_NAME: オブジェクト テーブルの名前。

例 1

次の例では、ML.PREDICT 関数で直接 ML.DECODE_IMAGE 関数を使用します。これは、入力フィールドが input で、出力フィールドが feature のモデルにおける、オブジェクト テーブル内のすべての画像の推論結果を返します。

SELECT * FROM
ML.PREDICT(
  MODEL `my_dataset.vision_model`,
  (SELECT uri, ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data), 480, 480, FALSE) AS input
  FROM `my_dataset.object_table`)
);

例 2

次の例では、ML.PREDICT 関数で直接 ML.DECODE_IMAGE 関数を使用し、ML.PREDICT 関数で ML.CONVERT_COLOR_SPACE 関数を使用して、画像の色空間を RBG から YIQ に変換します。また、オブジェクト テーブル フィールドを使用して、推論に含まれるオブジェクトをフィルタする方法も示しています。これは、入力フィールドが input で、出力フィールドが feature のモデルにおける、オブジェクト テーブル内のすべての JPG 画像の推論結果を返します。

SELECT * FROM
  ML.PREDICT(
    MODEL `my_dataset.vision_model`,
    (SELECT uri, ML.CONVERT_COLOR_SPACE(ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data), 224, 280, TRUE), 'YIQ') AS input
    FROM `my_dataset.object_table`
    WHERE content_type = 'image/jpeg')
  );

例 3

次の例では、テーブル列に書き込まれたが、それ以上処理されていない ML.DECODE_IMAGE の結果を使用します。ML.PREDICT 関数で ML.RESIZE_IMAGEML.CONVERT_IMAGE_TYPE を使用して、画像データを処理します。これは、入力フィールドが input で、出力フィールドが feature のモデルにおける、デコードされた画像テーブル内のすべての画像の推論結果を返します。

デコードされた画像テーブルを作成します。

CREATE OR REPLACE TABLE `my_dataset.decoded_images`
  AS (SELECT ML.DECODE_IMAGE(data) AS decoded_image
  FROM `my_dataset.object_table`);

デコードされた画像テーブルで推論を実行します。

SELECT * FROM
ML.PREDICT(
  MODEL`my_dataset.vision_model`,
  (SELECT uri, ML.CONVERT_IMAGE_TYPE(ML.RESIZE_IMAGE(decoded_image, 480, 480, FALSE)) AS input
  FROM `my_dataset.decoded_images`)
);

例 4

次の例では、テーブル列に書き込まれ、ML.RESIZE_IMAGE を使用して前処理された ML.DECODE_IMAGE の結果を使用します。これは、入力フィールドが input で、出力フィールドが feature のモデルにおける、デコードされた画像テーブル内のすべての画像の推論結果を返します。

テーブルを作成します。

CREATE OR REPLACE TABLE `my_dataset.decoded_images`
  AS (SELECT ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data) 480, 480, FALSE) AS decoded_image
  FROM `my_dataset.object_table`);

デコードされた画像テーブルで推論を実行します。

SELECT * FROM
ML.PREDICT(
  MODEL `my_dataset.vision_model`,
  (SELECT uri, decoded_image AS input
  FROM `my_dataset.decoded_images`)
);

例 5

次の例では、ML.PREDICT 関数で直接 ML.DECODE_IMAGE 関数を使用します。この例では、モデルには、embeddings という出力フィールドと、2 つの入力フィールド(1 つは画像 f_img を格納し、もう 1 つは文字列 f_txt を格納します)があります。画像入力はオブジェクト テーブルから取得し、文字列入力は、uri 列を使用してオブジェクト テーブルと結合された標準 BigQuery テーブルから取得します。

SELECT * FROM
  ML.PREDICT(
    MODEL `my_dataset.mixed_model`,
    (SELECT uri, ML.RESIZE_IMAGE(ML.DECODE_IMAGE(my_dataset.my_object_table.data), 224, 224, FALSE) AS f_img,
      my_dataset.image_description.description AS f_txt
    FROM `my_dataset.object_table`
    JOIN `my_dataset.image_description`
    ON object_table.uri = image_description.uri)
  );

次のステップ