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

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

对象检测算法

对象检测算法使用单个深度神经网络检测和分类图像中的对象。Amazon SageMaker它是一种指导式学习算法,将图像作为输入并识别图像场景中的所有对象实例。该对象被归类到指定集合中的一个分类,具有属于该分类的置信度分数。它在图像中的位置和比例由矩形边界框表示。它使用 Single Shot multibox Detector (SSD) 框架并支持两个基本网络: VGGResNet。 可以从头开始训练网络,也可以使用已在 ImageNet 数据集上预先训练的模型进行训练。

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

在文件模式下,SageMaker 对象检测算法支持使用 RecordIO (application/x-recordio) 和图像(image/pngimage/jpegapplication/x-image)内容类型进行训练;在管道模式下,该算法支持使用 RecordIO (application/x-recordio) 进行训练。不过,您还可以使用图像文件(image/pngimage/jpegapplication/x-image)在管道模式下进行训练,无需使用增强清单格式创建 RecordIO 文件。对于 Amazon SageMaker 对象检测算法,建议的输入格式为 Apache MXNet RecordIO。 但是,您也可以使用 .jpg 或 .png 格式的原始图像。该算法仅支持 application/x-image 用于推理。

注意

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

有关数据格式的更多详细信息,请参阅对象检测示例笔记本

使用 RecordIO 格式进行训练

如果您使用 RecordIO 格式进行训练,请将训练通道和验证通道指定为 InputDataConfig CreateTrainingJob 请求的 参数值。在训练通道中指定一个 RecordIO (.rec) 文件,在验证通道中指定一个 RecordIO 文件。将两个通道的内容类型设置为 application/x-recordio。 在对象检测示例笔记本中可找到如何生成 RecordIO 文件的示例。您还可以使用 MXNet 的 GluonCV 中的工具为常见数据集(如 RecordIOPASCAL 视觉对象类上下文中的常见对象 (COCO))生成 文件。

使用图像格式进行训练

如果您使用图像格式进行训练,则指定 trainvalidationtrain_annotationvalidation_annotation 通道作为 CreateTrainingJob 请求的 InputDataConfig 参数值。为 train 或 validation 通道指定相应的图像数据(.jpg 或 .png)文件。对于注释数据,您可以使用 JSON 格式。在 train_annotationvalidation_annotation 通道中指定相应的 .json 文件。根据图像类型,将所有四个通道的内容类型设置为 image/pngimage/jpeg。当数据集同时包含 .jpg 和 .png 图像时,您还可以使用内容类型 application/x-image。以下是 .json 文件的示例。

{ "file": "your_image_directory/sample_image1.jpg", "image_size": [ { "width": 500, "height": 400, "depth": 3 } ], "annotations": [ { "class_id": 0, "left": 111, "top": 134, "width": 61, "height": 128 }, { "class_id": 0, "left": 161, "top": 250, "width": 79, "height": 143 }, { "class_id": 1, "left": 101, "top": 185, "width": 42, "height": 130 } ], "categories": [ { "class_id": 0, "name": "dog" }, { "class_id": 1, "name": "cat" } ] }

每个图像都需要一个 .json 文件进行注释,而 .json 文件应该与相应的图像具有相同的名称。上面的 .json 文件的名称应该是“sample_image1.json”。注释 .json 文件中有四个属性。属性“file”指定图像文件的相对路径。例如,如果您的训练图像和相应的 .json 文件存储在 s3:// 中your_bucket/train/sample_image 和 s3://your_bucket/train_annotation,以 s3:// 的形式指定训练和 train_annotation 通道的路径your_bucket/train 和 s3://your_bucket/train_annotation。

