步骤 3:使用 AWS Lambda 进行处理 - Amazon SageMaker
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

步骤 3:使用 AWS Lambda 进行处理

在此步骤中,您将设置在将每个数据集对象发送到工作人员之前在每个数据集对象上触发哪些 AWS Lambda 函数以及提交任务后将使用该函数处理结果。这些函数是必需的。

首先,您需要访问 AWS Lambda 控制台或使用 AWS Lambda 的 APIs 来创建您的 函数。AmazonSageMakerFullAccess 策略限制为使用以下四个字符串作为函数名称的一部分来调用 AWS Lambda 函数:SageMakerSagemakersagemakerLabelingFunction。这适用于注释前和注释后 Lambda。如果您选择使用不含这些字符串的名称,则必须显式向用于创建标记作业的 IAM 角色提供 lambda:InvokeFunction 权限。

Lambda 函数部分选择 Lambda,此部分显示在 Ground Truth 控制台中自定义 HTML 代码编辑器的后面。

如果您需要一个示例,“演示模板:使用 的映像注释 crowd-bounding-box”文档中提供了一个端到端演示,包括用于 Lambda 的 Python 代码。

注释前 Lambda

在将标记任务发送到工作人员之前,将向您的 AWS Lambda 函数发送一个 JSON 格式的请求以提供详细信息。

例 预注释请求

{ "version": "2018-10-16", "labelingJobArn": <labelingJobArn> "dataObject" : { "source-ref": "s3://mybucket/myimage.png" } }

dataObject包含来自清单数据对象的 JSON 格式的属性。对于最基本的图像注释作业,它可能只是一个指定要注释的图像source-ref的属性。清单中的 JSON 行对象的大小最多为 100 KB,并且包含各种数据。

作为回报,Ground Truth 需要如下所示格式的响应:

例 预期的返回数据

{ "taskInput": <json object>, "isHumanAnnotationRequired": <boolean> # Optional }

在上一个示例中, <json object> 需要包含您的自定义表单将需要的所有数据。如果您正在执行一个边界框任务(其中指令始终保持相同),则它可能只是您的图像文件的 HTTP (S) 或 S3 资源。如果它是一个情感分析任务且不同的对象可能具有不同的选择,则它将是对象引用(作为字符串)和选项(作为字符串数组)。

的含义 isHumanAnnotationRequired

此值是可选的,因为它将默认为 true。显式设置该值的主要使用案例是当您想要将此数据对象从人工标记范围中排除时。

如果您的清单中混合了 对象,其中一些对象需要人工注释,另一些则不需要,您可以在每个数据对象中包含一个isHumanAnnotationRequired值。然后,您可以在注释前 Lambda 中使用代码从数据对象读取值,并在 Lambda 输出中设置值。

注释前 Lambda 首先运行

在任何任务可用于工作人员之前,会使用 Lambda 将整个清单处理成中间形式。这意味着您在标记作业过程中始终无法更改 Lambda 部分,并会看到这会影响到剩余的任务。

注释后 Lambda

当所有工作人员都注释了数据对象或达到 TaskAvailabilityLifetimeInSeconds (以先到者为准)时,Ground Truth 将这些注释发送到您的注释后 Lambda。此 Lambda 通常用于合并注释 。该请求对象将如下所示:

例 标记后任务请求

{ "version": "2018-10-16", "labelingJobArn": <labelingJobArn>, "labelCategories": [<string>], "labelAttributeName": <string>, "roleArn" : "string", "payload": { "s3Uri": <string> } }
注意

如果没有工作线程在数据对象上工作,并且TaskAvailabilityLifetimeInSeconds已到达 ,则数据对象将标记为失败,并且不会作为后注释 lambda 调用的一部分包含在内。

标记后任务 Lambda 权限

实际注释数据将位于一个文件中,该文件由 s3Uri 对象中的 payload 字符串指定。要在出现注释时进行处理,即使对于简单的直通函数,您也需要为 Lambda 分配必要的权限以从 S3 存储桶读取文件。

在用于创建 Lambda 的控制台中,滚动至 Execution role (执行角色) 面板。选择 Create a new role from one or more templates (从一个或多个模板创建新角色)。为角色指定名称。从 Policy templates (策略模板) 下拉列表中,选择 Amazon Amazon S3 object read-only permissions (Amazon S3 对象只读权限)。保存 Lambda,系统将保存并选中角色。

例 注释数据文件的

[ { "datasetObjectId": <string>, "dataObject": { "s3Uri": <string>, "content": <string> }, "annotations": [{ "workerId": <string>, "annotationData": { "content": <string>, "s3Uri": <string> } }] } ]

实质上,表单中的所有字段都将位于 content 对象中。此时,您可以使用 AWS 数据库服务来存储结果,从而开始对数据运行数据整合算法。或者,您可以将某些已处理/优化的结果传回到 Ground Truth,以便存储在您在为标记作业进行配置期间为输出指定的 S3 存储桶的整合注释清单中。

作为回报,Ground Truth 需要如下所示格式的响应:

例 预期的返回数据

[ { "datasetObjectId": <string>, "consolidatedAnnotation": { "content": { "<labelattributename>": { # ... label content } } } }, { "datasetObjectId": <string>, "consolidatedAnnotation": { "content": { "<labelattributename>": { # ... label content } } } } . . . ]

此时,您发送到 S3 存储桶的所有数据( 除外datasetObjectId)都将位于 content 对象中。

这将在作业的整合清单中生成一个条目,如下所示:

例 输出清单中的标签格式

{ "source-ref"/"source" : "<s3uri or content>", "<labelAttributeName>": { # ... label content from you }, "<labelAttributeName>-metadata": { # This will be added by Ground Truth "job_name": <labelingJobName>, "type": "groundTruth/custom", "human-annotated": "yes", "creation_date": <date> # Timestamp of when received from Post-labeling Lambda } }

由于自定义模板及其收集的数据的潜在复杂的性质,Ground Truth 不提供对数据的进一步处理或有关数据的见解。

Next

通过 API 实现的自定义工作流