Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Requisiti della funzione Lambda di pre-annotazione e post-annotazione
Consulta questa sezione per scoprire la sintassi delle richieste inviate alle funzioni Lambda di pre-annotazione e post-annotazione e la sintassi di risposta richiesta da Ground Truth per eseguire un flusso di lavoro di etichettatura personalizzato.
Lambda di pre-annotazione
Prima che un'attività di etichettatura venga inviata al worker, viene richiamata la funzione Lambda di pre-annotazione.
Ground Truth invia alla funzione Lambda una richiesta in JSON formato elettronico per fornire dettagli sul processo di etichettatura e sull'oggetto dati. La tabella seguente contiene gli schemi di richiesta di pre-annotazione. Di seguito è riportata una descrizione di ciascun parametro.
-
version
(stringa): questo è un numero di versione usato internamente da Ground Truth. -
labelingJobArn
(string): Questo è il nome della risorsa Amazon, oARN, del tuo lavoro di etichettatura. Questo ARN può essere usato per fare riferimento al lavoro di etichettatura quando si utilizzano API operazioni Ground Truth comeDescribeLabelingJob
. -
L'
dataObject
(JSONoggetto): la chiave contiene una sola JSON riga, dal file manifest di input o inviata da AmazonSNS. Gli oggetti di JSON linea nel manifesto possono avere dimensioni fino a 100 kilobyte e contenere una varietà di dati. Per un lavoro di annotazione di immagini molto semplice,dataObject
JSON può contenere solo unasource-ref
chiave che identifica l'immagine da annotare. Se l'oggetto dati (ad esempio, una riga di testo) è incluso direttamente nel file manifest di input, l'oggetto dati viene identificato consource
. Se si crea un processo di verifica o regolazione, questa riga può contenere i dati dell'etichetta e i metadati del precedente processo di etichettatura.
La tabella seguente include esempi di blocchi di codice di una richiesta di pre-annotazione. Ogni parametro di queste richieste di esempio è spiegato sotto la tabella a schede.
In cambio, Ground Truth richiede una risposta formattata come la seguente:
Esempio di dati di restituzione previsti
{ "taskInput":
<json object>
, "isHumanAnnotationRequired":<boolean>
# Optional }
Nell'esempio precedente, <json object>
deve contenere tutti i dati richiesti dal modello di attività del worker personalizzato. Se stai eseguendo un'attività di bounding box in cui le istruzioni rimangono sempre le stesse, potrebbe trattarsi solo della risorsa HTTP (S) o Amazon S3 per il tuo file di immagine. Se si tratta di un'attività di analisi del sentiment e oggetti diversi possono avere scelte diverse, sarà il riferimento dell'oggetto come una stringa e le scelte come una matrice di stringhe.
Implicazioni di isHumanAnnotationRequired
Questo valore è facoltativo perché viene utilizzato true
come valore predefinito. Il caso d'uso principale per l'impostazione esplicita è quando desideri escludere questo oggetto dati dall'etichettatura eseguita dai worker.
Se hai una combinazione di oggetti del manifest, in cui alcuni richiedono l'annotazione umana e alcuni non la richiedono, puoi includere un valore isHumanAnnotationRequired
in ogni oggetto dati. È possibile aggiungere una logica alla propria Lambda di pre-annotazione per determinare in modo dinamico se un oggetto richiede l'annotazione e impostare questo valore booleano di conseguenza.
Esempi di funzioni Lambda di pre-annotazione
La seguente funzione Lambda di pre-annotazione di base accede all'JSONoggetto dataObject
dalla richiesta iniziale e lo restituisce nel parametro. taskInput
import json def lambda_handler(event, context): return { "taskInput": event['dataObject'] }
Supponendo che il file manifest di input utilizzi "source-ref"
per identificare gli oggetti dati, il modello di attività del worker utilizzato nello stesso processo di etichettatura di questa Lambda di pre-annotazione deve includere un elemento Liquid come il seguente da importare dataObject
:
{{ task.input.source-ref | grant_read_access }}
Se il file manifest di input ha utilizzato source
per identificare l'oggetto dati, il modello di attività di elaborazione può importare dataObject
con quanto segue:
{{ task.input.source }}
Il seguente esempio di pre-annotazione Lambda include una logica per identificare la chiave utilizzata in dataObject
e per indicare l'oggetto dati utilizzando taskObject
nell'istruzione return di 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
Lambda di post-annotazione
Quando tutti i worker hanno annotato l'oggetto dati o quando è stato raggiunto TaskAvailabilityLifetimeInSeconds
, a seconda di ciò che avviene prima, Ground Truth invia tali annotazioni al proprio Lambda di post-annotazione. Questa Lambda viene generalmente utilizzata per Consolidamento delle annotazioni.
Suggerimento
Il blocco di codice seguente contiene lo schema di richiesta di post-annotazione. Ogni parametro è descritto nell'elenco puntato seguente.
{ "version": "2018-10-16", "labelingJobArn":
<string>
, "labelCategories": [<string>
], "labelAttributeName":<string>
, "roleArn" :<string>
, "payload": { "s3Uri":<string>
} }
-
version
(stringa): un numero di versione usato internamente da Ground Truth. -
labelingJobArn
(string): Il nome della risorsa Amazon, oARN, del tuo processo di etichettatura. Questo ARN può essere usato per fare riferimento al lavoro di etichettatura quando si utilizzano API operazioni Ground Truth comeDescribeLabelingJob
. -
labelCategories
(elenco di stringhe): include le categorie di etichette e altri attributi specificati nella console o inclusi nel file di configurazione delle categorie di etichette. -
labelAttributeName
(stringa): il nome del processo di etichettatura o il nome dell'attributo dell'etichetta specificato quando si crea il processo di etichettatura. -
roleArn
(string): L'Amazon Resource Name (ARN) del ruolo di IAM esecuzione specificato quando crei il processo di etichettatura. -
payload
(JSONoggetto): Una JSON che include unas3Uri
chiave, che identifica la posizione dei dati di annotazione per quell'oggetto di dati in Amazon S3. Il secondo blocco di codice riportato di seguito mostra un esempio di questo file di annotazioni.
Il blocco di codice seguente contiene un esempio di richiesta post-annotazione. Ogni parametro in questo esempio è spiegato sotto il blocco di codice.
Esempio di una richiesta Lambda post-annotazione
{ "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
Se nessun worker utilizza l'oggetto dati ed è stato raggiunto TaskAvailabilityLifetimeInSeconds
, l'oggetto dati verrà contrassegnato come non riuscito e non verrà incluso come parte della richiesta Lambda post-annotazione.
Il seguente blocco di codice contiene lo schema di payload. Questo è il file indicato dal s3Uri
parametro nell'oggetto di richiesta Lambda post-annotazione. payload
JSON Ad esempio, se il blocco di codice precedente è la richiesta Lambda post-annotazione, il seguente file di annotazione si trova in s3://amzn-s3-demo-bucket/annotations.json
.
Ogni parametro è descritto nell'elenco puntato seguente.
Esempio di un file di annotazioni
[ { "datasetObjectId":
<string>
, "dataObject": { "s3Uri":<string>
, "content":<string>
}, "annotations": [{ "workerId":<string>
, "annotationData": { "content":<string>
, "s3Uri":<string>
} }] } ]
-
datasetObjectId
(stringa): identifica un ID univoco che Ground Truth assegna a ciascun oggetto dati inviato al processo di etichettatura. -
dataObject
(JSONoggetto): L'oggetto dati che è stato etichettato. Se l'oggetto dati è incluso nel file manifesto di input e identificato utilizzando la chiavesource
(ad esempio una stringa),dataObject
include una chiavecontent
che identifica l'oggetto dati. Altrimenti, la posizione dell'oggetto dati (ad esempio, un link o S3URI) viene identificata con.s3Uri
-
annotations
(elenco di JSON oggetti): Questo elenco contiene un singolo JSON oggetto per ogni annotazione inviata dai lavoratori a tale scopo.dataObject
Un singolo JSON oggetto contiene un elemento univocoworkerId
che può essere utilizzato per identificare il lavoratore che ha inviato l'annotazione. La chiaveannotationData
contiene uno dei seguenti elementi:-
content
(stringa): contiene i dati di annotazione. -
s3Uri
(stringa): Contiene un S3 URI che identifica la posizione dei dati di annotazione.
-
La tabella seguente contiene esempi del contenuto che è possibile trovare nel payload per diversi tipi di annotazioni.
La funzione Lambda post-annotazione può contenere una logica simile alla seguente per scorrere in loop e accedere a tutte le annotazioni contenute nella richiesta. Per un esempio completo, vedete 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))
Suggerimento
Quando esegui algoritmi di consolidamento sui dati, puoi utilizzare un servizio di database AWS per archiviare i risultati oppure puoi restituire i risultati elaborati a Ground Truth. I dati restituiti a Ground Truth vengono archiviati in manifesti di annotazione consolidati nel bucket S3 specificato per l'output durante la configurazione del processo di etichettatura.
In cambio, Ground Truth richiede una risposta formattata come la seguente:
Esempio di dati di restituzione previsti
[ { "datasetObjectId":
<string>
, "consolidatedAnnotation": { "content": { "<labelattributename>
": {# ... label content
} } } }, { "datasetObjectId":<string>
, "consolidatedAnnotation": { "content": { "<labelattributename>
": {# ... label content
} } } } . . . ]
A questo punto, tutti i dati che stai inviando al bucket S3, tranne datasetObjectId
, saranno nell'oggetto content
.
Quando restituisci le annotazioni content
, ciò porta a una voce nel manifesto di output del proprio processo simile alla seguente:
Esempio di formato etichetta nel manifest di output
{ "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 } }
A causa della natura potenzialmente complessa di un modello personalizzato e dei dati che raccoglie, Ground Truth non offre un'ulteriore elaborazione dei dati.