Anforderungen für Lambda-Funktionen zur Vorverarbeitung und zur Nachbearbeitung - Amazon SageMaker

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Anforderungen für Lambda-Funktionen zur Vorverarbeitung und zur Nachbearbeitung

In diesem Abschnitt erfahren Sie mehr über die Syntax der Anfragen, die an Lambda-Funktionen vor und nach der Anmerkung gesendet werden, sowie über die Antwortsyntax, die Ground Truth benötigt, um einen benutzerdefinierten Labeling-Workflow auszuführen.

Lambda zur Vorverarbeitung

Bevor eine Labeling-Aufgabe an den Worker gesendet wird, wird Ihre Lambda-Funktion zur Vorverarbeitung aufgerufen.

Ground Truth sendet Ihrer Lambda-Funktion eine JSON -formatierte Anfrage, um Details zum Labeling-Job und zum Datenobjekt bereitzustellen. Die folgende Tabelle enthält die Anforderungsschemas vor der Anmerkung. Nachfolgend ist jeder Parameter beschrieben.

Data object identified with "source-ref"
{ "version": "2018-10-16", "labelingJobArn": <labelingJobArn> "dataObject" : { "source-ref": <s3Uri> } }
Data object identified with "source"
{ "version": "2018-10-16", "labelingJobArn": <labelingJobArn> "dataObject" : { "source": <string> } }
  • version(Zeichenfolge): Dies ist eine Versionsnummer, die von Ground Truth intern verwendet wird.

  • labelingJobArn(string): Dies ist der Amazon-Ressourcenname oderARN, Ihres Labeling-Jobs. Dies ARN kann verwendet werden, um auf den Labeling-Job zu verweisen, wenn Ground Truth API Truth-Operationen wie verwendet DescribeLabelingJob werden.

  • Das dataObject (JSONObjekt): Der Schlüssel enthält eine einzelne JSON Zeile, entweder aus Ihrer Eingabemanifestdatei oder von Amazon gesendetSNS. Die JSON Zeilenobjekte in Ihrem Manifest können bis zu 100 Kilobyte groß sein und eine Vielzahl von Daten enthalten. Bei einer sehr einfachen Bildanmerkung dataObject JSON kann sie nur einen source-ref Schlüssel enthalten, der das Bild identifiziert, das mit Anmerkungen versehen werden soll. Wenn das Datenobjekt (z. B. eine Textzeile) direkt in der Eingabemanifestdatei enthalten ist, wird das Datenobjekt mit source identifiziert. Wenn Sie einen Überprüfungs- oder Anpassungsauftrag erstellen, kann diese Zeile Kennzeichnungsdaten und Metadaten aus dem vorherigen Kennzeichnungsauftrag enthalten.

Die folgende Tabelle enthält Codeblock-Beispiele für eine Anforderung zur Vorverarbeitung. Jeder Parameter in diesen Beispielanforderungen wird unter der Tabelle mit Registern erklärt.

Data object identified with "source-ref"
{ "version": "2018-10-16", "labelingJobArn": "arn:aws:sagemaker:<aws_region>:<aws_account_number>:labeling-job/<labeling_job_name>" "dataObject" : { "source-ref": "s3://<input-data-bucket>/<data-object-file-name>" } }
Data object identified with "source"
{ "version": "2018-10-16", "labelingJobArn": "arn:aws:sagemaker:<aws_region>:<aws_account_number>:labeling-job/<labeling_job_name>" "dataObject" : { "source": "Sue purchased 10 shares of the stock on April 10th, 2020" } }

Im Gegenzug benötigt Ground Truth eine Antwort, die wie folgt formatiert ist:

