本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
演示模板:使用以下方法对图像进行注释crowd-bounding-box
当您在 Amazon Gro SageMaker und Truth 控制台中选择使用自定义模板作为任务类型时,您将进入自定义标签任务面板。在该面板中,您可以从多个基本模板中进行选择。模板表示一些最常见的任务,并在您创建自定义标记任务的模板时提供样本。如果您没有使用控制台,或者用作其他手段,请参阅 Amazon Gro SageMaker und Truth 示例任务用户界
此演示适用于该BoundingBox模板。该演示还适用于在执行任务前后处理数据所需的 Amazon Lambda 函数。在上面的 Github 存储库中,要查找适用于Amazon Lambda函数的模板,请在模板{{ task.input.
中查找。<property
name>
}}
入门边界框自定义模板
这是提供的入门边界框模板。
此自定义模板使用 Liquid 模板语言taskInput
并且可以像在模板{{
task.input.<property name> }}
中一样访问该对象的属性。
你自己的 Bounding Box 自定义模板
举个例子,假设你有大量的动物照片,在这些照片中,你知道了之前的图像分类工作中的动物种类。现在你想在它周围画一个边界框。
在起始样本中,有三个变量:taskObject
header
、和labels
。
其中每个变量都表示在边界框的不同部分中。
taskObject
是要添加注解的照片的 HTTP (S) URL 或 S3 URI。添加| grant_read_access
了一个过滤器,该过滤器会将 S3 URI 转换为 HTTPS URL,对该资源具有短暂访问权限。如果你使用的是 HTTP (S) 网址,则不需要它。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函数的 ARN,可以调用该函数来处理您的清单条目并将其传递给模板引擎。
命名您的 Lambda 函数
命名函数的最佳做法是使用以下四个字符串之一作为函数名称的一部分:SageMaker
、Sagemaker
sagemaker
、或LabelingFunction
。这适用于您的预注释和注释后功能。
在使用控制台时,如果您的账户拥有的Amazon Lambda 函数,则将提供符合命名要求的函数下拉列表供您选择。
在这个非常基本的例子中,你只是传递清单中的信息,而没有对其进行任何额外的处理。此示例预注释函数是为 Python 3.7 编写的。
import json def lambda_handler(event, context): return { "taskInput": event['dataObject'] }
来自清单的 JSON 对象将作为 event
对象的子对象提供。taskInput
对象内的属性将作为变量提供给您的模板,因此只需将值设置taskInput
为即可event['dataObject']
将清单对象中的所有值传递到您的模板,而不必单独复制它们。如果您希望向模板发送更多值,可以将它们添加到taskInput
对象中。
你的注释后 Lambda 函数
作为任务设置的一部分,提供一个Amazon Lambda函数的 ARN,该函数可以在工作人员完成任务时调用该函数来处理表单数据。这可以很简单,也可以很复杂。如果你想在合并出现时进行答案和评分,你可以应用你选择的评分和/或合并算法。如果您想要存储原始数据以进行脱机处理,则这是一个选项。
为您的注释后 Lambda 提供权限
注释数据将位于一个文件中,该文件由 payload
对象中的 s3Uri
字符串指定。要在注释传入时对其进行处理,即使是简单的传递函数,您也需要分配S3ReadOnly
对 Lambda 的访问权限,这样它才能读取注释文件。
在用于创建 Lambda 的控制台中,滚动至 Execution role (执行角色) 面板。选择 Aper 从一个或多个模板创建新角色。为角色命名。从策略模板下拉列表中,选择 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
和标签数据的级别相同。您的输入清单中的任何属性,无论它们是否在您的模板中使用,都将传递到输出清单。