

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.

# Verwenden der Lambda-Funktionen zur Vorverarbeitung und zur Nachbearbeitung
<a name="sms-custom-templates-step3-lambda-requirements"></a>

In diesen Themen erfahren Sie mehr über die Syntax der Anforderungen, die an Lambda-Funktionen vor und nach der Anmerkung gesendet werden, sowie über die erforderliche Antwortsyntax, die Ground Truth in benutzerdefinierten Labeling-Workflows verwendet.

**Topics**
+ [

## Lambda zur Vorverarbeitung
](#sms-custom-templates-step3-prelambda)
+ [

## Lambda zur Nachbearbeitung
](#sms-custom-templates-step3-postlambda)

## Lambda zur Vorverarbeitung
<a name="sms-custom-templates-step3-prelambda"></a>

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

Ground Truth sendet Ihrer Lambda-Funktion eine Anforderung im JSON-Format, um Details zum Kennzeichnungsauftrag und zum Datenobjekt bereitzustellen.

Es folgen zwei JSON-formatierte Beispielanforderungen.

------
#### [ 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>
    }
}
```

------

 Die folgende Liste enthält die Anforderungsschemas zur Vorverarbeitung. Nachfolgend ist jeder Parameter beschrieben.
+ `version`(Zeichenfolge): Dies ist eine Versionsnummer, die von Ground Truth intern verwendet wird.
+ `labelingJobArn`(Zeichenfolge): Dies ist der Amazon-Ressourcenname oder ARN Ihres Kennzeichnungsauftrags. Dieser ARN kann verwendet werden, um auf den Kennzeichnungsauftrag zu verweisen, wenn Ground-Truth-API-Operationen wie `DescribeLabelingJob` verwendet werden.
+ Das `dataObject` (JSON-Objekt): Der Schlüssel enthält eine einzelne JSON-Line, entweder aus Ihrer Eingabemanifestdatei oder von Amazon SNS gesendet. Die JSON-Line-Objekte in Ihrem Manifest können bis zu 100 KB groß sein und eine Vielzahl von Daten enthalten. Bei einem sehr einfachen Bildanmerkungsauftrag kann das `dataObject` JSON 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 folgenden Registerkarten zeigen 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:us-west-2:111122223333: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>:111122223333: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:

**Example 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 Begrenzungsrahmenaufgabe ausführen, in der die Anweisungen stets beibehalten werden, mag es sich lediglich um die HTTP(S) oder Amazon-S3-Ressource für Ihre Bilddatei handeln. 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
<a name="sms-custom-templates-step3-prelambda-example"></a>

Die folgende grundlegende Lambda-Funktion zur Vorverarbeitung greift von der ersten Anforderung aus auf das JSON-Objekt in `dataObject` zu und gibt es im Parameter `taskInput` zurück.

```
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
<a name="sms-custom-templates-step3-postlambda"></a>

Sobald alle Worker das Datenobjekt mit Anmerkungen versehen haben oder wenn [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_HumanLoopConfig.html#SageMaker-Type-HumanLoopConfig-TaskAvailabilityLifetimeInSeconds](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_HumanLoopConfig.html#SageMaker-Type-HumanLoopConfig-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 [Anmerkungskonsolidierung](sms-annotation-consolidation.md) verwendet.

**Anmerkung**  
Ein Beispiel für eine Lambda-Funktion nach der Konsolidierung finden Sie unter [annotation\$1consolidation\$1lambda.py im Repository aws-sagemaker-ground-truth](https://github.com/aws-samples/aws-sagemaker-ground-truth-recipe/blob/master/aws_sagemaker_ground_truth_sample_lambda/annotation_consolidation_lambda.py) [ GitHub -recipe](https://github.com/aws-samples/aws-sagemaker-ground-truth-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`(Zeichenfolge): Der Amazon-Ressourcenname oder ARN Ihres Kennzeichnungsauftrags. Dieser ARN kann verwendet werden, um auf den Kennzeichnungsauftrag zu verweisen, wenn Ground-Truth-API-Operationen wie `DescribeLabelingJob` verwendet 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`(Zeichenfolge): Der Amazon-Ressourcenname (ARN) der IAM-Ausführungsrolle, die Sie beim Erstellen des Kennzeichnungsauftrags angeben. 
+ `payload`(JSON-Objekt): Ein JSON, 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.

**Example 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-Objekt der Lambda-Anforderung zur Nachbearbeitung angegeben ist. 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.

**Example 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`(JSON-Objekt): 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 Speicherort des Datenobjekts (z. B. ein Link oder ein S3-URI) mit `s3Uri` identifiziert.
+ `annotations` (Liste der JSON-Objekte): Diese Liste enthält ein einzelnes JSON-Objekt für jede Anmerkung, die von Workern für dieses `dataObject` eingereicht wurde. Ein einzelnes JSON-Objekt enthält eine eindeutige `workerId`, die zur Identifizierung des Workers verwendet 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-URI, 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\$1consolidation\$1lambda.py im Repository](https://github.com/aws-samples/aws-sagemaker-ground-truth-recipe/blob/master/aws_sagemaker_ground_truth_sample_lambda/annotation_consolidation_lambda.py) -recipe. aws-sagemaker-ground-truth](https://github.com/aws-samples/aws-sagemaker-ground-truth-recipe) GitHub 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:

**Example 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:

**Example 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.