对图片对象表运行推断
本文档介绍如何使用 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 模型。
模型必须满足用于导入 TensorFlow 模型的
CREATE MODEL
语句中所述的输入要求和限制。模型的序列化大小必须小于 450 MB。
模型的反序列化(内存)大小必须小于 1,000 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 页面。
在探索器窗格中,展开您的项目,展开包含模型的数据集,然后展开模型节点。
点击该模型。
在打开的模型窗格中,点击架构标签页。
查看标签部分。这会标识模型输出的字段。
查看特征部分。这标识了必须输入模型的字段。您可以在
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');
请替换以下内容:
以下示例使用默认项目并将 TensorFlow 模型 my_vision_model
加载到 BigQuery ML 中(使用 gs://my_bucket/my_model_folder
中的 saved_model.pb
文件和 variables
文件夹):
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.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
。图片输入来自对象表,字符串输入来自使用 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) );