教程:使用特征向量模型对对象表运行推理

本教程介绍如何基于花卉数据集中的图片创建对象表,然后使用 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.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

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

  • BigQuery:您在 BigQuery 中创建对象表时会产生存储费用。
  • BigQuery ML:您在 BigQuery ML 中创建模型和执行推断时会产生费用。
  • Cloud Storage:您需要为存储在 Cloud Storage 中的对象支付费用。

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

如需详细了解 BigQuery 存储价格,请参阅 BigQuery 文档中的存储价格

如需详细了解 BigQuery ML 价格,请参阅 BigQuery 文档中的 BigQuery ML 价格

如需详细了解 Cloud Storage 价格,请参阅 Cloud Storage 价格页面。

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 BigQuery and BigQuery Connection API API。

    启用 API

  5. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  6. 确保您的 Google Cloud 项目已启用结算功能

  7. 启用 BigQuery and BigQuery Connection API API。

    启用 API

创建数据集

创建名为 mobilenet_inference_test 的数据集:

SQL

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 编辑器窗格中,运行以下 SQL 语句:

    CREATE SCHEMA `PROJECT_ID.mobilenet_inference_test`;
    

    PROJECT_ID 替换为您的项目 ID。

bq

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

  2. 运行 bq mk 命令以创建数据集:

    bq mk --dataset --location=us PROJECT_ID:resnet_inference_test
    

    PROJECT_ID 替换为您的项目 ID。

创建连接

创建名为 lake-connection 的连接:

控制台

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 点击 添加数据,然后点击外部数据源

  3. 连接类型列表中,选择 BigLake 和远程函数(Cloud 资源)

  4. 连接 ID 字段中,输入 lake-connection

  5. 点击创建连接

  6. 探索器窗格中,展开您的项目,展开外部连接节点,然后选择 us.lake-connection 连接。

  7. 连接信息窗格中,复制服务账号 ID 字段中的值。您需要此信息向您在下一步中创建的 Cloud Storage 存储桶上的连接服务账号授予权限

bq

  1. 在 Cloud Shell 中,运行 bq mk 命令以创建连接:

    bq mk --connection --location=us --connection_type=CLOUD_RESOURCE \
    lake-connection
    
  2. 运行 bq show 命令以检索有关连接的信息:

    bq show --connection us.lake-connection
    
  3. properties 列中,复制 serviceAccountId 属性的值并将其保存到某个位置。您需要此信息才能向连接的服务账号授予权限

创建 Cloud Storage 存储桶

  1. 创建 Cloud Storage 存储桶
  2. 在存储桶中创建两个文件夹,一个名为 mobilenet(用于模型文件),一个名为 flowers(用于数据集)。

向连接的服务账号授予权限

控制台

  1. 前往 IAM 和管理页面。

    转到“IAM 和管理”

  2. 点击授予访问权限

    系统随即会打开添加主账号对话框。

  3. 新的主账号字段中,输入您之前复制的服务账号 ID。

  4. 选择角色字段中,选择 Cloud Storage,然后选择 Storage Object Viewer

  5. 点击保存

gsutil

在 Cloud Shell 中,运行 gsutil iam ch 命令:

gsutil iam ch serviceAccount:MEMBER:objectViewer gs://BUCKET_NAME

MEMBER 替换为您之前复制的服务账号 ID。将 BUCKET_NAME 替换为您之前创建的存储桶的名称。

如需了解详情,请参阅将主账号添加到存储桶级层的政策中

将数据集上传到 Cloud Storage

获取数据集文件并将其提供给 Cloud Storage:

  1. 将花卉数据集下载到本地机器。
  2. 解压 flower_photos.tgz 文件。
  3. flower_photos 文件夹上传到您之前创建的存储桶中的 flowers 文件夹。
  4. 上传完成后,删除 flower_photos 文件夹中的 LICENSE.txt 文件。

创建对象表

基于您上传的花卉数据集创建名为 sample_images 的对象表:

SQL

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 编辑器窗格中,运行以下 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 中提供这些文件:

  1. 将 MobileNet V3 模型下载到本地机器。您将获得模型的 saved_model.pb 文件和 variables 文件夹。
  2. saved_model.pb 文件和 variables 文件夹上传到您之前创建的存储桶中的 mobilenet 文件夹。

将模型加载到 BigQuery ML 中

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 编辑器窗格中,运行以下 SQL 语句:

    CREATE MODEL `mobilenet_inference_test.mobilenet`
    OPTIONS(
      model_type = 'TENSORFLOW',
      model_path = 'gs://BUCKET_NAME/mobilenet/*');
    

    BUCKET_NAME 替换为您之前创建的存储桶的名称。

检查模型

检查上传的模型以查看其输入和输出字段是什么:

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. “探索器”窗格中,展开您的项目,展开 mobilenet_inference_test 数据集,然后展开模型节点。

  3. 点击 mobilenet 模型。

  4. 在打开的模型窗格中,点击架构标签页。

  5. 查看标签部分。这会标识模型输出的字段。在本例中,字段名称值为 feature_vector

  6. 查看特征部分。这标识了必须输入模型的字段。您可以在 ML.DECODE_IMAGE 函数的 SELECT 语句中引用它们。在本例中,字段名称值为 inputs

运行推断

使用 mobilenet 模型对 sample_images 对象表运行推断:

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 编辑器窗格中,运行以下 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  |
    —-------------------------------------------------------------------------------------------------------------
    

清理

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。