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 in der Amazon SageMaker Ground Truth Konsole eine benutzerdefinierte Vorlage als Aufgabentyp verwenden möchten, gelangen Sie zum Aufgabenbereich Benutzerdefinierte Kennzeichnung. 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 Labeling-Aufgaben behilflich sind. Wenn Sie die Konsole nicht oder als zusätzliche Ressource verwenden, finden Sie unter Amazon SageMaker Ground Truth Sample Task UIs
Diese Demonstration funktioniert mit der BoundingBoxVorlage. Die Demonstration funktioniert auch mit den AWS Lambda Funktionen, die für die Verarbeitung Ihrer Daten vor und nach der Aufgabe erforderlich sind. Suchen Sie im obigen Github-Repository nach Vorlagen, die mit AWS Lambda Funktionen funktionieren, {{ task.input.
in der Vorlage.<property
name>
}}
Themen
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)taskInput
und auf die Eigenschaften dieses Objekts kann wie {{
task.input.<property name> }}
in Ihrer Vorlage zugegriffen werden.
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 ein HTTP (S) URL oder S3 URI für das Foto, das mit Anmerkungen versehen werden soll.| grant_read_access
Es wurde ein Filter hinzugefügt, der einen S3 URI in einen Filter HTTPS URL mit kurzlebigem Zugriff auf diese Ressource konvertiert. Wenn Sie ein HTTP (S) verwendenURL, wird es nicht benötigt.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 der Variablennamen stammt von dem JSON Objekt in der Antwort aus Ihrer Voranmerkung Lambda. Die obigen Namen werden lediglich vorgeschlagen. Verwenden Sie alle Variablennamen, die für Sie sinnvoll sind, und fördern Sie die Lesbarkeit des Codes in Ihrem Team.
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
Stellen Sie im Rahmen der Auftragseinrichtung eine AWS Lambda Funktion bereit, die ARN aufgerufen werden kann, um Ihre Manifesteinträge zu verarbeiten und sie an die Template-Engine weiterzuleiten.
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 die Konsole verwenden und AWS Lambda-Funktionen haben, die Ihrem Konto gehören, wird eine Dropdownliste mit Funktionen angezeigt, die die Benennungsanforderungen erfüllen, sodass Sie eine auswählen können.
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 event
Objekt des 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
Stellen Sie im Rahmen der Auftragseinrichtung eine AWS Lambda Funktion bereit, die ARN aufgerufen werden kann, um die Formulardaten zu verarbeiten, wenn ein Mitarbeiter eine Aufgabe erledigt. 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ückschicken, ist ein Objekt, das dem APIVertrag entspricht.
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.