Beispiel von erwarteten Rückgabedaten
{ "taskInput": <json object>, "isHumanAnnotationRequired": <boolean> # Optional }

Im vorherigen Beispiel musste <json object> alle Daten enthalten, die Ihre benutzerdefinierte Worker-Aufgabenvorlage benötigt. Wenn Sie eine Bounding-Box-Aufgabe ausführen, bei der die Anweisungen immer gleich bleiben, handelt es sich möglicherweise nur um die HTTP (S) - oder Amazon S3 S3-Ressource für Ihre Bilddatei. Wenn es eine Stimmungsanalyseaufgabe ist und verschiedene Objekte möglicherweise unterschiedliche Auswahlmöglichkeiten bieten, ist es die Objektreferenz als Zeichenfolge und die Auswahl als ein Array von Zeichenfolgen.

Auswirkungen von isHumanAnnotationRequired

Dieser Wert ist optional, da er standardmäßig auf true eingestellt ist. Der primäre Anwendungsfall für die explizite Einstellung ist, wenn Sie dieses Datenobjekt von der Kennzeichnung durch Auftragnehmer ausschließen möchten.

Wenn Sie über eine Mischung von Objekten in Ihrem Manifest verfügen, von denen manche menschliche Anmerkungen erfordern und andere nicht, können Sie jedem Datenobjekt einen isHumanAnnotationRequired-Wert hinzufügen. Sie können Ihrem Lambda zu Vorverarbeitung Logik hinzufügen, um dynamisch zu bestimmen, ob ein Objekt eine Anmerkung benötigt, und diesen booleschen Wert entsprechend festlegen.

Beispiele für Lambda-Funktionen zur Vorverarbeitung

Die folgende grundlegende Lambda-Funktion vor der Anmerkung greift von der ersten Anfrage dataObject aus auf das JSON Objekt zu und gibt es im Parameter zurück. taskInput

import json def lambda_handler(event, context): return { "taskInput": event['dataObject'] }

Vorausgesetzt, die Eingabemanifestdatei verwendet "source-ref" zur Identifizierung von Datenobjekten, muss die Worker-Aufgabenvorlage, die in demselben Kennzeichnungsauftrag wie dieses Lambda zur Vorverarbeitung verwendet wird, ein Liquid-Element wie das folgende enthalten, um dataObject aufnehmen zu können:

{{ task.input.source-ref | grant_read_access }}

Wenn die Eingabemanifestdatei source zur Identifizierung des Datenobjekts verwendet hat, kann die Worker-Aufgabenvorlage dataObject aufnehmen mit Folgendem aufnehmen:

{{ task.input.source }}

Das folgende Lambda-Beispiel zur Vorverarbeitung enthält Logik zur Identifizierung des in dataObject verwendeten Schlüssels und zum Verweisen auf dieses Datenobjekt, das taskObject in der Rückgabenweisung von Lambda verwendet.

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 zur Nachbearbeitung

Sobald alle Worker das Datenobjekt mit Anmerkungen versehen haben oder wenn TaskAvailabilityLifetimeInSeconds erreicht wurde, je nachdem, welcher Fall zuerst eintritt, sendet Ground Truth diese Anmerkungen an Ihr Lambda zur Nachbearbeitung. Dieses Lambda wird normalerweise für Konsolidieren von Anmerkungen verwendet.

Tipp

Ein Beispiel für eine Lambda-Funktion nach der Konsolidierung finden Sie unter annotation_consolidation_lambda.py im Repository aws-sagemaker-ground-truth GitHub -recipe.

Der folgende Codeblock enthält das Anforderungsschema zur Nachbearbeitung. Jeder Parameter ist in der folgenden Aufzählungsliste beschrieben.

{ "version": "2018-10-16", "labelingJobArn": <string>, "labelCategories": [<string>], "labelAttributeName": <string>, "roleArn" : <string>, "payload": { "s3Uri": <string> } }
  • version(Zeichenfolge): Eine Versionsnummer, die von Ground Truth intern verwendet wird.

  • labelingJobArn(string): Der Amazon-Ressourcenname oderARN, Ihres Labeling-Jobs. Dies ARN kann verwendet werden, um auf den Labeling-Job zu verweisen, wenn Ground Truth API Truth-Operationen wie verwendet DescribeLabelingJob werden.

  • labelCategories(Liste der Zeichenfolgen): Umfasst die Kennzeichnungskategorien und andere Attribute, die Sie entweder in der Konsole angegeben haben oder die Sie in die Konfigurationsdatei für die Kennzeichnungskategorien aufgenommen haben.

  • labelAttributeName(Zeichenfolge): Entweder der Name Ihres Kennzeichnungsauftrags oder Kennzeichnungsattributname, den Sie bei der Erstellung des Kennzeichnungsauftrags angeben.

  • roleArn(string): Der Amazon-Ressourcenname (ARN) der IAM Ausführungsrolle, die Sie bei der Erstellung des Labeling-Jobs angeben.

  • payload(JSONObjekt): AJSON, das einen s3Uri Schlüssel enthält, der den Speicherort der Annotationsdaten für dieses Datenobjekt in Amazon S3 identifiziert. Der zweite Codeblock unten zeigt ein Beispiel für diese Annotationsdatei.

Der folgende Codeblock enthält ein Beispiel für eine Anforderung zur Nachbearbeitung. Jeder Parameter in dieser Beispielanforderung wird unter dem Codeblock erklärt.

Beispiel einer Lambda-Anforderung zur Nachbearbeitung
{ "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" } }
Anmerkung