在 .json 文件中,名为 sample_image1.jpg 的图像的相对路径应为 sample_image / sample_image1.jpg。"image_size" 属性指定整个图像的尺寸。对象检测算法目前仅支持 3 通道图像。SageMaker"annotations" 属性指定图像中对象的分类和边界框。每个对象都由一个 "class_id" 索引和四个边界框坐标("left""top""width""height")注释。"left"(x 坐标)和 "top"(y 坐标)值表示边界框的左上角。"width"(x 坐标)和 "height"(y 坐标)值表示边界框的维度。原点 (0, 0) 是整个图像的左上角。如果您在一个图像内有多个对象,则所有注释都应包含在单个 .json 文件中。"categories" 属性存储类索引与类名称之间的映射。类索引应采用连续编号,并且编号应从 0 开始。"categories" 属性对于注释 .json 文件是可选的

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

利用增强清单格式,您可以在管道模式下使用图像文件进行训练,而无需创建 RecordIO 文件。您需要将训练通道和验证通道指定为 CreateTrainingJob 请求的 InputDataConfig 参数的值。使用该格式时,需要生成包含图像列表及其相应注释的 S3 清单文件。清单文件格式应为 JSON 行格式,其中每行代表一个样本。使用指向图像 S3 位置的 'source-ref' 标签来指定图像。将在 "AttributeNames" 参数值下面提供注释,如 CreateTrainingJob 请求中指定。它还可以在 metadata 标签下包含其他元数据,但这些会被算法忽略。在以下示例中,"AttributeNames 包含在列表 ["source-ref", "bounding-box"] 中:

{"source-ref": "s3://your_bucket/image1.jpg", "bounding-box":{"image_size":[{ "width": 500, "height": 400, "depth":3}], "annotations":[{"class_id": 0, "left": 111, "top": 134, "width": 61, "height": 128}, {"class_id": 5, "left": 161, "top": 250, "width": 80, "height": 50}]}, "bounding-box-metadata":{"class-map":{"0": "dog", "5": "horse"}, "type": "groundtruth/object-detection"}} {"source-ref": "s3://your_bucket/image2.jpg", "bounding-box":{"image_size":[{ "width": 400, "height": 300, "depth":3}], "annotations":[{"class_id": 1, "left": 100, "top": 120, "width": 43, "height": 78}]}, "bounding-box-metadata":{"class-map":{"1": "cat"}, "type": "groundtruth/object-detection"}}

在训练对象检测算法时,"AttributeNames" 在输入文件中的顺序很重要。它按特定顺序接受管道数据,先接受 image,然后接受 annotations。 因此,本示例中的“AttributeNames”先随 "source-ref" 一起提供,后跟 "bounding-box"。 将对象检测与增强清单结合使用时,RecordWrapperType 参数值必须设置为 "RecordIO"

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

增量训练

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

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

有关演示如何使用 SageMaker 对象检测算法进行增量训练的示例笔记本,请参阅 SageMaker 对象检测增量训练示例笔记本。有关增量训练及其使用方式说明的更多信息,请参阅Amazon SageMaker 中的增量训练

对象检测算法的 EC2 实例建议

对于对象检测,我们支持以下 GPU 实例用于训练: ml.p2.xlargeml.p2.8xlargeml.p2.16xlargeml.p3.2xlargeml.p3.8xlargeml.p3.16xlarge。 对于大批量训练,我们建议使用具有更多内存的 GPU 实例。您也可以在多 GPU 和多机器设置上运行该算法以进行分布式训练。不过,CPU(例如 C5 和 M5)和 GPU(例如 P2 和 P3)实例均可用于推理。将在 Amazon SageMaker ML 实例类型上逐项列出支持推理的所有实例类型。

对象检测示例笔记本

示例笔记本演示了如何使用 SageMaker 对象检测算法对 COCO 数据集使用单张图片多方框检测器算法训练和托管模型,有关该示例笔记本,请参阅使用图像和 JSON 格式进行对象检测。有关如何创建和访问可用于在 SageMaker 中运行示例的 Jupyter 笔记本实例的说明,请参阅使用 Amazon SageMaker 笔记本实例。创建笔记本实例并打开该实例后,选择 SageMaker Examples (AWS 示例) 选项卡以查看所有 SageMaker 示例的列表。使用对象检测算法的对象检测示例笔记本位于 Amazon 算法简介 部分。要打开笔记本,请单击其 Use (使用) 选项卡,然后选择 Create copy (创建副本)