Demo Template: Anotasi Gambar dengan crowd-bounding-box - Amazon SageMaker

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

Demo Template: Anotasi Gambar dengan crowd-bounding-box

Ketika Anda memilih untuk menggunakan template kustom sebagai jenis tugas Anda di konsol Amazon SageMaker Ground Truth, Anda mencapai panel tugas pelabelan kustom. Di sana Anda dapat memilih dari beberapa templat dasar. Template mewakili beberapa tugas yang paling umum dan memberikan contoh untuk bekerja saat Anda membuat template tugas pelabelan khusus Anda. Jika Anda tidak menggunakan konsol, atau sebagai jalan lain, lihat Amazon SageMaker Ground Truth Sample Task UIs untuk repositori template demo untuk berbagai jenis tugas pekerjaan pelabelan.

Demonstrasi ini bekerja dengan BoundingBoxtemplate. Demonstrasi juga berfungsi dengan AWS Lambda fungsi yang diperlukan untuk memproses data Anda sebelum dan sesudah tugas. Di repositori Github di atas, untuk menemukan template yang berfungsi dengan AWS Lambda fungsi, cari {{ task.input.<property name> }} di template.

Templat kustom Starter Bounding Box

Ini adalah template kotak pembatas starter yang disediakan.

<script src="https://assets.crowd.aws/crowd-html-elements.js"></script> <crowd-form> <crowd-bounding-box name="boundingBox" src="{{ task.input.taskObject | grant_read_access }}" header="{{ task.input.header }}" labels="{{ task.input.labels | to_json | escape }}" > <!-- The <full-instructions> tag is where you will define the full instructions of your task. --> <full-instructions header="Bounding Box Instructions" > <p>Use the bounding box tool to draw boxes around the requested target of interest:</p> <ol> <li>Draw a rectangle using your mouse over each instance of the target.</li> <li>Make sure the box does not cut into the target, leave a 2 - 3 pixel margin</li> <li> When targets are overlapping, draw a box around each object, include all contiguous parts of the target in the box. Do not include parts that are completely overlapped by another object. </li> <li> Do not include parts of the target that cannot be seen, even though you think you can interpolate the whole shape of the target. </li> <li>Avoid shadows, they're not considered as a part of the target.</li> <li>If the target goes off the screen, label up to the edge of the image.</li> </ol> </full-instructions> <!-- The <short-instructions> tag allows you to specify instructions that are displayed in the left hand side of the task interface. It is a best practice to provide good and bad examples in this section for quick reference. --> <short-instructions> Use the bounding box tool to draw boxes around the requested target of interest. </short-instructions> </crowd-bounding-box> </crowd-form>

Template kustom menggunakan bahasa template Liquid, dan setiap item di antara kurung kurawal ganda adalah variabel. AWS Lambda Fungsi pra-anotasi harus menyediakan objek bernama taskInput dan properti objek tersebut dapat diakses seperti {{ task.input.<property name> }} pada template Anda.

Template kustom Bounding Box Anda sendiri

Sebagai contoh, asumsikan Anda memiliki banyak koleksi foto hewan di mana Anda mengetahui jenis hewan dalam gambar dari pekerjaan klasifikasi gambar sebelumnya. Sekarang Anda ingin memiliki kotak pembatas yang digambar di sekitarnya.

Dalam sampel starter, ada tiga variabel:taskObject,header, danlabels.

Masing-masing akan diwakili di berbagai bagian kotak pembatas.

  • taskObjectadalah HTTP (S) URL atau S3 URI untuk foto yang akan dianotasi. Yang ditambahkan | grant_read_access adalah filter yang akan mengubah S3 URI menjadi HTTPS URL dengan akses berumur pendek ke sumber daya itu. Jika Anda menggunakan HTTP (S)URL, itu tidak diperlukan.

  • headeradalah teks di atas foto yang akan diberi label, seperti “Gambar kotak di sekitar burung di foto.”

  • labelsadalah array, direpresentasikan sebagai['item1', 'item2', ...]. Ini adalah label yang dapat ditetapkan oleh pekerja ke kotak berbeda yang mereka gambar. Anda dapat memiliki satu atau banyak.