Wenn kein Worker an dem Datenobjekt arbeitet und TaskAvailabilityLifetimeInSeconds erreicht wurde, wird das Datenobjekt als fehlgeschlagen markiert und nicht als Teil des Lambda-Aufrufs zur Nachbearbeitung aufgenommen.

Der folgende Codeblock enthält das Nutzlastschema. Dies ist die Datei, die durch den s3Uri Parameter im payload JSON Lambda-Anforderungsobjekt nach der Anmerkung angegeben wird. Wenn der vorherige Codeblock beispielsweise die Lambda-Anforderung zur Nachbearbeitung ist, befindet sich die folgende Annotationsdatei unter s3://amzn-s3-demo-bucket/annotations.json.

Jeder Parameter ist in der folgenden Aufzählungsliste beschrieben.

Beispiel einer Annotationsdatei
[ { "datasetObjectId": <string>, "dataObject": { "s3Uri": <string>, "content": <string> }, "annotations": [{ "workerId": <string>, "annotationData": { "content": <string>, "s3Uri": <string> } }] } ]
  • datasetObjectId(Zeichenfolge): Identifiziert eine eindeutige ID, die Ground Truth jedem Datenobjekt zuweist, das Sie an den Kennzeichnungsauftrag senden.

  • dataObject(JSONObjekt): Das Datenobjekt, das beschriftet wurde. Wenn das Datenobjekt in der Eingabemanifestdatei enthalten ist und mithilfe des source-Schlüssels (z .B. einer Zeichenfolge) identifiziert wird, enthält dataObject einen content-Schlüssel, der das Datenobjekt identifiziert. Andernfalls wird der Standort des Datenobjekts (z. B. ein Link oder S3URI) mit identifizierts3Uri.

  • annotations(Liste der JSON Objekte): Diese Liste enthält ein einzelnes JSON Objekt für jede Anmerkung, die von Arbeitern zu diesem Zweck eingereicht wurdedataObject. Ein einzelnes JSON Objekt enthält ein eindeutiges ObjektworkerId, anhand dessen der Mitarbeiter identifiziert werden kann, der diese Anmerkung eingereicht hat. Der annotationData-Schlüssel enthält eines der folgenden Elemente:

    • content(Zeichenfolge): Enthält die Annotationsdaten.

    • s3Uri(Zeichenfolge): Enthält einen S3-WertURI, der den Speicherort der Annotationsdaten identifiziert.

Die folgende Tabelle enthält Beispiele für den Inhalt, den Sie in der Nutzlast für verschiedene Arten von Anmerkungen finden können.

