

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

# 图像分类- MXNet
<a name="image-classification"></a>

Amazon SageMaker 图像分类算法是一种支持多标签分类的监督学习算法。该算法将一个图像作为输入，并输出分配给该图像的一个或多个标签。它使用卷积神经网络，可从头开始训练，也可在没有大量训练图像可用时使用迁移学习进行训练。

亚马逊 A SageMaker I 图像分类算法的推荐输入格式是 Apache Recor MXNet [dio](https://mxnet.apache.org/api/faq/recordio)。但是，您也可以使用 .jpg 或 .png 格式的原始图像。有关机器学习系统的高效数据准备和加载的广泛概述，请参阅[本讨论](https://mxnet.apache.org/api/architecture/note_data_loading)。

**注意**  
为了保持与现有深度学习框架的更好的互操作性，这与其他 Amazon A SageMaker I 算法常用的 protobuf 数据格式不同。

有关卷积网络的更多信息，请参阅：
+ [《图像识别中的深度残差学习》](https://arxiv.org/abs/1512.03385)，何凯明等人编著，计算机视觉和模式识别 2016 年 IEEE 会议
+ [ImageNet 图像数据库](http://www.image-net.org/)
+ [使用 Gluon-CV 进行图像分类和 MXNet](https://gluon-cv.mxnet.io/build/examples_classification/index.html)

**Topics**
+ [图像分类算法的输入/输出接口](#IC-inputoutput)
+ [图像分类算法的 EC2 实例建议](#IC-instances)
+ [图像分类示例笔记本](#IC-sample-notebooks)
+ [图像分类的工作原理](IC-HowItWorks.md)
+ [图像分类超参数](IC-Hyperparameter.md)
+ [优化图像分类模型](IC-tuning.md)

## 图像分类算法的输入/输出接口
<a name="IC-inputoutput"></a>

 SageMaker AI 图像分类算法支持 recordio (`application/x-recordio`) 和图像 (`image/png``image/jpeg`、和`application/x-image`) 内容类型，用于在文件模式下训练，并支持 recordio (`application/x-recordio`) 内容类型用于在管道模式下训练。但是，您还可以使用图像文件（`image/png`、`image/jpeg` 和 `application/x-image`）在管道模式下进行训练，无需使用扩增清单格式创建 RecordIO 文件。

对于文件模式和管道模式支持分布式训练。在管道模式下使用 RecordIO 内容类型时，必须将 `S3DataSource` 的 `S3DataDistributionType` 设置为 `FullyReplicated`。该算法支持完全复制的模型，将数据复制到每台计算机上。

该算法支持使用 `image/png`、`image/jpeg` 和 `application/x-image` 进行推理。

### 使用 RecordIO 格式进行训练
<a name="IC-recordio-training"></a>

如果您使用 RecordIO 格式进行训练，则同时指定 `train` 和 `validation` 通道作为 [https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateTrainingJob.html](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateTrainingJob.html) 请求的 `InputDataConfig` 参数值。在 `train` 通道中指定一个 RecordIO (`.rec`) 文件，在 `validation` 通道中指定一个 RecordIO 文件。将两个通道的内容类型设置为 `application/x-recordio`。

### 使用图像格式进行训练
<a name="IC-image-training"></a>

如果您使用图像格式进行训练，则指定 `train`、`validation`、`train_lst` 和 `validation_lst` 通道作为 `InputDataConfig` 请求的 [https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateTrainingJob.html](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateTrainingJob.html) 参数值。为 `train` 或 `validation` 通道指定相应的图像数据（`.jpg` 或 `.png` 文件）。在 `.lst` 和 `train_lst` 通道各指定一个 `validation_lst` 文件。将所有四个通道的内容类型均设置为 `application/x-image`。

**注意**  
SageMaker AI 分别从不同的渠道读取训练和验证数据，因此您必须将训练和验证数据存储在不同的文件夹中。

`.lst` 文件是一个包含图像文件列表的三列制表符分隔文件。第一列指定图像索引，第二列指定图像的分类标签索引，第三列指定图像文件的相对路径。第一列中所有图像的图像索引必须唯一。分类标签索引集采用连续编号，并且编号应从 0 开始。例如，cat 分类为 0，dog 分类为 1，其他分类以此分类推。

 以下是 `.lst` 文件的示例：

```
5      1   your_image_directory/train_img_dog1.jpg
1000   0   your_image_directory/train_img_cat1.jpg
22     1   your_image_directory/train_img_dog2.jpg
```

例如，如果您的训练图像存储在 `s3://<your_bucket>/train/class_dog`、`s3://<your_bucket>/train/class_cat` 等位置，请将 `train` 通道的路径指定为 `s3://<your_bucket>/train`，这是数据的顶级目录。在 `.lst` 文件中，将 `train_image_dog1.jpg` 分类目录中名为 `class_dog` 的单个文件的相对路径指定为 `class_dog/train_image_dog1.jpg`。您也可以将所有图像文件存储在 `train` 目录内的一个子目录下。在这种情况下，请将该子目录用于相对路径。例如 `s3://<your_bucket>/train/your_image_directory`。

### 使用扩增清单图像格式进行训练
<a name="IC-augmented-manifest-training"></a>

扩增清单格式使您可以使用图像文件在管道模式下进行训练，而无需创建 RecordIO 文件。您需要将训练通道和验证通道指定为 [https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateTrainingJob.html](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateTrainingJob.html) 请求的 `InputDataConfig` 参数的值。使用该格式时，需要生成包含图像列表及其相应注释的 S3 清单文件。清单文件格式应为 [JSON 行](http://jsonlines.org/)格式，其中每行代表一个样本。使用指向图像 S3 位置的 `'source-ref'` 标签来指定图像。将在 `"AttributeNames"` 参数值下面提供注释，如 [https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateTrainingJob.html](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateTrainingJob.html) 请求中指定。它还可以在 `metadata` 标签下包含其他元数据，但这些会被算法忽略。在以下示例中，`"AttributeNames"`包含在图像和注释引用 `["source-ref", "class"]` 列表中。第一个图像的相应标签值为 `"0"`，第二个图像的标签值为 `“1”`：

```
{"source-ref":"s3://image/filename1.jpg", "class":"0"}
{"source-ref":"s3://image/filename2.jpg", "class":"1", "class-metadata": {"class-name": "cat", "type" : "groundtruth/image-classification"}}
```

训练 ImageClassification 算法时，输入文件`"AttributeNames"`中的顺序很重要。它按特定的顺序接受管道数据，先接受 `image`，然后接受 `label`。因此，此示例中的 AttributeNames “” 是`"source-ref"`先提供的，然后是`"class"`。将 ImageClassification 算法与增强清单一起使用时，`RecordWrapperType`参数的值必须为`"RecordIO"`。

也可以通过指定值的 JSON 数组来支持多标签训练。必须将 `num_classes` 超参数设置为与类的总数匹配。有两种有效的标签格式：multi-hot 和 class-id。

在 multi-hot 格式中，每个标签都是所有类的 multi-hot 编码向量，其中每个类的值为 0 或 1。在以下示例中，有三种类别。第一个图像标记为类 0 和 2，而第二个图像仅标记为类 2：

```
{"image-ref": "s3://amzn-s3-demo-bucket/sample01/image1.jpg", "class": "[1, 0, 1]"}
{"image-ref": "s3://amzn-s3-demo-bucket/sample02/image2.jpg", "class": "[0, 0, 1]"}
```

在 class-id 格式中，每个标签都是适用于数据点的类 ID 的列表，从 [0, `num_classes`) 开始。前面的例子看起来像是这样：

```
{"image-ref": "s3://amzn-s3-demo-bucket/sample01/image1.jpg", "class": "[0, 2]"}
{"image-ref": "s3://amzn-s3-demo-bucket/sample02/image2.jpg", "class": "[2]"}
```

multi-hot 格式是默认格式，但可以使用以下`label-format`参数在内容类型中显式设置：`"application/x-recordio; label-format=multi-hot".`class-id 格式，即输出的格式 GroundTruth，必须明确设置：`"application/x-recordio; label-format=class-id".`

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

### 增量训练
<a name="IC-incremental-training"></a>

您还可以使用之前使用 SageMaker AI 训练的模型中的工件为新模型的训练做种子。当您想要使用相同或相似的数据训练新模型时，增量训练可以节省训练时间。 SageMaker AI 图像分类模型只能使用另一个在 A SageMaker I 中训练的内置图像分类模型进行播种。

要使用预训练模型，请在 [https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateTrainingJob.html](https://docs.amazonaws.cn/sagemaker/latest/APIReference/API_CreateTrainingJob.html) 请求中，在 `InputDataConfig` 参数中将 `ChannelName` 指定为“model”。将模型通道的 `ContentType` 设置为 `application/x-sagemaker-model`。您上传到模型通道的新模型和预训练模型的输入超参数必须与 `num_layers`、`image_shape` 和 `num_classes` 输入参数具有相同的设置。这些参数定义了网络架构。对于预训练的模型文件，请使用 AI 输出的压缩模型工件（.tar.gz 格式）。 SageMaker 您可以对输入数据使用 RecordIO 或图像格式。

### 使用图像分类算法进行推理
<a name="IC-inference"></a>

生成的模型可以托管用于推理，并且支持编码的 `.jpg` 和 `.png` 图像格式作为 `image/png, image/jpeg` 和 `application/x-image` 内容类型。输入图像将自动调整大小。输出是以 JSON 格式编码的所有分类的概率值，或者对批量转换采用 [JSON 行文本格式](http://jsonlines.org/)。图像分类模型按请求处理单个图像，因此只输出采用 JSON 的一行或 JSON 行格式。以下是 JSON 行格式的响应示例：

```
accept: application/jsonlines

 {"prediction": [prob_0, prob_1, prob_2, prob_3, ...]}
```

有关训练和推理的更多详细信息，请参阅简介中引用的图像分类示例笔记本实例。

## 图像分类算法的 EC2 实例建议
<a name="IC-instances"></a>

对于图像分类，我们支持 P2、P3、G4dn 和 G5 实例。对于大批量训练，建议使用具有更多内存的 GPU 实例。您也可以在多 GPU 和多机器设置上运行该算法以进行分布式训练。CPU（例如 C4）实例和 GPU（P2、P3、G4dn 或 G5）实例都可用于推理。

## 图像分类示例笔记本
<a name="IC-sample-notebooks"></a>

有关使用 SageMaker AI 图像分类算法的示例笔记本，请参阅[通过 SageMaker 管道构建和注册 MXNet 图像分类模型](https://github.com/aws-samples/amazon-sagemaker-pipelines-mxnet-image-classification/blob/main/image-classification-sagemaker-pipelines.ipynb)。有关如何创建和访问可用于在 SageMaker AI 中运行示例的 Jupyter 笔记本实例的说明，请参阅。[Amazon SageMaker 笔记本实例](nbi.md)创建并打开笔记本实例后，选择 “**SageMaker AI 示例**” 选项卡以查看所有 SageMaker AI 示例的列表。示例图像分类笔记本位于 **Amazon 算法简介**部分。要打开笔记本，请单击**使用** 选项卡，然后选择**创建副本**。