语义分割算法 - 亚马逊 SageMaker AI
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

语义分割算法

SageMaker AI 语义分割算法提供了一种细粒度的像素级方法来开发计算机视觉应用程序。它使用预定义类集中的类标签来标记图像中的每个像素。标记是理解场景的基础,这对于越来越多的计算机视觉应用(例如自动驾驶车辆、医学成像诊断和机器人感知)来说至关重要。

为了比较,SageMaker AI 图像分类 – MXNet 是一种只分析整个图像的有监督学习算法,可将图像分类为多个输出类别之一。对象检测 – MXNet 是一种指导式学习算法,用于检测和分类图像中对象的所有实例。它使用矩形边界框指示图像中每个对象的位置和比例。

由于语义分割算法对图像中的每个像素进行分类,因此,它还提供有关图像中包含的对象形状的信息。分割输出表示为灰度图像,称作分割掩膜。分割掩膜是与输入图像形状相同的灰度图像。

SageMaker AI 语义分割算法是使用 MXNet Gluon 框架和 Gluon CV 工具包构建的。有三种内置算法可供您选择,用于训练深度神经网络。您可以使用全卷积网络 (FCN) 算法金字塔场景解析 (PSP) 算法DeepLabV3

这三种算法均具有两个不同的组件:

  • 主干(或编码器)– 一个生成可靠的特征激活映射的网络。

  • 解码器 – 一个从编码的激活映射构造分割掩膜的网络。

您还可以选择 FCN、PSP 和 DeepLabV3 算法的主干:ResNet50 或 ResNet101。这些主干包括最初在 ImageNet 分类任务中训练的预训练构件。您可以使用自己的数据微调这些主干以进行分割。或者,您可以仅使用自己的数据从头开始初始化和训练这些网络。解码器从未预先训练过。

要部署训练后的模型进行推理,请使用 SageMaker AI 托管服务。在推理期间,您可以 PNG 图像形式或以每个像素的每个类的一组概率的形式请求分割掩膜。您可以将这些掩膜用作包含其他下游图像处理或其他应用程序的较大管道的一部分。

语义分割示例笔记本

对于使用 SageMaker AI 语义分割算法来训练模型并部署该模型以执行推理的示例 Jupyter Notebook,请参阅语义分割示例。有关如何创建和访问可用于在 SageMaker AI 中运行示例的 Jupyter Notebook 实例的说明,请参阅 Amazon SageMaker 笔记本实例

要查看所有 SageMaker AI 示例的列表,请创建并打开一个笔记本实例,然后选择 SageMaker AI 示例选项卡。示例语义分割笔记本位于 Amazon 算法简介下。要打开笔记本,请选择其 Use (使用) 选项卡,然后选择 Create copy (创建副本)

语义分割算法的输入/输出接口

SageMaker AI 语义分割要求客户训练数据集位于 Amazon Simple Storage Service(Amazon S3)上。经过训练,它会在 Amazon S3 上生成结果模型构件。SageMaker AI 语义分割的输入接口格式类似于大多数标准化语义分割基准数据集的输入接口格式。Amazon S3 中的数据集预计将以两个通道呈现(一个通道用于 train,另一个通道用于 validation)并使用四个目录(两个目录用于图像,另外两个目录用于注释)。注释预计是未压缩的 PNG 图像。数据集还可能具有一个标签映射,此映射描述了如何建立注释映射。否则,算法会使用默认值。它还支持增强清单图像格式 (application/x-image),此格式用于直接从 Amazon S3 进行的管道输入模式中的训练。对于推理,终端节点接受具有 image/jpeg 内容类型的图像。

训练的工作方式

训练数据分为四个目录:traintrain_annotationvalidationvalidation_annotation。上述目录均有一个通道。对于 train_annotationvalidation_annotation,数据集还预计每个通道有一个 label_map.json 文件。如果您不提供这些 JSON 文件,SageMaker AI 会提供默认设置标签映射。

指定这些文件的数据集应类似于以下示例:

s3://bucket_name | |- train | | - 0000.jpg | - coffee.jpg |- validation | | - 00a0.jpg | - bananna.jpg |- train_annotation | | - 0000.png | - coffee.png |- validation_annotation | | - 00a0.png | - bananna.png |- label_map | - train_label_map.json | - validation_label_map.json

训练和验证目录中的每个 JPG 图像都在 train_annotationvalidation_annotation 目录中具有带相同名称的相应 PNG 标签图像。此命名约定有助于算法在训练期间将标签与其对应的图像关联。traintrain_annotationvalidationvalidation_annotation 通道是必需的。注释是单通道 PNG 图像。只要图像中的元数据(模式)帮助算法将注释图像读取为单通道 8 位无符号整数,格式就有效。有关我们对模式的支持的更多信息,请参阅 Python 图像库文档。我们建议使用 8 位像素,真彩色 P 模式。

