演示模板:对图像进行注释crowd-bounding-box - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

演示模板:对图像进行注释crowd-bounding-box

当您在 Amazon SageMaker Ground Truth 控制台中选择使用自定义模板作为您的任务类型时,您将访问自定义标签任务面板. 在该面板中,您可以从多个基本模板中进行选择。模板表示一些最常见的任务,并在您创建自定义标记任务的模板时提供样本。如果您没有使用控制台或作为其他手段使用,请参阅Amazon SageMaker Ground Truth 示例任务用户界面,以获取各种标记作业任务类型的演示模板存储库。

该演示适用于 BoundingBox 模板。该演示还适用于在执行任务前后处理数据所需的 Amazon Lambda 函数。在上面的 Github 存储库中,要查找Amazon Lambda函数,请查找{{ task.input.<property name> }}在模板中。

入门边界框自定义模板

这是所提供的入门边界框模板。

此自定义模板使用 Liquid 模板语言,双大括号之间的每个项都是一个变量。预注释Amazon Lambda函数应该提供一个名为taskInput并且该对象的属性可以作为{{ task.input.<property name> }}添加到您的模板中。

您自己的边界框自定义模板

例如,假设您拥有大量动物照片集合,其中您可以通过之前的图像分类作业了解图像中的动物类型。现在你想要在它周围绘制一个边界框。

在起动器示例中,有三个变量:taskObjectheader, 和labels.

其中每个变量都表示在边界框的不同部分中。

  • taskObject是要注释的照片的 HTTP (S) URL 或 S3 URI。已将添加到| grant_read_access是一个过滤器,它将 S3 URI 转换为 HTTPS URL,并对该资源进行短暂访问。如果您使用的是 HTTP (S) URL,则不需要它。

  • header是要标记的照片上方的文字,类似于 “在照片中的鸟周围画一个框”。

  • labels是一个数组,表示为['item1', 'item2', ...]. 这些标签可由工作人员分配给他们绘制的不同框。您可以有一个或多个标签。

每个变量名称都来自针对预注释 Lambda 的响应中的 JSON 对象,上面的名称仅仅是建议使用的名称,使用任何对您有意义的变量名称,并将提升团队间的代码可读性。

仅在必要时才使用变量

如果某个字段将不会更改,您可以从模板中删除该变量并将其替换为该文本,否则您必须在清单中的每个对象中重复将该文本作为值或将其编码为预注释 Lambda 函数中。

例 :最终自定义边界框模板

为简单起见,此模板将具有一个变量、一个标签和非常基本的说明。假设您的清单在每个数据对象中都有一个 “動物” 属性,那么该值可以在模板的两个部分重复使用。

请注意,重复使用{{ task.input.animal }}整个模板。如果您的清单包含以大写字母开头的所有动物名称,则可以使用{{ task.input.animal | downcase }},在需要以小写形式呈现的句子中纳入了液体的内置过滤器之一。

您的清单文件

您的清单文件应提供您在模板中使用的变量值。您可以在预注释 Lambda 中对清单数据执行某种转换,但如果您不需要,则应保持较低的错误风险,您的 Lambda 将运行得更快。下面是模板的一个示例清单文件。

{"source-ref": "<S3 image URI>", "animal": "horse"} {"source-ref": "<S3 image URI>", "animal" : "bird"} {"source-ref": "<S3 image URI>", "animal" : "dog"} {"source-ref": "<S3 image URI>", "animal" : "cat"}

您的预注释 Lambda 函数

作为作业设置的一部 ARN,提供Amazon Lambda函数,可以调用它来处理您的清单条目并将它们传递给模板引擎。

命名 Lambda 函数

命名函数的最佳做法是使用以下四个字符串之一作为函数名的一部分:SageMakerSagemakersagemaker,或者LabelingFunction. 这适用于注释前和注释后函数。

使用控制台时,如果您有Amazon您的账户拥有的 Lambda 函数,将提供满足命名要求的函数的下拉列表供您选择一个函数。

在这个非常基本的例子中,您只是传递清单中的信息,而无需对其执行任何额外的处理。此示例预注释函数是为 Python 3.7 编写的。

import json def lambda_handler(event, context): return { "taskInput": event['dataObject'] }

来自清单的 JSON 对象将作为 event 对象的子对象提供。内部的属性taskInput对象将可用作模板的变量,因此只需将taskInputevent['dataObject']会将清单对象中的所有值传递给模板,而无需单独复制它们。如果您希望向模板发送更多值,可以将它们添加到taskInput对象。

注释后 Lambda 函数

作为作业设置的一部 ARN,提供Amazon Lambda函数,当工作人员完成一个任务时,可以调用它来处理窗体数据。这可以很简单,也可以很复杂。如果您想在进来时进行应答整合和评分,您可以用您选择的评分和/或整合算法。如果您想要存储原始数据以进行脱机处理,则这是一个选项。

为您的注释后 Lambda 提供权限

注释数据将位于一个文件中,该文件由 payload 对象中的 s3Uri 字符串指定。要在出现注释时处理这些注释,即使对于简单的传递函数,您也需要分配S3ReadOnly访问你的 Lambda,以便它可以读取注释文件。

在用于创建 Lambda 的控制台中,滚动至 Execution role (执行角色) 面板。Select从一个或多个模板创建新角色. 为角色提供一个名称。从Policy templates下拉菜单中,选择Amazon S3 对象只读权限. 保存 Lambda,该角色将被保存并选中。

下面是 Python 2.7 中的示例。

import json import boto3 from urlparse import urlparse def lambda_handler(event, context): consolidated_labels = [] parsed_url = urlparse(event['payload']['s3Uri']); s3 = boto3.client('s3') textFile = s3.get_object(Bucket = parsed_url.netloc, Key = parsed_url.path[1:]) filecont = textFile['Body'].read() annotations = json.loads(filecont); for dataset in annotations: for annotation in dataset['annotations']: new_annotation = json.loads(annotation['annotationData']['content']) label = { 'datasetObjectId': dataset['datasetObjectId'], 'consolidatedAnnotation' : { 'content': { event['labelAttributeName']: { 'workerId': annotation['workerId'], 'boxesInfo': new_annotation, 'imageSource': dataset['dataObject'] } } } } consolidated_labels.append(label) return consolidated_labels

后注释 Lambda 通常将在事件对象中收到成批的任务结果。这种批处理将是 Lambda 应迭代的 payload 对象。您发回的内容将是满足API 合同.

标记作业的输出

您将在您指定的目标 S3 存储桶中以您的标记作业命名的文件夹中找到作业的输出。它将位于名为 manifests 的子文件夹中。

对于边界框任务,您在输出清单找到的输出将有点类似于下面的演示。该示例已清理以供打印。实际输出将是每条记录一行。

例 :输出清单中的 JSON

{ "source-ref":"<URL>", "<label attribute name>": { "workerId":"<URL>", "imageSource":"<image URL>", "boxesInfo":"{\"boundingBox\":{\"boundingBoxes\":[{\"height\":878, \"label\":\"bird\", \"left\":208, \"top\":6, \"width\":809}], \"inputImageProperties\":{\"height\":924, \"width\":1280}}}"}, "<label attribute name>-metadata": { "type":"groundTruth/custom", "job_name":"<Labeling job name>", "human-annotated":"yes" }, "animal" : "bird" }

请注意附加animal属性被传递到与source-ref和标签数据. 输入清单中的任何属性,无论它们是否在模板中使用,都将传递给输出清单。