图像分类算法 - Amazon SageMaker
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

图像分类算法

Amazon SageMaker 图像分类算法是一种指导式学习算法,它支持多标签分类。该算法将一个图像作为输入,并输出分配给该图像的一个或多个标签。它使用可从头训练或在大量训练图像不可用时使用迁移学习训练的卷积神经网络 (ResNet)。

对于 Amazon SageMaker 图像分类算法,建议的输入格式为 Apache MXNet RecordIO。 但是,您也可以使用 .jpg 或 .png 格式的原始图像。有关机器学习系统的高效数据准备和加载的广泛概述,请参阅本讨论

注意

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

有关卷积网络的更多信息,请参阅:

图像分类算法的输入/输出接口

在文件模式下,SageMaker 图像分类算法支持使用 RecordIO (application/x-recordio) 和图像(image/pngimage/jpegapplication/x-image)内容类型进行训练;在管道模式下,该算法支持使用 RecordIO (application/x-recordio) 内容类型进行训练。但是,您也可以使用图像文件(image/pngimage/jpegapplication/x-image)在管道模式下进行训练,无需使用增强清单格式创建 RecordIO 文件。

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

该算法支持使用 image/pngimage/jpegapplication/x-image 进行推理。

使用 RecordIO 格式进行训练

如果您使用 RecordIO 格式进行训练,请将 trainvalidation 通道指定为 InputDataConfig CreateTrainingJob 请求的 参数的值。在 RecordIO 通道中指定一个 .rectrain) 文件,在 RecordIO 通道中指定一个 validation 文件。将两个通道的内容类型设置为 application/x-recordio

使用图像格式进行训练

如果您使用图像格式进行训练,请指定 trainvalidationtrain_lstvalidation_lst 通道作为 InputDataConfig CreateTrainingJob 请求的 参数的值。为 trainvalidation 通道指定相应的图像数据(.jpg.png 文件)。在 .lsttrain_lst 通道各指定一个 validation_lst 文件。将所有四个通道的内容类型均设置为 application/x-image

注意

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

.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_dogs3://<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

使用扩增清单图像格式进行训练

利用增强清单格式,您可以在管道模式下使用图像文件进行训练,而无需创建 RecordIO 文件。您需要将训练通道和验证通道指定为 InputDataConfig CreateTrainingJob 请求的 参数的值。使用该格式时,需要生成包含图像列表及其相应注释的 S3 清单文件。清单文件格式应为 JSON 行格式,其中每行代表一个样本。使用指向图像 S3 位置的 'source-ref' 标签来指定图像。将在 "AttributeNames" 参数值下面提供注释,如 CreateTrainingJob 请求中指定。它还可以在 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"}}

在训练 "AttributeNames" 算法时,ImageClassification 在输入文件中的顺序很重要。它按特定顺序接受管道数据,先接受 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://mybucket/sample01/image1.jpg", "class": "[1, 0, 1]"} {"image-ref": "s3://mybucket/sample02/image2.jpg", "class": "[0, 0, 1]"}

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

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

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

有关增强清单文件的更多信息,请参阅通过增强清单文件,将数据集元数据提供给训练作业

增量训练

您还可以使用以前用 SageMaker 训练的模型中的构件作为种子来训练新模型。当您想要训练具有相同或相似数据的新模型时,增量训练可以节省训练时间。SageMaker 图像分类模型只能使用在 SageMaker 中训练的另一个内置图像分类模型作为种子。

要使用预训练模型,请在 CreateTrainingJob 请求中,在 InputDataConfig 参数中将 ChannelName 指定为“model”。将模型通道的 ContentType 设置为 application/x-sagemaker-model。 您上传到模型通道的新模型和预训练模型的输入超参数必须与 num_layersimage_shapenum_classes 输入参数具有相同的设置。这些参数定义了网络架构。对于预训练模型文件,使用 SageMaker 输出的压缩模型构件(采用 .tar.gz 格式)。您可以为输入数据使用 RecordIO 或图像格式。

有关如何使用 SageMaker 图像分类算法进行增量训练的示例笔记本,请参阅端到端增量训练图像分类示例。有关增量训练及其使用方式说明的更多信息,请参阅Amazon SageMaker 中的增量训练

使用图像分类算法进行推理

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

accept: application/jsonlines {"prediction": [prob_0, prob_1, prob_2, prob_3, ...]}

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

图像分类算法的 EC2 实例建议

对于图像分类,我们支持以下 GPU 实例进行训练:ml.p2.xlargeml.p2.8xlargeml.p2.16xlargeml.p3.2xlargeml.p3.8xlargeml.p3.16xlarge。 我们建议对于大批量训练使用具有更多内存的 GPU 实例。但是,CPU (如 C4) 和 GPU (如 P2 和 P3) 实例均可用于推理。您也可以在多 GPU 和多机器设置上运行该算法以进行分布式训练。

P2 和 P3 实例均受图像分类算法支持。

图像分类示例笔记本

示例笔记本使用 SageMaker 图像分类算法在 caltech-256 数据集上训练模型,然后部署模型以执行推理。有关该示例笔记本,请参阅端到端多类别图像分类示例。有关如何创建和访问可用于在 SageMaker 中运行示例的 Jupyter 笔记本实例的说明,请参阅使用 Amazon SageMaker 笔记本实例。创建笔记本实例并打开该实例后,选择 SageMaker Examples (AWS 示例) 选项卡以查看所有 SageMaker 示例的列表。示例图像分类笔记本位于 Amazon 算法简介部分。要打开笔记本,请单击其 Use (使用) 选项卡,然后选择 Create copy (创建副本)