Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Requisitos de la función de Lambda preanotación y postanotación
Utilice esta sección para obtener información sobre la sintaxis de las solicitudes enviadas a las funciones de Lambda preanotación y postanotación, y la sintaxis de respuesta que Ground Truth necesita para ejecutar un flujo de trabajo de etiquetado personalizado.
Lambda de preanotación
Antes de enviar una tarea de etiquetado al trabajador, se invoca la función de Lambda preanotación.
Ground Truth envía a la función Lambda una solicitud JSON con formato -para proporcionar detalles sobre el trabajo de etiquetado y el objeto de datos. La siguiente tabla contiene los esquemas de la solicitud preanotación. A continuación, se describe cada parámetro.
-
version
(cadena): es un número de versión que utiliza internamente Ground Truth. -
labelingJobArn
(string): este es el nombre del recurso de Amazon, oARN, de su trabajo de etiquetado. Esto se ARN puede usar para hacer referencia al trabajo de etiquetado cuando se utilizan API operaciones de Ground Truth comoDescribeLabelingJob
. -
El
dataObject
(JSONobjeto): la clave contiene una sola JSON línea, ya sea del archivo de manifiesto introducido o enviada desde AmazonSNS. Los objetos de JSON línea de tu manifiesto pueden tener un tamaño máximo de 100 kilobytes y contener una variedad de datos. Para un trabajo de anotación de imágenes muy básico, esdataObject
JSON posible que solo contengan unasource-ref
clave que identifique la imagen que se va a anotar. Si el objeto de datos (por ejemplo, una línea de texto) se incluye directamente en el archivo de manifiesto de entrada, el objeto de datos se identifica consource
. Si crea un trabajo de verificación o ajuste, esta línea puede contener datos de etiqueta y metadatos del trabajo de etiquetado anterior.
La siguiente tabla incluye ejemplos de bloques de código de una solicitud preanotación. Cada parámetro de estas solicitudes de ejemplo se explica debajo de la tabla con pestañas.
A cambio, Ground Truth requiere una respuesta con el siguiente formato:
ejemplo de datos devueltos previstos
{ "taskInput":
<json object>
, "isHumanAnnotationRequired":<boolean>
# Optional }
En el ejemplo anterior, <json object>
debe contener todos los datos que necesita su plantilla de tarea de trabajador personalizado. Si está realizando una tarea de cuadro delimitador en la que las instrucciones son las mismas todo el tiempo, puede que solo sea el recurso HTTP (S) o Amazon S3 para su archivo de imagen. Si se trata de una tarea de análisis de opinión y diferentes objetos pueden tener diferentes opciones, es la referencia de objeto como una cadena y las opciones como una matriz de cadenas.
Implicaciones de isHumanAnnotationRequired
Este valor es opcional, ya que su valor predeterminado será true
. El principal caso de uso para establecerlo de forma explícita es cuando se desea excluir este objeto de datos de su etiquetado por parte de trabajadores humanos.
Si tiene una combinación de objetos en el manifiesto, con algunos objetos que requieren anotaciones humanas y otros que no los necesitan, puede incluir un valor isHumanAnnotationRequired
en cada objeto de datos. Puede añadir lógica a su Lambda preanotación para determinar dinámicamente si un objeto requiere una anotación y establecer este valor booleano en consecuencia.
Ejemplos de funciones de Lambda preanotación
La siguiente función Lambda básica previa a la anotación accede al JSON objeto dataObject
desde la solicitud inicial y lo devuelve en el parámetro. taskInput
import json def lambda_handler(event, context): return { "taskInput": event['dataObject'] }
Suponiendo que el archivo de manifiesto de entrada utiliza "source-ref"
para identificar objetos de datos, la plantilla de tareas de trabajador que se utiliza en el mismo trabajo de etiquetado que esta función de Lambda preanotación debe incluir un elemento Liquid como el siguiente para su ingerir dataObject
.
{{ task.input.source-ref | grant_read_access }}
Si el archivo de manifiesto de entrada utilizó source
para identificar el objeto de datos, la plantilla de tareas de trabajador puede ingerir dataObject
con lo siguiente:
{{ task.input.source }}
El siguiente ejemplo de Lambda preanotación incluye lógica para identificar la clave utilizada en dataObject
y apuntar a ese objeto de datos mediante taskObject
en la instrucción de devolución de Lambda.
import json def lambda_handler(event, context): # Event received print("Received event: " + json.dumps(event, indent=2)) # Get source if specified source = event['dataObject']['source'] if "source" in event['dataObject'] else None # Get source-ref if specified source_ref = event['dataObject']['source-ref'] if "source-ref" in event['dataObject'] else None # if source field present, take that otherwise take source-ref task_object = source if source is not None else source_ref # Build response object output = { "taskInput": { "taskObject": task_object }, "humanAnnotationRequired": "true" } print(output) # If neither source nor source-ref specified, mark the annotation failed if task_object is None: print(" Failed to pre-process {} !".format(event["labelingJobArn"])) output["humanAnnotationRequired"] = "false" return output
La función Lambda de postanotación
Cuando todos los trabajadores hayan anotado el objeto de datos o cuando se haya alcanzado TaskAvailabilityLifetimeInSeconds
, lo que ocurra primero, Ground Truth envía esas anotaciones a su Lambda postanotación. Esta función Lambda se suele utilizar para Consolidación de anotaciones.
sugerencia
Para ver un ejemplo de una función Lambda posterior a la consolidación, consulte
La siguiente tabla contiene los esquemas de la solicitud postanotación. En la siguiente lista con viñetas se describe cada uno de los parámetros.
{ "version": "2018-10-16", "labelingJobArn":
<string>
, "labelCategories": [<string>
], "labelAttributeName":<string>
, "roleArn" :<string>
, "payload": { "s3Uri":<string>
} }
-
version
(cadena): un número de versión que utiliza internamente Ground Truth. -
labelingJobArn
(string): el nombre del recurso de Amazon, oARN, de su trabajo de etiquetado. Esto se ARN puede usar para hacer referencia al trabajo de etiquetado cuando se utilizan API operaciones de Ground Truth comoDescribeLabelingJob
. -
labelCategories
(lista de cadenas): incluye las categorías de etiquetas y otros atributos que especificó en la consola o que incluyó en el archivo de configuración de categorías de etiquetas. -
labelAttributeName
(cadena): el nombre del trabajo de etiquetado o el nombre del atributo de etiqueta que especificó al crear el trabajo de etiquetado. -
roleArn
(string): el nombre del recurso de Amazon (ARN) del rol de IAM ejecución que especificas al crear el trabajo de etiquetado. -
payload
(JSONobjeto): A JSON que incluye unas3Uri
clave que identifica la ubicación de los datos de anotación de ese objeto de datos en Amazon S3. El segundo bloque de código que aparece a continuación muestra un ejemplo de este archivo de anotaciones.
En el siguiente bloque de código se incluye un ejemplo de una solicitud postanotación. Cada parámetro de esta solicitud de ejemplo se explica debajo del bloque de código.
ejemplo de una solicitud Lambda postanotación
{ "version": "2018-10-16", "labelingJobArn": "arn:aws:sagemaker:us-west-2:111122223333:labeling-job/labeling-job-name", "labelCategories": ["Ex Category1","Ex Category2", "Ex Category3"], "labelAttributeName": "labeling-job-attribute-name", "roleArn" : "arn:aws:iam::111122223333:role/role-name", "payload": { "s3Uri": "s3://amzn-s3-demo-bucket/annotations.json" } }
nota
Si ningún trabajador trabaja en el objeto de datos y se ha alcanzado TaskAvailabilityLifetimeInSeconds
, el objeto de datos se marca como erróneo y no se incluirá como parte de la invocación de Lambda postanotación.
El siguiente bloque de código contiene el esquema de carga. Este es el archivo que indica el s3Uri
parámetro en el objeto de solicitud Lambda posterior a la anotación. payload
JSON Por ejemplo, si el bloque de código anterior es la solicitud Lambda postanotación, el siguiente archivo de anotaciones se encuentra en s3://amzn-s3-demo-bucket/annotations.json
.
En la siguiente lista con viñetas se describe cada uno de los parámetros.
ejemplo de un archivo de anotaciones
[ { "datasetObjectId":
<string>
, "dataObject": { "s3Uri":<string>
, "content":<string>
}, "annotations": [{ "workerId":<string>
, "annotationData": { "content":<string>
, "s3Uri":<string>
} }] } ]
-
datasetObjectId
(cadena): identifica un identificador único que Ground Truth asigna a cada objeto de datos que envíe al trabajo de etiquetado. -
dataObject
(JSONobjeto): el objeto de datos que se etiquetó. Si el objeto de datos está incluido en el archivo de manifiesto de entrada y se identifica mediante la clavesource
(por ejemplo, una cadena),dataObject
incluye una clavecontent
que identifica el objeto de datos. De lo contrario, se identifica con la ubicación del objeto de datos (por ejemplo, un enlace o S3URI)s3Uri
. -
annotations
(lista de JSON objetos): esta lista contiene un único JSON objeto por cada anotación enviada por los trabajadores al respectodataObject
. Un único JSON objeto contiene un objeto únicoworkerId
que se puede utilizar para identificar al trabajador que envió esa anotación. La claveannotationData
contiene uno de los siguientes valores:-
content
(cadena): contiene los datos de la anotación. -
s3Uri
(cadena): contiene un S3 URI que identifica la ubicación de los datos de la anotación.
-
La siguiente tabla contiene ejemplos del contenido que puede encontrar en la carga para distintos tipos de anotaciones.
La función de Lambda postanotación puede contener una lógica similar a la siguiente para recorrer y acceder a todas las anotaciones contenidas en la solicitud. Para ver un ejemplo completo, consulta annotation_consolidation_lambda.py
for i in range(len(annotations)): worker_id = annotations[i]["workerId"] annotation_content = annotations[i]['annotationData'].get('content') annotation_s3_uri = annotations[i]['annotationData'].get('s3uri') annotation = annotation_content if annotation_s3_uri is None else s3_client.get_object_from_s3( annotation_s3_uri) annotation_from_single_worker = json.loads(annotation) print("{} Received Annotations from worker [{}] is [{}]" .format(log_prefix, worker_id, annotation_from_single_worker))
sugerencia
Al ejecutar algoritmos de consolidación en los datos, puede utilizar un servicio de base de datos AWS para almacenar los resultados o puede devolver los resultados procesados a Ground Truth. Los datos que devuelva a Ground Truth se almacenan en manifiestos de anotaciones consolidados en el bucket de S3 especificado para la salida durante la configuración del trabajo de etiquetado.
A cambio, Ground Truth requiere una respuesta con el siguiente formato:
ejemplo de datos devueltos previstos
[ { "datasetObjectId":
<string>
, "consolidatedAnnotation": { "content": { "<labelattributename>
": {# ... label content
} } } }, { "datasetObjectId":<string>
, "consolidatedAnnotation": { "content": { "<labelattributename>
": {# ... label content
} } } } . . . ]
En este punto, todos los datos que envíe a su bucket de S3 que no sean datasetObjectId
están en el objeto content
.
Cuando devuelve anotaciones en content
, se obtiene una entrada en el manifiesto de salida de su trabajo como la siguiente:
ejemplo de formato de etiqueta en manifiesto de salida
{ "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 } }
Debido a la naturaleza potencialmente compleja de una plantilla personalizada y de los datos que recopila, Ground Truth no ofrece un procesamiento más amplio de los datos.