对象检测 – MXNet - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

对象检测 – MXNet

Amazon SageMaker 对象检测 – MXNet 算法使用单个深度神经网络检测和分类图像中的对象。它是一种指导式学习算法,将图像作为输入并识别图像场景中的所有对象实例。该对象被归类到指定集合中的一个分类,具有属于该分类的置信度分数。它在图像中的位置和比例由矩形边界框表示。它使用单张图片多方框检测器 (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 格式进行训练,则同时指定 train 和 validation 通道作为 CreateTrainingJob 请求的 InputDataConfig 参数值。在 train 通道中指定一个 RecordIO (.rec) 文件,在 validation 通道中指定一个 RecordIO 文件。将两个通道的内容类型设置为 application/x-recordio。一个示例,介绍如何生成可在对象检测示例笔记本中找到的 RecordIO 文件。您也可以使用 MXNet 的 GluonCV 中的工具,为流行的数据集(如 PASCAL Visual Object ClassesCommon Objects in Context (COCO))生成 RecordIO 文件。

使用图像格式进行训练

如果您使用图像格式进行训练,则指定 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://your_bucket/train 和 s3://your_bucket/train_annotation。

在 .json 文件中,名为 sample_image1.jpg 的图像的相对路径应为 sample_image / sample_image1.jpg。"image_size" 属性指定整个图像的尺寸。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 或图像格式。

有关增量训练及其使用方式说明的更多信息,请参阅在 Amazon SageMaker 中使用增量训练

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

对象检测算法支持 P2、P3、G4dn 和 G5 GPU 实例系列。对于大批量训练,建议使用具有更多内存的 GPU 实例。您也可以在多 GPU 和多机器设置上运行对象检测算法以进行分布式训练。

对于推理,您可以使用 CPU 实例(例如 C5 和 M5)和 GPU 实例(例如 P3 和 G4dn)。

对象检测示例笔记本

示例笔记本演示了如何使用 SageMaker 对象检测算法,

通过 Single Shot Multibox Detector 算法在 Caltech Birds (CUB 200 2011) 数据集上训练和托管模型。有关示例笔记本,请参阅用于识别鸟类的 Amazon SageMaker 对象检测。有关如何创建和访问可用于在 SageMaker 中运行示例的 Jupyter 笔记本实例的说明,请参阅 Amazon SageMaker 笔记本实例。创建笔记本实例并将其打开后,可选择 SageMaker 示例选项卡以查看所有 SageMaker 示例的列表。使用对象检测算法的对象检测示例笔记本位于 Amazon 算法简介 部分。要打开笔记本,请单击使用 选项卡,然后选择创建副本