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

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

演示模板:使用 的映像注释 crowd-bounding-box

当您选择在 Amazon SageMaker Ground Truth 控制台中使用自定义模板作为任务类型时,您将访问 Custom labeling task (自定义标记任务) 面板。在该面板中,您可以从多个基本模板中进行选择。模板表示一些最常见的任务,并在您创建自定义标记任务的模板时提供样本。如果您未使用 控制台或作为额外的资源,请参阅 Amazon SageMaker Ground Truth 示例任务 UIs了解各种标记作业任务类型的演示模板存储库。

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

入门边界框自定义模板

这是提供的初学者边界框模板。

<script src="https://assets.crowd.aws/crowd-html-elements.js"></script> <crowd-form> <crowd-bounding-box name="boundingBox" src="{{ task.input.taskObject | grant_read_access }}" header="{{ task.input.header }}" labels="{{ task.input.labels | to_json | escape }}" > <!-- The <full-instructions> tag is where you will define the full instructions of your task. --> <full-instructions header="Bounding Box Instructions" > <p>Use the bounding box tool to draw boxes around the requested target of interest:</p> <ol> <li>Draw a rectangle using your mouse over each instance of the target.</li> <li>Make sure the box does not cut into the target, leave a 2 - 3 pixel margin</li> <li> When targets are overlapping, draw a box around each object, include all contiguous parts of the target in the box. Do not include parts that are completely overlapped by another object. </li> <li> Do not include parts of the target that cannot be seen, even though you think you can interpolate the whole shape of the target. </li> <li>Avoid shadows, they're not considered as a part of the target.</li> <li>If the target goes off the screen, label up to the edge of the image.</li> </ol> </full-instructions> <!-- The <short-instructions> tag allows you to specify instructions that are displayed in the left hand side of the task interface. It is a best practice to provide good and bad examples in this section for quick reference. --> <short-instructions> Use the bounding box tool to draw boxes around the requested target of interest. </short-instructions> </crowd-bounding-box> </crowd-form>

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

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

例如,假设您有一个大型动物照片集合,您在其中从之前的图像分类作业中了解图像中的动物种类。现在,您希望围绕它绘制一个边界框。

在初学者示例中,有三个变量taskObject:、 headerlabels

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

  • taskObject 是要注释的照片的 HTTP(S) URL 或 S3 URI。添加的 | grant_read_access 是一个筛选条件,用于将 S3 URI 转换为对该资源具有短期访问权限的 HTTPS URL。如果您使用的是 HTTP(S) URL,则不需要使用该 URL。

  • header 是要标记的照片上方的文本,类似于“在照片的鸟周围绘制盒子”。

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

每个变量名称都来自注释前 Lambda 的响应中的 JSON 对象。上面的名称只是推荐的名称,它们使用对您有意义的任何变量名称,将提升团队间的代码可读性。

仅在必要时才使用变量

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

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

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

<script src="https://assets.crowd.aws/crowd-html-elements.js"></script> <crowd-form> <crowd-bounding-box name="boundingBox" labels="[ '{{ task.input.animal }}' ]" src="{{ task.input.source-ref | grant_read_access }}" header="Draw a box around the {{ task.input.animal }}." > <full-instructions header="Bounding Box Instructions" > <p>Draw a bounding box around the {{ task.input.animal }} in the image. If there is more than one {{ task.input.animal }} per image, draw a bounding box around the largest one.</p> <p>The box should be tight around the {{ task.input.animal }} with no more than a couple of pixels of buffer around the edges.</p> <p>If the image does not contain a {{ task.input.animal }}, check the <strong> Nothing to label</strong> box. </full-instructions> <short-instructions> <p>Draw a bounding box around the {{ task.input.animal }} in each image. If there is more than one {{ task.input.animal }} per image, draw a bounding box around the largest one.</p> </short-instructions> </crowd-bounding-box> </crowd-form>

请注意在整个模板{{ task.input.animal }}中重复使用 。如果您的清单的所有动物名称以大写字母开头,您可以使用 {{ task.input.animal | downcase }},并将 Liquid 的内置筛选器之一包含在需要以小写形式显示的句子中。

您的清单文件

您的清单文件应提供您在模板中使用的变量值。您可以对注释前 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 函数

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

命名 Lambda 函数

命名 函数的最佳实践是使用以下四个字符串之一作为函数名称的一部分SageMaker:、SagemakersagemakerLabelingFunction。这适用于注释前和注释后函数。

当您使用 控制台时,如果您有您的账户拥有的 AWS Lambda 函数,则会提供满足命名要求的函数的下拉列表以选择函数。

在此非常基本的示例中,您只传递清单中的信息,而不对清单进行任何额外的处理。此示例注释前 函数是针对 Python 3.7 编写的。

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

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

您的注释后 Lambda 函数

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

向您的注释后 Lambda 提供权限

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

在用于创建 Lambda 的控制台中,滚动至 Execution role (执行角色) 面板。选择 Create a new role from one or more templates (从一个或多个模板创建新角色)。为角色指定名称。从 Policy templates (策略模板) 下拉列表中,选择 Amazon Amazon S3 object read-only permissions (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 和 标记数据相同的关卡上的输出清单。输入清单中的任何属性,无论它们是否在模板中使用,都将传递到输出清单。

这应该有助于您创建自己的自定义模板。