對圖片物件資料表執行推論

本文說明如何使用 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。

  • 模型的還原序列化 (記憶體內) 大小必須小於 1000 MB。

  • 模型輸入張量必須符合下列條件:

    • 資料類型為 tf.float32,且值位於 [0, 1) 中;或資料類型為 tf.uint8,且值位於 [0, 255) 中。
    • 請使用 [batch_size, weight, height, 3] 格式,其中:
      • batch_size 必須為 -1None1
      • widthheight 必須大於 0。
  • 模型必須使用下列其中一個色彩空間的圖片進行訓練:

    • RGB
    • HSV
    • YIQ
    • YUV
    • GRAYSCALE

    您可以使用 ML.CONVERT_COLOR_SPACE 函式,將輸入圖片轉換為模型訓練時使用的色彩空間。

範例模型

TensorFlow Hub 上的下列模型可與 BigQuery ML 和圖片物件資料表搭配使用:

所需權限

  • 如要將模型上傳至 Cloud Storage,您需要 storage.objects.createstorage.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. Verify 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. Verify that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery and BigQuery Connection API APIs.

    Enable the APIs

  8. 將模型上傳至 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 格式的 PyTorch 模型ONNX
    • BUCKET_PATH:包含模型的 Cloud Storage 值區路徑,格式為 [gs://bucket_name/[folder_name/]*]

    下列範例使用預設專案,並將 TensorFlow 模型載入至 BigQuery ML 做為 my_vision_model,使用來自 gs://my_bucket/my_model_foldersaved_model.pb 檔案和 variables 資料夾:

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

    檢查模型

    您可以檢查上傳的模型,瞭解模型的輸入和輸出欄位。在物件資料表上執行推論時,您需要參照這些欄位。

    如要檢查模型,請按照下列步驟操作:

    1. 前往「BigQuery」頁面

      前往 BigQuery

    2. 在「Explorer」窗格中,展開專案、包含模型的資料集,然後展開「Models」節點。

    3. 按一下模型。

    4. 在隨即開啟的模型窗格中,按一下「結構定義」分頁標籤。

    5. 查看「標籤」部分。這會識別模型輸出的欄位。

    6. 查看「功能」部分。這會指出必須輸入模型中的欄位。您可以在 ML.DECODE_IMAGE 函式的 SELECT 陳述式中參照這些值。

    如要更詳細地檢查 TensorFlow 模型 (例如判斷模型輸入的形狀),請安裝 TensorFlow 並使用 saved_model_cli show 指令

    預先處理圖片

    您必須使用 ML.DECODE_IMAGE 函式,將圖片位元組轉換為多維度 ARRAY 表示法。您可以直接在 ML.PREDICT 函式中使用 ML.DECODE_IMAGE 輸出內容,也可以將 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,以及兩個輸入欄位:一個預期是圖片 (f_img),另一個預期是字串 (f_txt)。圖片輸入內容來自物件資料表,字串輸入內容則來自標準 BigQuery 資料表,並使用 uri 欄與物件資料表聯結。

    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)
      );

    後續步驟