Setiap nama variabel berasal dari JSON objek dalam respons dari Lambda pra-anotasi Anda, Nama-nama di atas hanya disarankan, Gunakan nama variabel apa pun yang masuk akal bagi Anda dan akan mempromosikan keterbacaan kode di antara tim Anda.

Gunakan variabel hanya bila diperlukan

Jika bidang tidak akan berubah, Anda dapat menghapus variabel itu dari template dan menggantinya dengan teks itu, jika tidak, Anda harus mengulangi teks itu sebagai nilai di setiap objek dalam manifes Anda atau mengkodekannya ke dalam fungsi Lambda pra-anotasi Anda.

contoh : Templat Kotak Pembatas Akhir yang Disesuaikan

Untuk menjaga hal-hal sederhana, template ini akan memiliki satu variabel, satu label, dan instruksi yang sangat dasar. Dengan asumsi manifes Anda memiliki properti “hewan” di setiap objek data, nilai itu dapat digunakan kembali di dua bagian templat.

<script src="https://assets.crowd.aws/crowd-html-elements.js"></script> <crowd-form> <crowd-bounding-box name="boundingBox" labels="[ '{{ task.input.animal }}' ]" src="{{ task.input.source-ref | grant_read_access }}" header="Draw a box around the {{ task.input.animal }}." > <full-instructions header="Bounding Box Instructions" > <p>Draw a bounding box around the {{ task.input.animal }} in the image. If there is more than one {{ task.input.animal }} per image, draw a bounding box around the largest one.</p> <p>The box should be tight around the {{ task.input.animal }} with no more than a couple of pixels of buffer around the edges.</p> <p>If the image does not contain a {{ task.input.animal }}, check the <strong> Nothing to label</strong> box. </full-instructions> <short-instructions> <p>Draw a bounding box around the {{ task.input.animal }} in each image. If there is more than one {{ task.input.animal }} per image, draw a bounding box around the largest one.</p> </short-instructions> </crowd-bounding-box> </crowd-form>

Perhatikan penggunaan kembali {{ task.input.animal }} seluruh template. Jika manifes Anda memiliki semua nama hewan yang dimulai dengan huruf kapital, Anda dapat menggunakan{{ task.input.animal | downcase }}, memasukkan salah satu filter bawaan Liquid dalam kalimat yang perlu disajikan huruf kecil.

File manifes Anda

File manifes Anda harus memberikan nilai variabel yang Anda gunakan dalam template Anda. Anda dapat melakukan beberapa transformasi data manifes Anda di Lambda pra-anotasi Anda, tetapi jika Anda tidak perlu, Anda mempertahankan risiko kesalahan yang lebih rendah dan Lambda Anda akan berjalan lebih cepat. Berikut adalah contoh file manifes untuk template.

{"source-ref": "<S3 image URI>", "animal": "horse"} {"source-ref": "<S3 image URI>", "animal" : "bird"} {"source-ref": "<S3 image URI>", "animal" : "dog"} {"source-ref": "<S3 image URI>", "animal" : "cat"}

Fungsi Lambda pra-anotasi Anda

Sebagai bagian dari pengaturan pekerjaan, sediakan AWS Lambda fungsi ARN yang dapat dipanggil untuk memproses entri manifes Anda dan meneruskannya ke mesin template.

Menamai fungsi Lambda Anda

Praktik terbaik dalam penamaan fungsi Anda adalah dengan menggunakan salah satu dari empat string berikut sebagai bagian dari nama fungsi:SageMaker,, Sagemakersagemaker, atauLabelingFunction. Ini berlaku untuk fungsi pra-anotasi dan pasca-anotasi Anda.

Saat Anda menggunakan konsol, jika Anda memiliki fungsi AWS Lambda yang dimiliki oleh akun Anda, daftar drop-down fungsi yang memenuhi persyaratan penamaan akan disediakan untuk memilih salah satu.

Dalam contoh yang sangat mendasar ini, Anda hanya melewati informasi dari manifes tanpa melakukan pemrosesan tambahan apa pun di atasnya. Contoh fungsi pra-anotasi ini ditulis untuk Python 3.7.

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

