使用 AutoML Vision Edge 训练图片标签模型

如需训练图片标签模型,您需要为 AutoML Vision Edge 提供一组图片和相应的标签。AutoML Vision Edge 使用此数据集在云端训练新模型,您可以在应用中使用该模型为设备端图片加标签(如需了解此功能的常规信息,请参阅概览)。

AutoML Vision Edge 是一项 Google Cloud 服务。使用该服务需遵守 Google Cloud Platform 许可协议服务专用条款,并支付相应的费用。如需了解结算信息,请参阅 AutoML 价格页面。

准备工作

1. 整理训练数据

首先,您需要汇总已加标签的图片的训练数据集。请谨记以下准则:

  • 图片必须采用以下格式:JPEG、PNG、GIF、BMP 或 ICO。

  • 每张图片大小不得超过 30 MB。请注意,AutoML Vision Edge 会在预处理过程中降低大多数图片的分辨率,因此,提供极高分辨率的图片通常并没有准确性优势。

  • 每个标签至少包含 10 个(最好是 100 个或更多)示例。

  • 针对每个标签,包含多种角度、分辨率和背景。

  • 训练数据应尽可能接近要对其执行预测的数据。例如,如果您的使用场景涉及模糊的低分辨率图片(如来自监控摄像头的图片),则训练数据应由模糊的低分辨率图片组成。

  • AutoML Vision Edge 生成的模型针对真实物体的照片进行了优化。因此可能不适用于 X 光、手绘图、扫描文档和回执等。

    此外,模型通常不能预测人类无法分配的标签。因此,如果一个人无法在观察图片 1-2 秒后分配标签,那么模型可能也无法通过训练达到此目的。

准备好训练图片后,接着准备将其导入 Firebase 中。 您可以采用以下三种方法:

方法 1:使用结构化 zip 归档文件

将您的训练图片归类整理到目录当中,每个目录以标签命名,其中包含作为该标签示例的图片。然后,将目录结构压缩成一个 zip 归档文件。

此 zip 归档文件中的目录名称不得超过 32 个 ASCII 字符,并且只能包含字母数字字符和下划线字符 (_)。

例如:

my_training_data.zip
  |____accordion
  | |____001.jpg
  | |____002.jpg
  | |____003.jpg
  |____bass_guitar
  | |____hofner.gif
  | |____p-bass.png
  |____clavier
    |____well-tempered.jpg
    |____well-tempered (1).jpg
    |____well-tempered (2).jpg

方法 2:具有 CSV 索引的 Cloud Storage

将您的训练图片上传到 Google Cloud Storage,并准备一个 CSV 文件,其中列出每张图片的网址,以及(可选)每张图片的正确标签。使用非常大的数据集时,此方法很有用。

例如,将您的图片上传到 Cloud Storage,然后准备如下所示的 CSV 文件:

gs://your-training-data-bucket/001.jpg,accordion
gs://your-training-data-bucket/002.jpg,accordion
gs://your-training-data-bucket/003.jpg,accordion
gs://your-training-data-bucket/hofner.gif,bass_guitar
gs://your-training-data-bucket/p-bass.png,bass_guitar
gs://your-training-data-bucket/well-tempered.jpg,clavier
gs://your-training-data-bucket/well-tempered%20(1).jpg,clavier
gs://your-training-data-bucket/well-tempered%20(2).jpg,clavier

图片必须存储在一个属于 Firebase 项目对应的 Google Cloud 项目的存储桶中。

如需详细了解如何准备 CSV 文件,请参阅 Cloud AutoML Vision 文档中的准备训练数据

方法 3:使用未加标签的图片

上传训练图片后,在 Firebase 控制台中逐个或采用非结构化 zip 文件为训练图片加标签。请参阅下一步。

2. 训练模型

接下来,使用图片训练模型:

  1. 在 Google Cloud 控制台中打开 Vision 数据集页面。请在出现提示时选择您的项目。

  2. 点击新建数据集,为数据集命名,选择要训练的模型类型,然后点击创建数据集

  3. 在数据集的导入标签页上,上传训练图片的 zip 归档文件或包含这些图片已上传到的目标 Cloud Storage 位置的 CSV 文件。请参阅整理训练数据

  4. 导入任务完成后,使用图片标签页验证训练数据,并为任何未加标签的图片添加标签。

  5. 训练标签页上,点击开始训练

    1. 为模型命名并选择 Edge 模型类型。

    2. 配置以下训练设置,以控制生成模型的性能:

      针对以下各项优化模型… 要使用的模型配置。如果低延迟或小的数据包很重要,您可以训练更快、更小的模型;或者,如果准确性更为重要,则可以训练较慢、更大的模型。
      节点时预算

      训练模型花费的最长时间(以计算小时数计量)。通常,训练时间越长,模型越准确。

      请注意,如果系统判断模型已经完成优化,额外的训练不会再提高准确性,训练可能在指定时间之前完成。您只需为实际所用的小时数付费。

      典型的训练时间
      非常小的若干组图片1 小时
      500 张图片2 小时
      1000 张图片3 小时
      5000 张图片6 小时
      10000 张图片7 小时
      50000 张图片11 小时
      10 万张图片13 小时
      100 万张图片18 小时

