Amazon SageMaker 中 TensorFlow 对象检测模型的迁移学习

亚马逊SageMaker 提供了一套 内置算法, 预训练模型预建的解决方案模板 帮助数据科学家和机器学习 (ML) 从业者快速开始训练和部署 ML 模型。 您可以将这些算法和模型用于有监督和无监督学习。 它们可以处理各种类型的输入数据,包括表格、图像和文本。

本文是有关 SageMaker 中新内置算法的系列文章中的第二篇文章。在里面 第一篇文章,我们展示了 SageMaker 如何提供用于图像分类的内置算法。今天,我们宣布 SageMaker 提供了一种使用 TensorFlow 进行对象检测的新内置算法。这种监督学习算法支持 TensorFlow 中许多预训练模型的迁移学习。它将图像作为输入并输出图像中存在的对象以及边界框。即使没有大量训练图像,您也可以使用迁移学习来微调这些预训练模型。可通过 SageMaker 获取 内置算法 以及通过 SageMaker JumpStart 用户界面 in 亚马逊SageMaker Studio. 有关更多信息,请参阅 物体检测张量流 和示例笔记本 SageMaker Tensorflow 简介 – 对象检测.

SageMaker 中使用 TensorFlow 进行对象检测可在 TensorFlow Hub 中提供的许多预训练模型上进行迁移学习。根据训练数据中的类标签数量,一个新的随机初始化的对象检测头替换 TensorFlow 模型的现有头。整个网络(包括预训练模型)或仅顶层(对象检测头)都可以在新训练数据上进行微调。在这种迁移学习模式下,即使使用较小的数据集也可以实现训练。

如何使用新的 TensorFlow 对象检测算法

本节介绍如何使用 TensorFlow 对象检测算法 SageMaker Python 开发工具包. 有关如何在 Studio UI 中使用它的信息,请参阅 SageMaker 快速启动.

该算法支持对中列出的预训练模型进行迁移学习 TensorFlow 模型. 每个模型都由唯一的标识 model_id。以下代码显示了如何微调 ResNet50 V1 FPN 模型 model_id tensorflow-od1-ssd-resnet50-v1-fpn-640x640-coco17-tpu-8 在自定义训练数据集上。 对于每个 model_id,为了通过 估计 在 SageMaker Python SDK 的类中,您需要通过 SageMaker 中提供的实用函数来获取 Docker 映像 URI、训练脚本 URI 和预训练模型 URI。训练脚本 URI 包含数据处理、加载预训练模型、模型训练以及保存训练模型以进行推理所需的所有代码。预训练模型 URI 包含预训练模型架构定义和模型参数。请注意,对于所有 TensorFlow 对象检测模型,Docker 映像 URI 和训练脚本 URI 都是相同的。预训练模型 URI 特定于特定模型。预先训练的模型 tarball 已从 TensorFlow 预先下载,并使用适当的模型签名保存在 亚马逊简单存储服务 (Amazon S3) 存储桶,以便训练作业在网络隔离中运行。 请参阅以下代码:

from sagemaker import image_uris, model_uris, script_urisfrom sagemaker.estimator import Estimator

model_id, model_version = "tensorflow-od1-ssd-resnet50-v1-fpn-640x640-coco17-tpu-8", "*"
training_instance_type = "ml.p3.2xlarge"
# Retrieve the docker image
train_image_uri = image_uris.retrieve(model_id=model_id,model_version=model_version,image_scope="training",instance_type=training_instance_type,region=None,framework=None)# Retrieve the training script
train_source_uri = script_uris.retrieve(model_id=model_id, model_version=model_version, script_scope="training")# Retrieve the pre-trained model tarball for transfer learning
train_model_uri = model_uris.retrieve(model_id=model_id, model_version=model_version, model_scope="training")

output_bucket = sess.default_bucket()
output_prefix = "jumpstart-example-tensorflow-od-training"
s3_output_location = f"s3://{output_bucket}/{output_prefix}/output"

使用这些特定于模型的训练工件,您可以构建 估计 类:

# Create SageMaker Estimator instance
tf_od_estimator = Estimator(
    role=aws_role,
    image_uri=train_image_uri,
    source_dir=train_source_uri,
    model_uri=train_model_uri,
    entry_point="transfer_learning.py",
    instance_count=1,
    instance_type=training_instance_type,
    max_run=360000,
    hyperparameters=hyperparameters,
    output_path=s3_output_location,)

接下来,对于自定义数据集的迁移学习,您可能需要更改训练超参数的默认值,这些值在 超参数. 您可以通过调用获取这些超参数及其默认值的 Python 字典 hyperparameters.retrieve_default,根据需要更新它们,然后将它们传递给 Estimator 类。 请注意,某些超参数的默认值对于不同的模型是不同的。 对于大型模型,默认的批大小更小,并且 train_only_top_layer 超参数设置为 True. 超参数 train_only_top_layer 定义在微调过程中哪些模型参数会发生变化。 如果 train_only_top_layer is True,分类层的参数在微调过程中发生变化,其余参数保持不变。 另一方面,如果 train_only_top_layer is False,模型的所有参数都经过微调。 请参阅以下代码:

from sagemaker import hyperparameters# Retrieve the default hyper-parameters for fine-tuning the model
hyperparameters = hyperparameters.retrieve_default(model_id=model_id, model_version=model_version)# [Optional] Override default hyperparameters with custom values
hyperparameters["epochs"] = "5"

我们提供 PennFudanPed 数据集 作为微调模型的默认数据集。该数据集包含行人的图像。以下代码提供了托管在 S3 存储桶中的默认训练数据集:

