

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Menggunakan fungsi Lambda pra-anotasi dan pasca-anotasi
<a name="sms-custom-templates-step3-lambda-requirements"></a>

Gunakan topik ini untuk mempelajari sintaks permintaan yang dikirim ke fungsi Lambda pra-anotasi dan pasca-anotasi, dan sintaks respons yang diperlukan yang digunakan Ground Truth dalam alur kerja pelabelan khusus.

**Topics**
+ [Pre-annotation Lambda](#sms-custom-templates-step3-prelambda)
+ [Post-annotation Lambda](#sms-custom-templates-step3-postlambda)

## Pre-annotation Lambda
<a name="sms-custom-templates-step3-prelambda"></a>

Sebelum tugas pelabelan dikirim ke pekerja, fungsi Lambda pra-anotasi opsional dapat dipanggil.

Ground Truth mengirimkan fungsi Lambda Anda permintaan berformat JSON untuk memberikan detail tentang pekerjaan pelabelan dan objek data.

Berikut ini adalah 2 contoh permintaan berformat JSON.

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

------

 Daftar berikut berisi skema permintaan pra-anotasi. Setiap parameter dijelaskan di bawah ini.
+ `version`(string): Ini adalah nomor versi yang digunakan secara internal oleh Ground Truth.
+ `labelingJobArn`(string): Ini adalah Nama Sumber Daya Amazon, atau ARN, dari pekerjaan pelabelan Anda. ARN ini dapat digunakan untuk mereferensikan pekerjaan pelabelan saat menggunakan operasi Ground Truth API seperti`DescribeLabelingJob`.
+ `dataObject`(Objek JSON): Kunci berisi satu baris JSON, baik dari file manifes input Anda atau dikirim dari Amazon SNS. Objek baris JSON dalam manifes Anda dapat berukuran hingga 100 kilobyte dan berisi berbagai data. Untuk pekerjaan anotasi gambar yang sangat mendasar, `dataObject` JSON mungkin hanya berisi `source-ref` kunci, mengidentifikasi gambar yang akan dianotasi. Jika objek data (misalnya, baris teks) disertakan langsung dalam file manifes input, objek data diidentifikasi dengan`source`. Jika Anda membuat pekerjaan verifikasi atau penyesuaian, baris ini mungkin berisi data label dan metadata dari pekerjaan pelabelan sebelumnya.

Contoh tab berikut menunjukkan contoh permintaan pra-anotasi. Setiap parameter dalam contoh permintaan ini dijelaskan di bawah tabel tab.

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

------

Sebagai imbalannya, Ground Truth membutuhkan respons yang diformat seperti berikut:

**Example dari data pengembalian yang diharapkan**  

```
{
    "taskInput": {{<json object>}},
    "isHumanAnnotationRequired": {{<boolean>}} # Optional
}
```

Dalam contoh sebelumnya, `<json object>` perlu berisi * semua data * yang dibutuhkan template tugas pekerja kustom Anda. Jika Anda melakukan tugas kotak pembatas di mana instruksi tetap sama sepanjang waktu, itu mungkin hanya sumber daya HTTP (S) atau Amazon S3 untuk file gambar Anda. Jika itu adalah tugas analisis sentimen dan objek yang berbeda mungkin memiliki pilihan yang berbeda, itu adalah referensi objek sebagai string dan pilihan sebagai array string.

**Implikasi dari `adalah HumanAnnotationRequired`**  
Nilai ini opsional karena defaultnya. `true` Kasus penggunaan utama untuk menyetelnya secara eksplisit adalah ketika Anda ingin mengecualikan objek data ini agar tidak diberi label oleh pekerja manusia. 

Jika Anda memiliki campuran objek dalam manifes Anda, dengan beberapa memerlukan anotasi manusia dan beberapa tidak membutuhkannya, Anda dapat menyertakan `isHumanAnnotationRequired` nilai di setiap objek data. Anda dapat menambahkan logika ke Lambda pra-anotasi Anda untuk menentukan secara dinamis apakah objek memerlukan anotasi, dan mengatur nilai boolean ini sesuai dengan itu.

### Contoh fungsi Lambda pra-anotasi
<a name="sms-custom-templates-step3-prelambda-example"></a>

Fungsi Lambda pra-anotasi dasar berikut mengakses objek JSON `dataObject` dari permintaan awal, dan mengembalikannya dalam parameter. `taskInput`

```
import json

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

Dengan asumsi file manifes input digunakan `"source-ref"` untuk mengidentifikasi objek data, template tugas pekerja yang digunakan dalam pekerjaan pelabelan yang sama dengan Lambda pra-anotasi ini harus menyertakan elemen Liquid seperti berikut untuk dicerna: `dataObject`

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

Jika file manifes input digunakan `source` untuk mengidentifikasi objek data, template tugas kerja dapat diserap `dataObject` dengan yang berikut:

```
{{ task.input.source }}
```

Contoh Lambda pra-anotasi berikut mencakup logika untuk mengidentifikasi kunci yang digunakan dalam`dataObject`, dan untuk menunjuk ke objek data yang digunakan `taskObject` dalam pernyataan pengembalian 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
```

## Post-annotation Lambda
<a name="sms-custom-templates-step3-postlambda"></a>

Ketika semua pekerja telah membuat anotasi objek data atau kapan [`TaskAvailabilityLifetimeInSeconds`](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_HumanLoopConfig.html#SageMaker-Type-HumanLoopConfig-TaskAvailabilityLifetimeInSeconds) telah dicapai, mana saja yang lebih dulu, Ground Truth mengirimkan anotasi tersebut ke Lambda pasca-anotasi Anda. Lambda ini umumnya digunakan untuk[Konsolidasi anotasi](sms-annotation-consolidation.md).

**catatan**  
Untuk melihat contoh fungsi Lambda pasca-konsolidasi, lihat [ annotation\_consolidation\_lambda.py ](https://github.com/aws-samples/aws-sagemaker-ground-truth-recipe/blob/master/aws_sagemaker_ground_truth_sample_lambda/annotation_consolidation_lambda.py) di repositori [ aw ](https://github.com/aws-samples/aws-sagemaker-ground-truth-recipe) GitHub s-sagemaker-ground-truth-resep.

Blok kode berikut berisi skema permintaan pasca-anotasi. Setiap parameter dijelaskan dalam daftar berpoin berikut.

```
{
    "version": "2018-10-16",
    "labelingJobArn": {{<string>}},
    "labelCategories": [{{<string>}}],
    "labelAttributeName": {{<string>}},
    "roleArn" : {{<string>}},
    "payload": {
        "s3Uri": {{<string>}}
    }
 }
```
+ `version`(string): Nomor versi yang digunakan secara internal oleh Ground Truth.
+ `labelingJobArn`(string): Nama Sumber Daya Amazon, atau ARN, dari pekerjaan pelabelan Anda. ARN ini dapat digunakan untuk mereferensikan pekerjaan pelabelan saat menggunakan operasi Ground Truth API seperti`DescribeLabelingJob`.
+ `labelCategories`(daftar string): Termasuk kategori label dan atribut lain yang Anda tentukan di konsol, atau yang Anda sertakan dalam file konfigurasi kategori label.
+ `labelAttributeName`(string): Nama pekerjaan pelabelan Anda, atau nama atribut label yang Anda tentukan saat membuat pekerjaan pelabelan.
+ `roleArn`(string): Nama Sumber Daya Amazon (ARN) dari peran eksekusi IAM yang Anda tentukan saat membuat pekerjaan pelabelan. 
+ `payload`(Objek JSON): JSON yang menyertakan `s3Uri` kunci, yang mengidentifikasi lokasi data anotasi untuk objek data tersebut di Amazon S3. Blok kode kedua di bawah ini menunjukkan contoh file anotasi ini.

Blok kode berikut berisi contoh permintaan pasca-anotasi. Setiap parameter dalam contoh permintaan ini dijelaskan di bawah blok kode.

**Example dari permintaan Lambda pasca-anotasi**  

```
{
    "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"
    }
 }
```

**catatan**  
Jika tidak ada pekerja yang bekerja pada objek data dan `TaskAvailabilityLifetimeInSeconds` telah dicapai, objek data ditandai sebagai gagal dan tidak disertakan sebagai bagian dari pemanggilan Lambda pasca-anotasi.

Blok kode berikut berisi skema payload. Ini adalah file yang ditunjukkan oleh `s3Uri` parameter dalam objek `payload` JSON permintaan Lambda pasca-anotasi. Misalnya, jika blok kode sebelumnya adalah permintaan Lambda pasca-anotasi, file anotasi berikut terletak di. `s3://amzn-s3-demo-bucket/annotations.json`

Setiap parameter dijelaskan dalam daftar berpoin berikut.

**Example dari file anotasi**  

```
[
    {
        "datasetObjectId": {{<string>}},
        "dataObject": {
            "s3Uri": {{<string>}},
            "content": {{<string>}}
        },
        "annotations": [{
            "workerId": {{<string>}},
            "annotationData": {
                "content": {{<string>}},
                "s3Uri": {{<string>}}
            }
       }]
    }
]
```
+ `datasetObjectId`(string): Mengidentifikasi ID unik yang ditetapkan oleh Ground Truth untuk setiap objek data yang Anda kirim ke pekerjaan pelabelan.
+ `dataObject`(Objek JSON): Objek data yang diberi label. Jika objek data disertakan dalam file manifes input dan diidentifikasi menggunakan `source` kunci (misalnya, string), `dataObject` termasuk `content` kunci, yang mengidentifikasi objek data. Jika tidak, lokasi objek data (misalnya, tautan atau URI S3) diidentifikasi dengan`s3Uri`.
+ `annotations`(daftar objek JSON): Daftar ini berisi satu objek JSON untuk setiap anotasi yang dikirimkan oleh pekerja untuk itu`dataObject`. Sebuah objek JSON tunggal berisi unik `workerId` yang dapat digunakan untuk mengidentifikasi pekerja yang mengirimkan anotasi itu. K `annotationData` unci berisi salah satu dari berikut ini:
  + `content`(string): Berisi data anotasi. 
  + `s3Uri`(string): Berisi URI S3 yang mengidentifikasi lokasi data anotasi.

Tabel berikut berisi contoh konten yang mungkin Anda temukan di payload untuk berbagai jenis anotasi.

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

------

Fungsi Lambda pasca-anotasi Anda mungkin berisi logika yang mirip dengan yang berikut untuk mengulang dan mengakses semua anotasi yang terkandung dalam permintaan. Untuk contoh lengkapnya, lihat [ annotation\_consolidation\_lambda.py ](https://github.com/aws-samples/aws-sagemaker-ground-truth-recipe/blob/master/aws_sagemaker_ground_truth_sample_lambda/annotation_consolidation_lambda.py) di repositori [ aws-sag ](https://github.com/aws-samples/aws-sagemaker-ground-truth-recipe) GitHub emaker-ground-truth-recept. Dalam GitHub contoh ini, Anda harus menambahkan logika konsolidasi anotasi Anda sendiri. 

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

**Tip**  
Saat menjalankan algoritma konsolidasi pada data, Anda dapat menggunakan layanan AWS database untuk menyimpan hasil, atau Anda dapat meneruskan hasil yang diproses kembali ke Ground Truth. Data yang Anda kembalikan ke Ground Truth disimpan dalam manifes anotasi konsolidasi dalam bucket S3 yang ditentukan untuk output selama konfigurasi pekerjaan pelabelan.

Sebagai imbalannya, Ground Truth membutuhkan respons yang diformat seperti berikut:

**Example dari data pengembalian yang diharapkan**  

```
[
   {        
        "datasetObjectId": {{<string>}},
        "consolidatedAnnotation": {
            "content": {
                "{{<labelattributename>}}": {
                    {{# ... label content}}
                }
            }
        }
    },
   {        
        "datasetObjectId": {{<string>}},
        "consolidatedAnnotation": {
            "content": {
                "{{<labelattributename>}}": {
                    {{# ... label content}}
                }
            }
        }
    }
    .
    .
    .
]
```
Pada titik ini, semua data yang Anda kirim ke bucket S3 Anda`datasetObjectId`, selain, ada di `content` objek.

Saat Anda mengembalikan anotasi`content`, ini menghasilkan entri dalam manifes keluaran pekerjaan Anda seperti berikut:

**Example format label dalam manifes keluaran**  

```
{  "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
    }
}
```

Karena sifat template khusus yang berpotensi kompleks dan data yang dikumpulkan, Ground Truth tidak menawarkan pemrosesan data lebih lanjut.