3.评估模型

训练完成后,您可以点击评估标签页以查看模型的性能指标。

此页面的一个重要用途是确定最适合您的模型的置信度阈值。置信度阈值是指为图片分配标签时模型必须具有的最低置信度。通过移动置信度阈值滑块,您可以了解不同阈值对模型的性能有何影响。可使用两个指标来衡量模型性能:精确率和召回率

在图片分类的相关概念中,精确率是指在所选阈值下,正确添加标签的图片数量与模型添加标签的图片总数之比。当模型具有高精确率时,模型错误分配标签的频率会较低(假正例较少)。

召回率是指正确添加标签的图片数量与包含模型应该能够添加标签的内容的图片数量之比。当模型具有高召回率时,它无法分配任何标签的频率会较低(假负例较少)。

您是针对精确率还是召回率进行优化,将取决于您的使用场景。如需了解详情,请参阅 AutoML Vision 新手指南包容性机器学习指南 - AutoML

当您发现可产生您能接受的指标的置信度阈值时,请记下该阈值;您将使用该置信度阈值在应用中配置模型(您可以随时使用此工具获取合适的阈值)。

4.发布或下载您的模型

如果您对模型的性能感到满意,并希望在应用中使用,可以有以下三种方案并可任意组合搭配:部署模型以进行在线预测、将模型发布到 Firebase,或下载模型并将其与您的应用捆绑在一起。

部署模型

在数据集的测试和使用标签页中,您可以部署模型以进行在线预测,这种方式会在云端运行您的模型。Cloud AutoML 文档介绍了此方法。此网站上的文档讨论了其余两种方法。

发布模型

通过将模型发布到 Firebase,您可以在不发布新应用版本的情况下更新模型,并且可以使用 Remote Config 和 A/B Testing 为不同的用户组动态提供不同的模型。

如果您选择仅通过使用 Firebase 托管模型的方式来提供模型,而不是与应用一起捆绑,则可以缩小应用的初始下载文件大小。但请注意,如果模型未与您的应用捆绑,那么在应用首次下载模型之前,任何与模型相关的功能都将无法使用。

如需发布模型,您可以采用下述两种方式:

  • 通过 Google Cloud 控制台中数据集的测试和使用页面下载 TF Lite 模型,然后在 Firebase 控制台的自定义模型页面中上传该模型。这通常是发布单个模型的最简单方法。
  • 使用 Admin SDK 将模型直接从 Google Cloud 项目发布到 Firebase。您可以使用此方法批量发布多个模型或帮助创建自动发布流水线。

如需使用 Admin SDK 模型管理 API 发布模型,请执行以下操作:

  1. 安装并初始化 SDK

  2. 发布模型。

    您将需要指定模型的资源标识符,该标识符是类似于以下示例的字符串:

    projects/PROJECT_NUMBER/locations/us-central1/models/MODEL_ID
    PROJECT_NUMBER 包含模型的 Cloud Storage 存储桶的项目号。这可能是您的 Firebase 项目或另一个 Google Cloud 项目。您可以在 Firebase 控制台或 Google Cloud 控制台信息中心的“设置”页面内找到此值。
    MODEL_ID 您通过 AutoML Cloud API 获取的模型 ID。

    Python

    # First, import and initialize the SDK.
    
    # Get a reference to the AutoML model
    source = ml.TFLiteAutoMlSource('projects/{}/locations/us-central1/models/{}'.format(
        # See above for information on these values.
        project_number,
        model_id
    ))
    
    # Create the model object
    tflite_format = ml.TFLiteFormat(model_source=source)
    model = ml.Model(
        display_name="example_model",  # This is the name you will use from your app to load the model.
        tags=["examples"],             # Optional tags for easier management.
        model_format=tflite_format)
    
    # Add the model to your Firebase project and publish it
    new_model = ml.create_model(model)
    new_model.wait_for_unlocked()
    ml.publish_model(new_model.model_id)
    

    Node.js

    // First, import and initialize the SDK.
    
    (async () => {
      // Get a reference to the AutoML model. See above for information on these
      // values.
      const automlModel = `projects/${projectNumber}/locations/us-central1/models/${modelId}`;
    
      // Create the model object and add the model to your Firebase project.
      const model = await ml.createModel({
        displayName: 'example_model',  // This is the name you use from your app to load the model.
        tags: ['examples'],  // Optional tags for easier management.
        tfliteModel: { automlModel: automlModel },
      });
    
      // Wait for the model to be ready.
      await model.waitForUnlocked();
    
      // Publish the model.
      await ml.publishModel(model.modelId);
    
      process.exit();
    })().catch(console.error);
    

下载模型并将其与应用捆绑在一起

通过将您的模型与应用捆绑,您可以确保即使 Firebase 托管的模型不可用,应用的机器学习功能仍可正常运行。

如果您发布模型并将其与应用捆绑,则应用将使用可用的最新版本。

如需下载模型,请点击数据集的测试和使用页面上的 TF Lite

后续步骤

您现已发布或下载模型,接下来将了解如何在 iOS+Android 应用中使用该模型。