演示模板:使用注释图片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 示例任务 UI有关各种标记作业任务类型的演示模板存储库。

该演示适用于 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 }},在需要显示为小写字母的句子中加入 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 函数

作为职位设置的一部分,提供一个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 函数

作为职位设置的一部分,提供一个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以及标记数据。输入清单中的任何属性,无论它们是否在模板中使用,都将传递给输出清单。