使用模式时,编码的图像是一个简单的 8 位整数。为了从该映射到标签的映射,此算法对每个通道使用一个映射文件,称作标签映射。标签映射用于将图像中的值与实际标签索引进行映射。在默认标签映射中(如果不提供标签映射,则默认提供),注释矩阵(图像)中的像素值直接索引标签。这些图像可以是灰度 PNG 文件或 8 位索引 PNG 文件。未缩放默认情况下的标签映射文件如下:

{ "scale": "1" }

为了提供一些对比度以供查看,一些注释软件将标签图像按一定的比例缩放。为了支持这一点,SageMaker AI 语义分割算法提供了重新缩放选项以将值缩小到实际标签值。当向下缩放不将值转换为适当的整数时,算法默认为小于或等于缩放值的最大整数。以下代码说明如何设置缩放值来重新缩放标签值:

{ "scale": "3" }

以下示例说明如何使用 "scale" 值重新缩放输入注释图像的 encoded_label 值(当这些值映射到用于训练的 mapped_label 值时)。输入注释图像中的标签值为 0、3、6,标度为 3,以便将其映射到 0、1、2 来进行训练:

encoded_label = [0, 3, 6] mapped_label = [0, 1, 2]

在某些情况下,您可能需要为每个类指定特定的颜色映射。使用标签映射中的映射选项,如下面的 label_map 文件示例所示:

{ "map": { "0": 5, "1": 0, "2": 2 } }

此示例的该标签映射为:

encoded_label = [0, 5, 2] mapped_label = [1, 0, 2]

使用标签映射,您可以使用不同的注释系统和注释软件来获取数据,而无需进行大量预处理。您可以为每个通道提供一个标签映射。label_map 通道中标签映射的文件必须遵循四个目录结构的命名约定。如果您未提供标签映射,则算法假定比例为 1(默认值)。

使用增强清单格式进行训练

扩增清单格式使您可以使用图像文件在管道模式下进行训练,而无需创建 RecordIO 文件。增强清单文件包含数据对象并且应采用 JSON 行格式,如 CreateTrainingJob 请求中所述。清单中的每一行都是一个条目,其中包含图像的 Amazon S3 URI 和注释图像的 URI。

清单文件中的每个 JSON 对象必须包含一个 source-ref 键。source-ref 键应包含图像的 Amazon S3 URI 的值。将在 AttributeNames 参数值下面提供标签,如 CreateTrainingJob 请求中指定。它还可以在元数据标签下包含其他元数据,但算法会忽略这些元数据。在下面的示例中,AttributeNames 包含在图像和注释引用 ["source-ref", "city-streets-ref"] 列表中。这些名称必须附加了 -ref。在将语义分割算法与增强清单一起使用时,RecordWrapperType 参数的值必须为 "RecordIO"ContentType 参数的值必须为 application/x-recordio

{"source-ref": "S3 bucket location", "city-streets-ref": "S3 bucket location", "city-streets-metadata": {"job-name": "label-city-streets", }}

有关增强清单文件的更多信息,请参阅训练作业中的增强清单文件

增量训练

您还可以使用以前使用 SageMaker AI 训练过的模型为新模型的训练做种。当您想训练具有相同或类似数据的新模型时,此增量训练可节省训练时间。目前,仅使用内置 SageMaker AI 语义分割训练的模型支持增量训练。

要使用您自己的预训练模型,请为 CreateTrainingJob 请求将 ChannelName 指定为 InputDataConfig 中的“模型”。将模型通道的 ContentType 设置为 application/x-sagemaker-model。必须在新模型和上传到模型通道的预训练模型的输入超参数中一致地指定用于定义网络架构的 backbonealgorithmcrop_sizenum_classes 输入参数。对于预训练模型文件,您可以使用来自 SageMaker AI 输出的压缩(.tar.gz)构件。您只能将图像格式用于输入数据。有关增量训练及其使用方式说明的更多信息,请参阅在 Amazon SageMaker AI 中使用增量训练

生成推理

要查询部署到终端节点的训练后的模型,您需要提供一个图像和一个 AcceptType,后者表示所需输出的类型。终端节点接受 image/jpeg 内容类型的 JPEG 图像。如果您请求的 AcceptTypeimage/png,该算法将输出一个带有分割掩膜的 PNG 文件,其格式与标签本身相同。如果您请求的 AcceptType 为 application/x-recordio-protobuf,该算法将返回以 recordio-protobuf 格式编码的类概率。后一种格式输出一个 3D 张量,其中第三维的大小与类的数量相同。该分量表示每个像素的每个类标签的概率。

语义分割算法的 EC2 实例建议

SageMaker AI 语义分割算法仅支持 GPU 实例进行训练,我们建议使用具有更多内存的 GPU 实例进行大批量训练。该算法可以在单机配置中使用 P2、P3、G4dn 或 G5 实例进行训练。

对于推理,您可以使用 CPU 实例(例如 C5 和 M5)和/或 GPU 实例(例如 P3 和 G4dn)。有关为推理提供不同的 CPU、GPU、内存和网络容量组合的实例类型的信息,请参阅 Amazon SageMaker AI ML 实例类型