Demo-Vorlage: Kommentieren von Bildern mit crowd-bounding-box - 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.

Demo-Vorlage: Kommentieren von Bildern mit crowd-bounding-box

Wenn Sie eine benutzerdefinierte Vorlage als Aufgabentyp in der Amazon SageMaker -Ground-Truth-Konsole verwenden möchten, erreichen Sie das Bedienfeld Benutzerdefinierte Kennzeichnungsaufgabe . Sie können aus mehreren Basisvorlagen auswählen. Die Vorlagen behandeln einige der gängigsten Aufgaben und zeigen Ihnen Beispiele, die Ihnen bei der Vorlagenerstellung für die benutzerdefinierten Kennzeichnungsaufgaben behilflich sind. Wenn Sie nicht die Konsole oder als zusätzliche Unterstützung verwenden, finden Sie unter Amazon SageMaker Ground Truth Sample Task UIs ein Repository mit Demovorlagen für eine Vielzahl von Aufgabentypen für Kennzeichnungsaufträge.

Diese Demonstration funktioniert mit der -BoundingBoxVorlage. Die Demonstration arbeitet auch mit den AWS Lambda-Funktionen, die für die Verarbeitung Ihrer Daten vor und nach der Aufgabe benötigt werden. Um im oberen Github-Repository nach Vorlagen zu suchen, die mit Ihren AWS Lambda-Funktionen funktionieren, suchen Sie in der Vorlage nach {{ task.input.<property name> }}.

Benutzerdefinierte Vorlage des Starter-Begrenzungsrahmens

Dies ist die bereitgestellte Starter-Begrenzungsrahmenvorlage.

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

Die benutzerdefinierten Vorlagen verwenden die Liquid template language (Liquid-Vorlagensprache) und jedes dieser Elemente zwischen doppelten geschweiften Klammern ist eine Variable. Die AWS Lambda-Funktion für die Vorverarbeitung sollte ein Objekt mit dem Namen taskInput bereitstellen, auf dessen Eigenschaften können Sie über {{ task.input.<property name> }} in Ihrer Vorlage zugreifen.

Ihre eigene benutzerdefinierte Vorlage eines Begrenzungsrahmens

Angenommen, Sie besitzen eine große Sammlung von Tierfotos und kennen aufgrund eines früheren Bildklassifizierungsauftrags, um welche Tierart es sich in den Bildern handelt. Sie möchten nun einen Begrenzungsrahmen darum ziehen.

Das Basisbeispiel umfasst drei Variablen: taskObject, header und labels.

Jede von ihnen wird in verschiedenen Teilen des Begrenzungsrahmens repräsentiert.

  • taskObject ist eine HTTP(S)-URL oder S3-URI für das Foto, das mit Anmerkungen versehen werden soll. Das hinzugefügte | grant_read_access ist ein Filter, der eine S3-URI in eine HTTPS-URL mit kurzlebigem Zugriff auf diese Ressource umwandelt. Wenn Sie eine HTTP(S)-URL verwenden, ist es nicht erforderlich.

  • header ist der Text oberhalb des Fotos, das gekennzeichnet werden soll, z. B. "Ziehen Sie einen Auswahlrahmen um den Vogel auf dem Foto".

  • labels ist ein Array, das als ['item1', 'item2', ...] dargestellt wird. Dies sind Kennzeichnungen, die von den Workern den verschiedenen Auswahlrahmen zugeordnet werden können, die sie ziehen. Sie können eine oder mehrere anlegen.

Jeder Variablenname stammt aus dem JSON-Objekt in der Antwort aus Ihrer Vorverarbeitung für Lambda. Die Namen oben sind lediglich vorgeschlagen. Verwenden Sie die Variablennamen, die Sie für sinnvoll halten und die die Lesbarkeit des Codes innerhalb Ihres Teams fördern.

Verwenden Sie Variablen nur bei Bedarf

Wenn sich ein Feld nicht ändert, können Sie diese Variable aus der Vorlage entfernen und sie durch diesen Text ersetzen, andernfalls müssen Sie den Text als Wert in jedem Objekt in Ihrem Manifest wiederholen.

Beispiel : Benutzerdefinierte Abschlussvorlage des Begrenzungsrahmens

Zur Vereinfachung verfügt diese Vorlage über eine Variable, eine Kennzeichnung und sehr grundlegende Anweisungen. Wenn Ihr Manifest über eine „Tier“-Eigenschaft in jedem Datenobjekt verfügt, kann dieser Wert in zwei Teilen der Vorlage wieder verwendet werden.

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

Beachten Sie die Wiederverwendung von {{ task.input.animal }} in der Vorlage. Wenn in Ihrem Manifest alle Tiernamen mit einem Großbuchstaben beginnen, könnten Sie mithilfe von {{ task.input.animal | downcase }} einen integrierten Filter von Liquid verwenden, durch den die Namen in den entsprechenden Sätzen in Kleinbuchstaben präsentiert werden.

Ihre Manifestdatei

Ihre Manifestdatei sollte die Variablenwerte bereitstellen, die Sie in Ihrer Vorlage verwenden. Sie können einige Transformationen Ihrer Manifestdaten in Ihrer Vorverarbeitung für Lambda vornehmen. Wenn dies jedoch nicht erforderlich ist, behalten Sie ein geringeres Risiko von Fehlern bei und Lambda wird schneller ausgeführt. Hier sehen Sie ein Beispiel einer Manifestdatei für die Vorlage.

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

