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

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

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

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

制限事項

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

  • モデルは、TensorFlow モデルをインポートする CREATE MODEL ステートメントで説明されている入力要件と制限を満たしている必要があります。

  • シリアル化されたモデルのサイズは 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. 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

モデルを 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 つ画像(f_img を想定する 1 つと文字列 f_txt を想定する 1 つ)の入力フィールドがあります。画像入力はオブジェクト テーブルから取得し、文字列入力は、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)
  );

次のステップ