JSONObjek dari manifes Anda akan disediakan sebagai anak dari event objek. Properti di dalam taskInput objek akan tersedia sebagai variabel untuk template Anda, jadi cukup mengatur nilai taskInput to event['dataObject'] akan meneruskan semua nilai dari objek manifes Anda ke template Anda tanpa harus menyalinnya satu per satu. Jika Anda ingin mengirim lebih banyak nilai ke template, Anda dapat menambahkannya ke taskInput objek.

Fungsi Lambda pasca-anotasi Anda

Sebagai bagian dari pengaturan pekerjaan, sediakan ARN AWS Lambda fungsi yang dapat dipanggil untuk memproses data formulir ketika seorang pekerja menyelesaikan tugas. Ini bisa sesederhana atau serumit yang Anda inginkan. Jika Anda ingin melakukan konsolidasi jawaban dan penilaian saat masuk, Anda dapat menerapkan algoritma penilaian dan/atau konsolidasi pilihan Anda. Jika Anda ingin menyimpan data mentah untuk pemrosesan offline, itu adalah opsi.

Berikan izin ke Lambda pasca-anotasi Anda

Data anotasi akan berada dalam file yang ditunjuk oleh s3Uri string di payload objek. Untuk memproses anotasi saat masuk, bahkan untuk fungsi pass through sederhana, Anda perlu menetapkan S3ReadOnly akses ke Lambda Anda sehingga dapat membaca file anotasi.

Di halaman Konsol untuk membuat Lambda Anda, gulir ke panel peran Eksekusi. Pilih Buat peran baru dari satu atau beberapa templat. Beri nama peran itu. Dari drop-down Templat kebijakan, pilih izin hanya-baca objek Amazon S3. Simpan Lambda dan peran akan disimpan dan dipilih.

Contoh berikut adalah dalam Python 2.7.

import json import boto3 from urlparse import urlparse def lambda_handler(event, context): consolidated_labels = [] parsed_url = urlparse(event['payload']['s3Uri']); s3 = boto3.client('s3') textFile = s3.get_object(Bucket = parsed_url.netloc, Key = parsed_url.path[1:]) filecont = textFile['Body'].read() annotations = json.loads(filecont); for dataset in annotations: for annotation in dataset['annotations']: new_annotation = json.loads(annotation['annotationData']['content']) label = { 'datasetObjectId': dataset['datasetObjectId'], 'consolidatedAnnotation' : { 'content': { event['labelAttributeName']: { 'workerId': annotation['workerId'], 'boxesInfo': new_annotation, 'imageSource': dataset['dataObject'] } } } } consolidated_labels.append(label) return consolidated_labels

Lambda pasca-anotasi akan sering menerima kumpulan hasil tugas di objek acara. Batch itu akan menjadi payload objek yang harus diulang oleh Lambda. Apa yang Anda kirim kembali akan menjadi objek yang memenuhi APIkontrak.

Output dari pekerjaan pelabelan Anda

Anda akan menemukan output pekerjaan di folder yang dinamai setelah pekerjaan pelabelan Anda di bucket S3 target yang Anda tentukan. Ini akan berada di subfolder bernamamanifests.

Untuk tugas kotak pembatas, output yang Anda temukan di manifes keluaran akan terlihat sedikit seperti demo di bawah ini. Contoh telah dibersihkan untuk dicetak. Output aktual akan menjadi satu baris per catatan.

contoh : JSON dalam manifes keluaran Anda
{ "source-ref":"<URL>", "<label attribute name>": { "workerId":"<URL>", "imageSource":"<image URL>", "boxesInfo":"{\"boundingBox\":{\"boundingBoxes\":[{\"height\":878, \"label\":\"bird\", \"left\":208, \"top\":6, \"width\":809}], \"inputImageProperties\":{\"height\":924, \"width\":1280}}}"}, "<label attribute name>-metadata": { "type":"groundTruth/custom", "job_name":"<Labeling job name>", "human-annotated":"yes" }, "animal" : "bird" }

Perhatikan bagaimana animal atribut tambahan dari manifes asli Anda diteruskan ke manifes keluaran pada tingkat yang sama dengan data source-ref dan pelabelan. Properti apa pun dari manifes masukan Anda, apakah itu digunakan dalam template Anda atau tidak, akan diteruskan ke manifes keluaran.