教程:使用特征向量模型对对象表运行推理
本教程介绍如何基于花卉数据集中的图片创建对象表,然后使用 MobileNet V3 模型对该对象表运行推断。
MobileNet V3 模型
MobileNet V3 模型会分析图片文件并返回特征向量数组。特征向量数组是描述所分析图片的特征的数值元素列表。每个特征向量描述了多维特征空间,并在此空间中提供图片坐标。您可以使用图片的特征向量信息进一步对图片进行分类,例如使用余弦相似度对类似图片进行分组。
MobileNet V3 模型输入接受形状为 [-1, 224, 224, 3]
的 DType
tf.float32
张量,输出形状为 [-1, 1024]
的 tf.float32
张量数组。
所需权限
- 如需创建数据集,您需要拥有
bigquery.datasets.create
权限。 如需创建连接资源,您需要以下权限:
bigquery.connections.create
bigquery.connections.get
如需向连接的服务账号授予权限,您需要以下权限:
resourcemanager.projects.setIamPolicy
如需创建对象表,您需要以下权限:
bigquery.tables.create
bigquery.tables.update
bigquery.connections.delegate
如需创建存储桶,您需要拥有
storage.buckets.create
权限。如需将数据集和模型上传到 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
- 对象表的
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
- BigQuery:您在 BigQuery 中创建对象表时会产生存储费用。
- BigQuery ML:您在 BigQuery ML 中创建模型和执行推断时会产生费用。
- Cloud Storage:您需要为存储在 Cloud Storage 中的对象支付费用。
您可使用价格计算器根据您的预计使用情况来估算费用。
如需详细了解 BigQuery 存储价格,请参阅 BigQuery 文档中的存储价格。
如需详细了解 BigQuery ML 价格,请参阅 BigQuery 文档中的 BigQuery ML 价格。
如需详细了解 Cloud Storage 价格,请参阅 Cloud Storage 价格页面。
准备工作
- 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.
创建数据集
创建名为 mobilenet_inference_test
的数据集:
SQL
转到 BigQuery 页面。
在编辑器窗格中,运行以下 SQL 语句:
CREATE SCHEMA `PROJECT_ID.mobilenet_inference_test`;
将
PROJECT_ID
替换为您的项目 ID。
bq
在 Google Cloud 控制台中,激活 Cloud Shell。
运行
bq mk
命令以创建数据集:bq mk --dataset --location=us PROJECT_ID:resnet_inference_test
将
PROJECT_ID
替换为您的项目 ID。
创建连接
创建名为 lake-connection
的连接:
控制台
转到 BigQuery 页面。
点击
添加数据,然后点击外部数据源。在连接类型列表中,选择 BigLake 和远程函数(Cloud 资源)。
在连接 ID 字段中,输入
lake-connection
。点击创建连接。
在探索器窗格中,展开您的项目,展开外部连接节点,然后选择
us.lake-connection
连接。在连接信息窗格中,复制服务账号 ID 字段中的值。您需要此信息向您在下一步中创建的 Cloud Storage 存储桶上的连接服务账号授予权限。
bq
在 Cloud Shell 中,运行
bq mk
命令以创建连接:bq mk --connection --location=us --connection_type=CLOUD_RESOURCE \ lake-connection
运行
bq show
命令以检索有关连接的信息:bq show --connection us.lake-connection
在
properties
列中,复制serviceAccountId
属性的值并将其保存到某个位置。您需要此信息才能向连接的服务账号授予权限。
创建 Cloud Storage 存储桶
- 创建 Cloud Storage 存储桶。
- 在存储桶中创建两个文件夹,一个名为
mobilenet
(用于模型文件),一个名为flowers
(用于数据集)。
向连接的服务账号授予权限
控制台
前往 IAM 和管理页面。
点击授予访问权限。
系统随即会打开添加主账号对话框。
在新的主账号字段中,输入您之前复制的服务账号 ID。
在选择角色字段中,选择 Cloud Storage,然后选择 Storage Object Viewer。
点击保存。
gsutil
在 Cloud Shell 中,运行 gsutil iam ch
命令:
gsutil iam ch serviceAccount:MEMBER:objectViewer gs://BUCKET_NAME
将 MEMBER
替换为您之前复制的服务账号 ID。将 BUCKET_NAME
替换为您之前创建的存储桶的名称。
如需了解详情,请参阅将主账号添加到存储桶级层的政策中。
将数据集上传到 Cloud Storage
获取数据集文件并将其提供给 Cloud Storage:
- 将花卉数据集下载到本地机器。
- 解压
flower_photos.tgz
文件。 - 将
flower_photos
文件夹上传到您之前创建的存储桶中的flowers
文件夹。 - 上传完成后,删除
flower_photos
文件夹中的LICENSE.txt
文件。
创建对象表
基于您上传的花卉数据集创建名为 sample_images
的对象表:
SQL
转到 BigQuery 页面。
在编辑器窗格中,运行以下 SQL 语句:
CREATE EXTERNAL TABLE mobilenet_inference_test.sample_images WITH CONNECTION `us.lake-connection` OPTIONS( object_metadata = 'SIMPLE', uris = ['gs://BUCKET_NAME/flowers/*']);
将
BUCKET_NAME
替换为您之前创建的存储桶的名称。
bq
在 Cloud Shell 中,运行 bq mk
命令以创建连接:
bq mk --table \ --external_table_definition='gs://BUCKET_NAME/flowers/*@us.lake-connection' \ --object_metadata=SIMPLE \ mobilenet_inference_test.sample_images
将 BUCKET_NAME
替换为您之前创建的存储桶的名称。
将模型上传到 Cloud Storage
获取模型文件,并在 Cloud Storage 中提供这些文件:
- 将 MobileNet V3 模型下载到本地机器。您将获得模型的
saved_model.pb
文件和variables
文件夹。 - 将
saved_model.pb
文件和variables
文件夹上传到您之前创建的存储桶中的mobilenet
文件夹。
将模型加载到 BigQuery ML 中
转到 BigQuery 页面。
在编辑器窗格中,运行以下 SQL 语句:
CREATE MODEL `mobilenet_inference_test.mobilenet` OPTIONS( model_type = 'TENSORFLOW', model_path = 'gs://BUCKET_NAME/mobilenet/*');
将
BUCKET_NAME
替换为您之前创建的存储桶的名称。
检查模型
检查上传的模型以查看其输入和输出字段是什么:
转到 BigQuery 页面。
在“探索器”窗格中,展开您的项目,展开
mobilenet_inference_test
数据集,然后展开模型节点。点击
mobilenet
模型。在打开的模型窗格中,点击架构标签页。
查看标签部分。这会标识模型输出的字段。在本例中,字段名称值为
feature_vector
。查看特征部分。这标识了必须输入模型的字段。您可以在
ML.DECODE_IMAGE
函数的SELECT
语句中引用它们。在本例中,字段名称值为inputs
。
运行推断
使用 mobilenet
模型对 sample_images
对象表运行推断:
转到 BigQuery 页面。
在编辑器窗格中,运行以下 SQL 语句:
SELECT * FROM ML.PREDICT( MODEL `mobilenet_inference_test.mobilenet`, (SELECT uri, ML.RESIZE_IMAGE(ML.DECODE_IMAGE(data), 224, 224, FALSE) AS inputs FROM mobilenet_inference_test.sample_images) );
结果应如下所示:
-------------------------------------------------------------------------------------------------------------- | feature_vector | uri | inputs | —------------------------------------------------------------------------------------------------------------- | 0.850297749042511 | gs://mybucket/flowers/dandelion/3844111216_742ea491a0.jpg | 0.29019609093666077 | —------------------------------------------------------------------------------------------------------------- | -0.27427938580513 | | 0.31372550129890442 | —------------------------- ------------------------ | -0.23189745843410492 | | 0.039215687662363052 | —------------------------- ------------------------ | -0.058292809873819351 | | 0.29985997080802917 | —-------------------------------------------------------------------------------------------------------------
清理
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.