# Sample training data is available in this bucket
training_data_bucket = f"jumpstart-cache-prod-{aws_region}"
training_data_prefix = "training-datasets/PennFudanPed_COCO_format/"

training_dataset_s3_path = f"s3://{training_data_bucket}/{training_data_prefix}"

最后,要启动 SageMaker 训练作业以微调模型,请调用 .fit 在 Estimator 类的对象上,同时传递训练数据集的 S3 位置:

# Launch a SageMaker Training job by passing s3 path of the training data
tf_od_estimator.fit({"training": training_dataset_s3_path}, logs=True)

有关如何使用新的 SageMaker TensorFlow 对象检测算法在自定义数据集上进行迁移学习、部署微调模型、在部署的模型上运行推理以及按原样部署预训练模型(无需先进行微调)的更多信息在自定义数据集上,请参阅以下示例笔记本: SageMaker TensorFlow 简介 – 对象检测.

TensorFlow 对象检测算法的输入/输出接口

您可以微调列出的每个预训练模型 TensorFlow 模型 到包含属于任意数量类的图像的任何给定数据集。 目标是最小化输入数据的预测误差。 微调返回的模型可以进一步部署用于推理。 以下是有关如何格式化训练数据以输入模型的说明:

  • 输入 – 一个目录,包含子目录 images 和一个文件 annotations.json.
  • 输出 – 有两个输出。首先是经过微调的模型,可以部署该模型进行推理或使用增量训练进行进一步训练。第二个是将类索引映射到类标签的文件;这与模型一起保存。

输入目录应类似于以下示例:

input_directory
      | -- images
            |--abc.png
            |--def.png
      |--annotations.json

annotations.json 文件应包含以下信息 bounding_boxes 以及他们的类别标签。它应该有一本带有键的字典 "images""annotations"。的值 "images" key 应该是一个条目列表,一个条目对应表单的每个图像 {"file_name": image_name, "height": height, "width": width, "id": image_id}。 的价值 "annotations" key 应该是一个条目列表,一个条目对应于表单的每个边界框 {"image_id": image_id, "bbox": [xmin, ymin, xmax, ymax], "category_id": bbox_label}.

使用 TensorFlow 对象检测算法进行推理

生成的模型可以托管用于推理,并支持编码的 .jpg、.jpeg 和 .png 图像格式作为 application/x-image 内容类型。输入图像会自动调整大小。输出包含框、预测类别以及每个预测的分数。 TensorFlow 对象检测模型针对每个请求处理一张图像,并仅输出 JSON 中的一行。以下是 JSON 格式的响应示例:

accept: application/json;verbose

{"normalized_boxes":[[xmin1, xmax1, ymin1, ymax1],....], "classes":[classidx1, class_idx2,...], "scores":[score_1, score_2,...], "labels": [label1, label2, ...], "tensorflow_model_output":}

If accept 被设置为 application/json,那么模型仅输出预测框、类别和分数。有关训练和推理的更多详细信息,请参阅示例笔记本 SageMaker TensorFlow 简介 – 对象检测.

通过 JumpStart UI 使用 SageMaker 内置算法

您还可以通过 JumpStart UI 单击几下,使用 SageMaker TensorFlow 对象检测和任何其他内置算法。 JumpStart 是 SageMaker 的一项功能,可让您通过图形界面训练和部署来自各种 ML 框架和模型中心的内置算法和预训练模型。它还允许您部署成熟的 ML 解决方案,将 ML 模型和各种其他 AWS 服务结合在一起,以解决目标用例。

以下是两个视频,展示了如何通过 JumpStart UI 复制我们刚刚完成的相同微调和部署过程。

微调预训练模型

以下是微调相同预训练对象检测模型的过程。

部署微调模型

模型训练完成后,您可以一键直接将模型部署到持久的实时端点。

结论

在这篇文章中,我们宣布推出 SageMaker TensorFlow 对象检测内置算法。我们提供了示例代码,说明如何使用该算法使用 TensorFlow 中的预训练模型对自定义数据集进行迁移学习。

欲了解更多信息,请查看 文件示例笔记本.


关于作者

Amazon SageMaker PlatoBlockchain 数据智能中的 TensorFlow 对象检测模型的迁移学习。垂直搜索。人工智能。Vivek Madan 博士 是一名应用科学家 Amazon SageMaker JumpStart 团队。他在伊利诺伊大学厄巴纳-香槟分校获得博士学位,并曾在佐治亚理工学院担任博士后研究员。他是机器学习和算法设计领域的活跃研究员,曾在 EMNLP、ICLR、COLT、FOCS 和 SODA 会议上发表论文。

Amazon SageMaker PlatoBlockchain 数据智能中的 TensorFlow 对象检测模型的迁移学习。垂直搜索。人工智能。若昂·莫拉 是 Amazon Web Services 的 AI/ML 专家解决方案架构师。 他主要专注于 NLP 用例并帮助客户优化深度学习模型训练和部署。 他还是低代码 ML 解决方案和 ML 专用硬件的积极支持者。

Amazon SageMaker PlatoBlockchain 数据智能中的 TensorFlow 对象检测模型的迁移学习。垂直搜索。人工智能。Ashish Khetan 博士 是一名高级应用科学家 Amazon SageMaker 内置算法 并帮助开发机器学习算法。 他在伊利诺伊大学厄巴纳香槟分校获得博士学位。 他是机器学习和统计推断领域的活跃研究员,在 NeurIPS、ICML、ICLR、JMLR、ACL 和 EMNLP 会议上发表了多篇论文。

时间戳记:

更多来自 AWS机器学习