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

本文說明如何使用 BigQuery ML 在圖像物件資料表上執行推論。

您可以使用物件資料表做為 ML.PREDICT 函式的輸入內容,對圖片資料執行推論。

如要這麼做,您必須先選擇合適的模型,將其上傳至 Cloud Storage,然後執行 CREATE MODEL 陳述式,將模型匯入 BigQuery。您可以自行建立模型,或從 TensorFlow Hub 下載模型。

限制

  • 您必須透過預留功能使用容量定價,才能使用 BigQuery ML 匯入的模型搭配物件表,系統不支援以量計價。
  • 與物件資料表相關聯的圖片檔案必須符合下列規定:
    • 大小小於 20 MB。
    • 格式為 JPEG、PNG 或 BMP。
  • 與物件資料表相關聯的圖片檔案總大小必須小於 1 TB。
  • 模型必須是下列其中一種:

  • 模型必須符合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. 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

  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 (適用於採用 ONNX 格式的 PyTorch 模型)
    • BUCKET_PATH:包含模型的 Cloud Storage 值區路徑,格式為 [gs://bucket_name/[folder_name/]*]

    以下範例會使用預設專案,並使用 gs://my_bucket/my_model_folder 中的 saved_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. 在「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.DECODE_IMAGE 的結果,這些結果已寫入資料表資料欄,並使用 ML.RESIZE_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)
      );

    後續步驟