針對圖片物件資料表執行推論
本文說明如何使用 BigQuery ML 在圖像物件資料表上執行推論。
您可以使用物件資料表做為 ML.PREDICT
函式的輸入內容,對圖片資料執行推論。
如要這麼做,您必須先選擇合適的模型,將其上傳至 Cloud Storage,然後執行 CREATE MODEL
陳述式,將模型匯入 BigQuery。您可以自行建立模型,或從 TensorFlow Hub 下載模型。
限制
- 您必須透過預留功能使用容量定價,才能使用 BigQuery ML 匯入的模型搭配物件表,系統不支援以量計價。
- 與物件資料表相關聯的圖片檔案必須符合下列規定:
- 大小小於 20 MB。
- 格式為 JPEG、PNG 或 BMP。
- 與物件資料表相關聯的圖片檔案總大小必須小於 1 TB。
模型必須是下列其中一種:
- 採用 SavedModel 格式的 TensorFlow 或 TensorFlow Lite 模型。
- 採用 ONNX 格式的 PyTorch 模型。
模型必須符合
CREATE MODEL
陳述式一文中所述的輸入需求和限制。模型的序列化大小必須小於 450 MB。
模型的反序列化 (記憶體內) 大小必須小於 1000 MB。
模型輸入張量必須符合下列條件:
- 資料類型為
tf.float32
,且值位於[0, 1)
中,或是資料類型為tf.uint8
,且值位於[0, 255)
中。 - 使用形狀
[batch_size, weight, height, 3]
,其中:batch_size
必須為-1
、None
或1
。width
和height
必須大於 0。
- 資料類型為
模型必須使用下列任一色彩空間的圖片進行訓練:
RGB
HSV
YIQ
YUV
GRAYSCALE
您可以使用
ML.CONVERT_COLOR_SPACE
函式,將輸入圖片轉換為模型訓練時使用的色彩空間。
模型範例
TensorFlow Hub 中的下列模型可搭配 BigQuery ML 和圖像物件資料表使用:
- ResNet 50。如要嘗試使用這個模型,請參閱「教學課程:使用分類模型對物件資料表執行推論」一文。
- MobileNet V3。如要試用這個模型,請參閱教學課程:使用特徵向量模型對物件資料表執行推論。
所需權限
- 如要將模型上傳至 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
- 物件資料表上的
事前準備
- 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.
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Make sure that billing is enabled for your Google Cloud project.
Enable the BigQuery and BigQuery Connection API APIs.
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Make sure that billing is enabled for your Google Cloud project.
Enable the BigQuery and BigQuery Connection API APIs.
- 如果您已建立模型,請在本機儲存模型。如果您使用的是 TensorFlow Hub 的模型,請將模型下載到本機電腦。如果您使用的是 TensorFlow,這應該會為模型提供
saved_model.pb
檔案和variables
資料夾。 - 必要時,建立 Cloud Storage 值區。
- 上傳模型構件至值區。
PROJECT_ID
:您的專案 ID。DATASET_ID
:包含模型的資料集 ID。MODEL_NAME
:模型名稱。MODEL_TYPE
:請使用下列其中一個值:TENSORFLOW
(適用於 TensorFlow 模型)ONNX
(適用於採用 ONNX 格式的 PyTorch 模型)
BUCKET_PATH
:包含模型的 Cloud Storage 值區路徑,格式為[gs://bucket_name/[folder_name/]*]
。前往「BigQuery」頁面
在「Explorer」窗格中,展開專案、展開包含模型的資料集,然後展開「Models」節點。
按一下模型。
在隨即開啟的模型面板中,按一下「結構定義」分頁標籤。
請查看「標籤」部分。這會識別模型輸出的欄位。
請查看「功能」部分。這會指出必須輸入模型的欄位。您可以在
ML.DECODE_IMAGE
函式的SELECT
陳述式中參照這些項目。ML.CONVERT_COLOR_SPACE
函式可將使用RGB
色域的圖片轉換為其他色域。ML.CONVERT_IMAGE_TYPE
函式會將ML.DECODE_IMAGE
函式輸出的像素值,從浮點數轉換為範圍為[0, 255)
的整數。ML.RESIZE_IMAGE
函式會調整圖片大小。PROJECT_ID
:包含模型和物件表格的專案 ID。DATASET_ID
:包含模型和物件資料表的資料集 ID。MODEL_NAME
:模型名稱。IMAGE_DATA
:圖片資料,可由ML.DECODE_IMAGE
函式的輸出內容表示,或由包含ML.DECODE_IMAGE
或其他圖片處理函式輸出的圖片資料的資料欄表示。MODEL_INPUT
:模型的輸入欄位名稱。您可以檢查模型,並查看「特徵」部分的欄位名稱,即可找到這項資訊。TABLE_NAME
:物件表格名稱。- 瞭解如何使用遠端函式分析物件資料表。
- 請嘗試使用特徵向量模型,針對物件資料表執行推論。
- 請嘗試使用分類模型,針對物件資料表執行推論。
- 請嘗試使用遠端函式分析物件資料表。
- 請嘗試使用
ML.ANNOTATE_IMAGE
函式為圖片加上註解。
將模型上傳至 Cloud Storage
如要上傳模型,請按照下列步驟操作:
將模型載入 BigQuery ML
載入可搭配圖像物件表格使用的模型,與載入可搭配結構化資料使用的模型相同。請按照下列步驟將模型載入 BigQuery ML:
CREATE MODEL `PROJECT_ID.DATASET_ID.MODEL_NAME` OPTIONS( model_type = 'MODEL_TYPE', model_path = 'BUCKET_PATH');
請依指示取代下列項目:
以下範例會使用預設專案,並使用 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/*');
檢查模型
您可以檢查已上傳的模型,查看其輸入和輸出欄位。您需要在物件資料表上執行推論時參照這些欄位。
如要檢查模型,請按照下列步驟操作:
如要進一步檢查 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) );
請依指示取代下列項目:
範例
範例 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_IMAGE
和 ML.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) );