

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

# 语义分割算法
<a name="semantic-segmentation"></a>

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

相比之下， SageMaker 人工智能[图像分类- MXNet](image-classification.md)是一种监督学习算法，它仅分析整张图像，将其归类为多个输出类别之一。[物体检测- MXNet](object-detection.md) 是一种指导式学习算法，用于检测和分类图像中对象的所有实例。它使用矩形边界框指示图像中每个对象的位置和比例。

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

 SageMaker 人工智能语义分割算法是使用 [MXNet Gluon 框架和 Gluon CV 工具包](https://github.com/dmlc/gluon-cv)构建的。有三种内置算法可供您选择，用于训练深度神经网络。[您可以使用[全卷积网络 (FCN) 算法、[金字塔场景解析 (PSP](https://arxiv.org/abs/1612.01105)) 算法](https://arxiv.org/abs/1605.06211)或 V3。DeepLab](https://arxiv.org/abs/1706.05587)

这三种算法均具有两个不同的组件：
+ *主干*（或*编码器*）– 一个生成可靠的特征激活映射的网络。
+ *解码器* – 一个从编码的激活映射构造分割掩膜的网络。

你还可以选择 FCN、PSP 和 DeepLab V3 算法的主干：[ResNet50](https://arxiv.org/abs/1512.03385) 或 101。 ResNet这些主干包括最初针对[ImageNet](http://www.image-net.org/)分类任务训练的预训练工件。您可以使用自己的数据微调这些主干以进行分割。或者，您可以仅使用自己的数据从头开始初始化和训练这些网络。解码器从未预先训练过。

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

**Topics**
+ [语义分割示例笔记本](#semantic-segmentation-sample-notebooks)
+ [语义分割算法的输入/输出接口](#semantic-segmentation-inputoutput)
+ [语义分割算法的 EC2 实例建议](#semantic-segmentation-instances)
+ [语义分割超参数](segmentation-hyperparameters.md)
+ [调整语义分割模型](semantic-segmentation-tuning.md)

## 语义分割示例笔记本
<a name="semantic-segmentation-sample-notebooks"></a>

[有关使用 SageMaker AI 语义分割算法训练模型并将其部署以执行推理的 Jupyter 笔记本示例，请参阅语义分割示例。](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/semantic_segmentation_pascalvoc/semantic_segmentation_pascalvoc.html)有关如何创建和访问可用于在 SageMaker AI 中运行示例的 Jupyter 笔记本实例的说明，请参阅。[Amazon SageMaker 笔记本实例](nbi.md)

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

## 语义分割算法的输入/输出接口
<a name="semantic-segmentation-inputoutput"></a>

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

### 训练的工作方式
<a name="semantic-segmentation-inputoutput-training"></a>

训练数据分为四个目录：`train`、`train_annotation`、`validation` 和 `validation_annotation`。上述目录均有一个通道。对于 `train_annotation` 和 `validation_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_annotation` 和 `validation_annotation` 目录中具有带相同名称的相应 PNG 标签图像。此命名约定有助于算法在训练期间将标签与其对应的图像关联。`train`、`train_annotation`、`validation` 和 `validation_annotation` 通道是必需的。注释是单通道 PNG 图像。只要图像中的元数据（模式）帮助算法将注释图像读取为单通道 8 位无符号整数，格式就有效。有关我们对模式的支持的更多信息，请参阅 [Python 图像库文档](https://pillow.readthedocs.io/en/stable/handbook/concepts.html#modes)。我们建议使用 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（默认值）。

### 使用增强清单格式进行训练
<a name="semantic-segmentation-inputoutput-training-augmented-manifest"></a>

扩增清单格式使您可以使用图像文件在管道模式下进行训练，而无需创建 RecordIO 文件。增强清单文件包含数据对象并且应采用 [JSON 行](http://jsonlines.org/)格式，如 [https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateTrainingJob.html](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateTrainingJob.html) 请求中所述。清单中的每一行都是一个条目，其中包含图像的 Amazon S3 URI 和注释图像的 URI。

清单文件中的每个 JSON 对象必须包含一个 `source-ref` 键。`source-ref` 键应包含图像的 Amazon S3 URI 的值。将在 `AttributeNames` 参数值下面提供标签，如 [https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateTrainingJob.html](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateTrainingJob.html) 请求中指定。它还可以在元数据标签下包含其他元数据，但算法会忽略这些元数据。在下面的示例中，`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", }}
```

有关增强清单文件的更多信息，请参阅[训练作业中的增强清单文件](augmented-manifest.md)。

### 增量训练
<a name="semantic-segmentation-inputoutput-incremental-training"></a>

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

要使用您自己的预训练模型，请为 [https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateTrainingJob.html](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateTrainingJob.html) 请求将 `ChannelName` 指定为 `InputDataConfig` 中的“模型”。将模型通道的 `ContentType` 设置为 `application/x-sagemaker-model`。必须在新模型和上传到模型通道的预训练模型的输入超参数中一致地指定用于定义网络架构的 `backbone`、`algorithm`、`crop_size` 和 `num_classes` 输入参数。对于预训练的模型文件，您可以使用 AI 输出中的压缩 (.tar.gz) 工件。 SageMaker 您只能将图像格式用于输入数据。有关增量训练及其使用方式说明的更多信息，请参阅[在 Amazon A SageMaker I 中使用增量训练](incremental-training.md)。

### 生成推理
<a name="semantic-segmentation-inputoutput-inference"></a>

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

## 语义分割算法的 EC2 实例建议
<a name="semantic-segmentation-instances"></a>

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

对于推理，您可以使用 CPU 实例（例如 C5 和 M5）和/或 GPU 实例（例如 P3 和 G4dn）。有关为推理提供不同组合的 CPU、GPU、内存和网络容量的实例类型的信息，请参阅 [Amazon A SageMaker I ML 实例类型](https://www.amazonaws.cn/sagemaker/pricing/instance-types/)。