Named Entity Recognition Payload
[ { "datasetObjectId": "1", "dataObject": { "content": "Sift 3 cups of flour into the bowl." }, "annotations": [ { "workerId": "private.us-west-2.ef7294f850a3d9d1", "annotationData": { "content": "{\"crowd-entity-annotation\":{\"entities\":[{\"endOffset\":4,\"label\":\"verb\",\"startOffset\":0},{\"endOffset\":6,\"label\":\"number\",\"startOffset\":5},{\"endOffset\":20,\"label\":\"object\",\"startOffset\":15},{\"endOffset\":34,\"label\":\"object\",\"startOffset\":30}]}}" } } ] } ]
Semantic Segmentation Payload
[ { "datasetObjectId": "2", "dataObject": { "s3Uri": "s3://amzn-s3-demo-bucket/gt-input-data/images/bird3.jpg" }, "annotations": [ { "workerId": "private.us-west-2.ab1234c5678a919d0", "annotationData": { "content": "{\"crowd-semantic-segmentation\":{\"inputImageProperties\":{\"height\":2000,\"width\":3020},\"labelMappings\":{\"Bird\":{\"color\":\"#2ca02c\"}},\"labeledImage\":{\"pngImageData\":\"iVBOR...\"}}}" } } ] } ]
Bounding Box Payload
[ { "datasetObjectId": "0", "dataObject": { "s3Uri": "s3://amzn-s3-demo-bucket/gt-input-data/images/bird1.jpg" }, "annotations": [ { "workerId": "private.us-west-2.ab1234c5678a919d0", "annotationData": { "content": "{\"boundingBox\":{\"boundingBoxes\":[{\"height\":2052,\"label\":\"Bird\",\"left\":583,\"top\":302,\"width\":1375}],\"inputImageProperties\":{\"height\":2497,\"width\":3745}}}" } } ] } ]

Ihre Lambda-Funktion zur Nachbereitung kann eine Logik ähnlich der folgenden enthalten, um alle in der Anforderung enthaltenen Anmerkungen zu durchlaufen und darauf zuzugreifen. Ein vollständiges Beispiel finden Sie unter annotation_consolidation_lambda.py im GitHub Repository aws-sagemaker-ground-truth-recipe. In diesem GitHub Beispiel müssen Sie Ihre eigene Logik zur Konsolidierung von Anmerkungen hinzufügen.

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))
Tipp

Wenn Sie Konsolidierungsalgorithmen für die Daten ausführen, können Sie einen AWS -Datenbankservice verwenden, um Ergebnisse zu speichern, oder Sie können die verarbeiteten Ergebnisse an Ground Truth zurückgeben. Die Daten, die Sie an Ground Truth zurückgeben, werden in konsolidierten Annotationsmanifesten im S3-Bucket gespeichert, der während der Konfiguration des Kennzeichnungsauftrags für die Ausgabe angegeben wurde.

Im Gegenzug benötigt Ground Truth eine Antwort, die wie folgt formatiert ist:

Beispiel von erwarteten Rückgabedaten
[ { "datasetObjectId": <string>, "consolidatedAnnotation": { "content": { "<labelattributename>": { # ... label content } } } }, { "datasetObjectId": <string>, "consolidatedAnnotation": { "content": { "<labelattributename>": { # ... label content } } } } . . . ]

An diesem Punkt befinden sich alle Daten, die Sie an Ihren S3-Bucket senden, außer der datasetObjectId, im content-Objekt.

Wenn Sie Anmerkungen in content zurückgeben, führt dies zu einem Eintrag im Ausgabemanifest Ihres Auftrags, der wie folgt aussieht:

Beispiel eines Kennzeichnungsformats im Ausgabemanifest
{ "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 } }

Aufgrund der potenziell komplexen Natur einer benutzerdefinierten Vorlage und der Daten, die sie sammelt, bietet Ground Truth keine weitere Verarbeitung der Daten oder Einblicke in diese.