Ihre Lambda-Funktion zur Vorverarbeitung

Im Rahmen der Auftragseinrichtung müssen Sie den ARN einer AWS Lambda-Funktion bereitstellen, der aufgerufen werden kann, um Ihre Manifesteinträge zu verarbeiten und sie an die Vorlagen-Engine zu übergeben.

Benennen Ihrer Lambda-Funktion

Eine bewährte Methode, um Ihre Funktion zu benennen, besteht darin, eine der folgenden vier Zeichenfolgen als Teil des Funktionsnamens zu verwenden: SageMaker, Sagemaker, sagemaker oder LabelingFunction. Dies gilt sowohl für Funktionen zur Vorverarbeitung und Nachbereitung.

Wenn Sie bei Verwendung der Konsole über AWS-Lambda-Funktionen verfügen, die im Besitz Ihres Kontos sind, wird eine Dropdown-Liste der Funktionen zur Auswahl bereitgestellt, die die Namensanforderungen erfüllen.

In diesem sehr einfachen Beispiel, übergeben Sie nur die Informationen aus dem Manifest, ohne zusätzliche Verarbeitung. Diese Beispielfunktion zur Vorverarbeitung wurde für Python 3.7 geschrieben.

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

Das JSON-Objekt aus Ihrem Manifest wird als untergeordnetes Element des event-Objekts bereitgestellt. Die Eigenschaften innerhalb des taskInput-Objekts können von Ihrer Vorlage als Variablen abgerufen werden. Wenn Sie einfach den Wert von taskInput auf event['dataObject'] festlegen, werden alle Werte aus Ihrem Manifestobjekt in Ihre Vorlage übertragen, ohne dass Sie sie einzeln kopieren müssen. Wenn Sie weitere Werte an die Vorlage senden möchten, können Sie sie dem taskInput-Objekt hinzufügen.

Ihre Lambda-Funktion zur Nachbereitung

Im Rahmen der Auftragseinrichtung müssen Sie den ARN einer AWS Lambda-Funktion bereitstellen, der aufgerufen werden kann, um die Formulardaten zu verarbeiten, wenn ein Worker eine Aufgabe beendet. Dies kann so einfach oder komplex sein wie Sie möchten. Wenn Sie die Antwortkonsolidierung und Bewertung bei Eingang ausführen möchten, können Sie die Bewertungs- und/oder Konsolidierungsalgorithmen Ihrer Wahl anwenden. Wenn Sie die Rohdaten für eine Offline-Verarbeitung speichern möchten, ist dies eine Option.

Bereitstellen von Berechtigungen für Lambda zur Nachbearbeitung

Die Anmerkungsdaten befinden sich in einer Datei, die durch die s3Uri-Zeichenfolge im payload-Objekt ausgewiesen wird. Um die Anmerkungen bei Eingang zu verarbeiten, auch für eine einfache Pass-Through-Funktion, müssen Sie S3ReadOnly-Zugriff für Lambda zuweisen, damit Anmerkungsdateien gelesen werden können.

Scrollen Sie auf der Konsolenseite für das Erstellen Ihres Lambdas zum Bereich Execution role (Ausführungsrolle). Wählen Sie Create a new role from one or more templates (Erstellen Sie eine neue Rolle aus einer oder mehreren Vorlagen) aus. Geben Sie der Rolle einen Namen. Wählen Sie aus der Dropdown-Liste Policy templates (Richtlinienvorlagen) die Option Amazon S3 object read-only permissions (Leseberechtigungen für Amazon S3-Objekte) aus. Speichern Sie das Lambda und die Rolle wird gespeichert und ausgewählt.

Das folgende Beispiel ist in 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

Die Nachbearbeitung für Lambda empfängt häufig Stapel mit Aufgabenergebnissen im Ereignisobjekt. Dieser Stapel ist das payload-Objekt, das Lambda durchlaufen sollte. Was Sie zurücksenden, ist ein Objekt, das den API-Vertrag erfüllt.

Die Ausgabe Ihres Kennzeichnungsauftrags

Sie finden die Ausgabe des Auftrags in einem Ordner, der nach Ihrem Kennzeichnungsauftrag im von Ihnen angegebenen S3-Ziel-Bucket benannt wurde. Er befindet sich in einem Unterordner mit dem Namen manifests.

Für einen Begrenzungsrahmenauftrag sieht die Ausgabe, die Sie im Ausgabemanifest finden, in etwa wie die Demo unten aus. Das Beispiel wurde für den Druck bereinigt. Die tatsächliche Ausgabe ist eine einzige Zeile pro Datensatz.

Beispiel : JSON in Ihrem Ausgabemanifest
{ "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" }

Beachten Sie, wie die zusätzlichen animal-Attribute aus Ihrem ursprünglichen Manifest an das Ausgabemanifest auf derselben Ebene wie source-ref und die Kennzeichnungsdaten übergeben wurden. Alle Eigenschaften aus Ihrem Input-Manifest, unabhängig davon, ob sie in Ihrer Vorlage verwendet wurden oder nicht, werden an das Ausgabemanifest übergeben.