Semantische Segmentierungsdatenkennzeichnung und Modelltraining mit Amazon SageMaker

Quellknoten: 1551223

In der Computervision ist die semantische Segmentierung die Aufgabe, jedes Pixel in einem Bild mit einer Klasse aus einem bekannten Satz von Labels zu klassifizieren, sodass Pixel mit demselben Label bestimmte Eigenschaften gemeinsam haben. Es erzeugt eine Segmentierungsmaske der Eingabebilder. Die folgenden Bilder zeigen beispielsweise eine Segmentierungsmaske der cat Etikette.

Im November 2018, Amazon Sage Maker kündigte die Einführung des semantischen Segmentierungsalgorithmus SageMaker an. Mit diesem Algorithmus können Sie Ihre Modelle mit einem öffentlichen Datensatz oder Ihrem eigenen Datensatz trainieren. Beliebte Bildsegmentierungs-Datasets sind das Common Objects in Context (COCO)-Dataset und PASCAL Visual Object Classes (PASCAL VOC), aber die Klassen ihrer Bezeichnungen sind begrenzt, und Sie möchten vielleicht ein Modell mit Zielobjekten trainieren, die nicht in der enthalten sind öffentliche Datensätze. In diesem Fall können Sie verwenden Amazon Sagemaker Ground Truth um Ihren eigenen Datensatz zu beschriften.

In diesem Beitrag zeige ich die folgenden Lösungen:

  • Verwenden von Ground Truth zum Beschriften eines semantischen Segmentierungsdatensatzes
  • Transformieren der Ergebnisse von Ground Truth in das erforderliche Eingabeformat für den in SageMaker integrierten semantischen Segmentierungsalgorithmus
  • Verwenden des semantischen Segmentierungsalgorithmus zum Trainieren eines Modells und zum Durchführen von Inferenzen

Semantische Segmentierungsdatenkennzeichnung

Um ein maschinelles Lernmodell für die semantische Segmentierung zu erstellen, müssen wir einen Datensatz auf Pixelebene kennzeichnen. Ground Truth bietet Ihnen die Möglichkeit, menschliche Annotatoren zu verwenden Amazon Mechanischer Türke, Drittanbieter oder Ihre eigene private Belegschaft. Weitere Informationen zu Arbeitskräften finden Sie unter Erstellen und Verwalten von Arbeitskräften. Wenn Sie das Etikettierpersonal nicht selbst verwalten möchten, Amazon SageMaker Ground Truth Plus ist eine weitere großartige Option als neuer schlüsselfertiger Datenkennzeichnungsdienst, mit dem Sie schnell hochwertige Trainingsdatensätze erstellen und die Kosten um bis zu 40 % senken können. In diesem Beitrag zeige ich Ihnen, wie Sie den Datensatz manuell mit der automatischen Segmentierungsfunktion von Ground Truth und Crowdsource-Beschriftung mit einer Belegschaft von Mechanical Turk beschriften.

Manuelle Kennzeichnung mit Ground Truth

Im Dezember 2019 fügte Ground Truth der Benutzeroberfläche für die semantische Segmentierungskennzeichnung eine Funktion zur automatischen Segmentierung hinzu, um den Kennzeichnungsdurchsatz zu erhöhen und die Genauigkeit zu verbessern. Weitere Informationen finden Sie unter Automatische Segmentierung von Objekten bei der semantischen Segmentierungskennzeichnung mit Amazon SageMaker Ground Truth. Mit dieser neuen Funktion können Sie Ihren Kennzeichnungsprozess bei Segmentierungsaufgaben beschleunigen. Anstatt ein eng anliegendes Polygon zu zeichnen oder das Pinselwerkzeug zum Erfassen eines Objekts in einem Bild zu verwenden, zeichnen Sie nur vier Punkte: am obersten, untersten, am weitesten links und am weitesten rechts liegenden Punkt des Objekts. Ground Truth verwendet diese vier Punkte als Eingabe und verwendet den Deep Extreme Cut (DEXTR)-Algorithmus, um eine eng anliegende Maske um das Objekt herum zu erzeugen. Ein Tutorial zur Verwendung von Ground Truth für die semantische Segmentierung von Bildern finden Sie unter Semantische Bildsegmentierung. Im Folgenden sehen Sie ein Beispiel dafür, wie das Werkzeug zur automatischen Segmentierung automatisch eine Segmentierungsmaske generiert, nachdem Sie die vier Extrempunkte eines Objekts ausgewählt haben.

Crowdsourcing-Etikettierung mit einer Belegschaft von Mechanical Turk

Wenn Sie über einen großen Datensatz verfügen und nicht Hunderte oder Tausende von Bildern manuell beschriften möchten, können Sie Mechanical Turk verwenden, das eine skalierbare, menschliche Arbeitskraft auf Abruf bereitstellt, um Aufgaben zu erledigen, die Menschen besser erledigen können als Computer. Die Software von Mechanical Turk formalisiert Stellenangebote für Tausende von Arbeitnehmern, die bereit sind, nach Belieben Stückwerksarbeit zu leisten. Die Software ruft auch die geleistete Arbeit ab und stellt sie für Sie, den Anforderer, zusammen, der die Arbeiter (nur) für zufriedenstellende Arbeit bezahlt. Informationen zu den ersten Schritten mit Mechanical Turk finden Sie unter Einführung in Amazon Mechanical Turk.

Erstellen Sie einen Etikettierauftrag

Das Folgende ist ein Beispiel für einen Mechanical Turk-Beschriftungsauftrag für ein Meeresschildkröten-Dataset. Der Meeresschildkröten-Datensatz stammt vom Kaggle-Wettbewerb Meeresschildkröten-Gesichtserkennung, und ich habe 300 Bilder des Datensatzes zu Demonstrationszwecken ausgewählt. Meeresschildkröten sind keine übliche Klasse in öffentlichen Datensätzen, daher kann sie eine Situation darstellen, die die Kennzeichnung eines riesigen Datensatzes erfordert.

  1. Wählen Sie in der SageMaker-Konsole Beschriften von Jobs im Navigationsbereich.
  2. Auswählen Beschriftungsjob erstellen.
  3. Geben Sie einen Namen für Ihren Job ein.
  4. Aussichten für Eingabedaten einrichtenWählen Automatisierte Dateneinrichtung.
    Dadurch wird ein Manifest der Eingabedaten generiert.
  5. Aussichten für S3-Speicherort für Eingabedatensätze, geben Sie den Pfad für das Dataset ein.
  6. Aussichten für Aufgabenkategorie, wählen Bild.
  7. Aussichten für AufgabenauswahlWählen Semantische Segmentierung.
  8. Aussichten für ArbeitertypenWählen Amazon Mechanischer Türke.
  9. Konfigurieren Sie Ihre Einstellungen für Task-Timeout, Task-Ablaufzeit und Preis pro Task.
  10. Füge ein Label hinzu (für diesen Beitrag sea turtle) und Anweisungen zur Kennzeichnung geben.
  11. Auswählen Erstellen.

Nachdem Sie den Beschriftungsauftrag eingerichtet haben, können Sie den Beschriftungsfortschritt auf der SageMaker-Konsole überprüfen. Wenn er als abgeschlossen markiert ist, können Sie den Job auswählen, um die Ergebnisse zu überprüfen und für die nächsten Schritte zu verwenden.

Datensatztransformation

Nachdem Sie die Ausgabe von Ground Truth erhalten haben, können Sie die in SageMaker integrierten Algorithmen verwenden, um ein Modell auf diesem Datensatz zu trainieren. Zunächst müssen Sie den gekennzeichneten Datensatz als angeforderte Eingabeschnittstelle für den semantischen Segmentierungsalgorithmus von SageMaker vorbereiten.

Angeforderte Eingangsdatenkanäle

Die semantische Segmentierung von SageMaker erwartet, dass Ihr Trainingsdatensatz gespeichert wird Amazon Simple Storage-Service (Amazon S3). Der Datensatz in Amazon S3 wird voraussichtlich in zwei Kanälen präsentiert, einer für train und eine für validation, mit vier Verzeichnissen, zwei für Bilder und zwei für Anmerkungen. Anmerkungen werden als unkomprimierte PNG-Bilder erwartet. Das Dataset kann auch eine Beschriftungszuordnung enthalten, die beschreibt, wie die Annotationszuordnungen erstellt werden. Wenn nicht, verwendet der Algorithmus einen Standardwert. Für Rückschlüsse akzeptiert ein Endpunkt Bilder mit einem image/jpeg Inhaltstyp. Folgender Aufbau ist für die Datenkanäle erforderlich:

s3://bucket_name |- train | - image1.jpg | - image2.jpg |- validation | - image3.jpg | - image4.jpg |- train_annotation | - image1.png | - image2.png |- validation_annotation | - image3.png | - image4.png |- label_map | - train_label_map.json | - validation_label_map.json

Jedes JPG-Bild in den Zug- und Validierungsverzeichnissen hat ein entsprechendes PNG-Etikettenbild mit demselben Namen in der train_annotation und validation_annotation Verzeichnisse. Diese Namenskonvention hilft dem Algorithmus, während des Trainings eine Bezeichnung mit dem entsprechenden Bild zu verknüpfen. Der Zug, train_annotation, Bestätigung und validation_annotation Kanäle sind obligatorisch. Die Anmerkungen sind Einkanal-PNG-Bilder. Das Format funktioniert, solange die Metadaten (Modi) im Bild dem Algorithmus helfen, die Anmerkungsbilder in eine einkanalige 8-Bit-Ganzzahl ohne Vorzeichen zu lesen.

Ausgabe des Ground-Truth-Labeling-Jobs

Die vom Ground-Truth-Labeling-Job generierten Ausgaben haben die folgende Ordnerstruktur:

s3://turtle2022/labelturtles/ |- activelearning |- annotation-tool |- annotations | - consolidated-annotation | - consolidation-request | - consolidation-response | - output | -0_2022-02-10T17:40:03.294994.png | -0_2022-02-10T17:41:04.530266.png | - intermediate | - worker-response |- intermediate |- manifests | - output | - output.manifest

Die Segmentierungsmasken werden gespeichert s3://turtle2022/labelturtles/annotations/consolidated-annotation/output. Jedes Anmerkungsbild ist eine .png-Datei, die nach dem Index des Quellbilds und dem Zeitpunkt benannt ist, zu dem diese Bildkennzeichnung abgeschlossen wurde. Im Folgenden sehen Sie beispielsweise das Quellbild (Image_1.jpg) und seine Segmentierungsmaske, die von den Mitarbeitern von Mechanical Turk erstellt wurden (0_2022-02-10T17:41:04.724225.png). Beachten Sie, dass sich der Index der Maske von der Nummer im Quellbildnamen unterscheidet.

Das Ausgabemanifest des Beschriftungsauftrags befindet sich in der /manifests/output/output.manifest Datei. Es ist eine JSON-Datei, und jede Zeile zeichnet eine Zuordnung zwischen dem Quellbild und seinem Etikett und anderen Metadaten auf. Die folgende JSON-Zeile zeichnet eine Zuordnung zwischen dem angezeigten Quellbild und seiner Anmerkung auf:

{"source-ref":"s3://turtle2022/Image_1.jpg","labelturtles-ref":"s3://turtle2022/labelturtles/annotations/consolidated-annotation/output/0_2022-02-10T17:41:04.724225.png","labelturtles-ref-metadata":{"internal-color-map":{"0":{"class-name":"BACKGROUND","hex-color":"#ffffff","confidence":0.25988},"1":{"class-name":"Turtle","hex-color":"#2ca02c","confidence":0.25988}},"type":"groundtruth/semantic-segmentation","human-annotated":"yes","creation-date":"2022-02-10T17:41:04.801793","job-name":"labeling-job/labelturtles"}}

Das Quellbild heißt Image_1.jpg und der Name der Anmerkung lautet 0_2022-02-10T17:41:04.724225.png. Um die Daten als die erforderlichen Datenkanalformate des semantischen Segmentierungsalgorithmus von SageMaker vorzubereiten, müssen wir den Anmerkungsnamen ändern, sodass er den gleichen Namen wie die JPG-Quellbilder hat. Und wir müssen den Datensatz auch aufteilen in train und validation Verzeichnisse für Quellbilder und die Anmerkungen.

Wandeln Sie die Ausgabe eines Ground Truth-Etikettierungsauftrags in das angeforderte Eingabeformat um

Führen Sie die folgenden Schritte aus, um die Ausgabe umzuwandeln:

  1. Laden Sie alle Dateien aus dem Etikettierungsauftrag von Amazon S3 in ein lokales Verzeichnis herunter:
    !aws s3 cp s3://turtle2022/ Seaturtles --recursive

  2. Lesen Sie die Manifestdatei und ändern Sie die Namen der Anmerkungen in dieselben Namen wie die Quellbilder:
    import os
    import re label_job='labelturtles'
    manifest_path=dir_name+'/'+label_job+'/'+'manifests/output/output.manifest' file = open(manifest_path, "r") txt=file.readlines()
    output_path=dir_name+'/'+label_job+'/'+'annotations/consolidated-annotation/output'
    S3_name='turtle2022/'
    im_list=[]
    for i in range(len(txt)): string = txt[i] try: im_name = re.search(S3_name+'(.+)'+'.jpg', string).group(1) print(im_name) im_png=im_name+'.png' im_list.append(im_name) annotation_name = re.search('output/(.+?)"', string).group(1) os.rename(annotation_name, im_png) except AttributeError: pass

  3. Teilen Sie die Zug- und Validierungsdatensätze auf:
    import numpy as np
    from random import sample # Prints list of random items of given length
    train_num=len(im_list)*0.8
    test_num=len(im_list)*0.2
    train_name=sample(im_list,int(train_num))
    test_name = list(set(im_list) - set(train_name))

  4. Erstellen Sie ein Verzeichnis im erforderlichen Format für die Datenkanäle des semantischen Segmentierungsalgorithmus:
    os.chdir('./semantic_segmentation_pascalvoc_2022-01-11')
    os.mkdir('train')
    os.mkdir('validation')
    os.mkdir('train_annotation')
    os.mkdir('validation_annotation')

  5. Verschieben Sie die Zug- und Validierungsbilder und ihre Anmerkungen in die erstellten Verzeichnisse.
    1. Verwenden Sie für Bilder den folgenden Code:
      for i in range(len(train_name)): train_im=train_name[i]+'.jpg' train_im_path=dir_name+'/'+train_im train_new_path='train/'+train_im shutil.move(train_im_path,train_new_path) train_annotation=train_name[i]+'.png' train_annotation_path=dir_name+'/labelturtles/annotations/consolidated-annotation/output/'+train_annotation train_annotation_new_path='train_annotation/'+train_annotation shutil.move(train_annotation_path,train_annotation_new_path)

    2. Verwenden Sie für Anmerkungen den folgenden Code:
      for i in range(len(test_name)): val_im=test_name[i]+'.jpg' val_im_path=dir_name+'/'+val_im val_new_path='validation/'+val_im shutil.move(val_im_path,val_new_path) val_annotation=test_name[i]+'.png' val_annotation_path=dir_name+'/labelturtles/annotations/consolidated-annotation/output/'+val_annotation val_annotation_new_path='validation_annotationT/'+val_annotation shutil.move(val_annotation_path,val_annotation_new_path)

  6. Laden Sie die Zug- und Validierungsdatensätze und ihre Anmerkungsdatensätze in Amazon S3 hoch:
    !aws s3 cp train s3://turtle2022/train/ --recursive
    !aws s3 cp train_annotation s3://turtle2022/train_annotation/ --recursive
    !aws s3 cp validation s3://turtle2022/validation/ --recursive
    !aws s3 cp validation_annotation s3://turtle2022/validation_annotation/ --recursive

Schulung des semantischen Segmentierungsmodells von SageMaker

In diesem Abschnitt gehen wir durch die Schritte zum Trainieren Ihres semantischen Segmentierungsmodells.

Folgen Sie dem Beispielnotebook und richten Sie Datenkanäle ein

Sie können den Anweisungen in folgen Der semantische Segmentierungsalgorithmus ist jetzt in Amazon SageMaker verfügbar um den semantischen Segmentierungsalgorithmus in Ihrem beschrifteten Datensatz zu implementieren. Diese Probe Notizbuch zeigt ein End-to-End-Beispiel zur Einführung des Algorithmus. Im Notebook erfahren Sie, wie Sie ein semantisches Segmentierungsmodell mithilfe des vollständig konvolutionellen Netzwerks trainieren und hosten (FCN) Algorithmus mit dem Pascal VOC-Datensatz für das Training. Da ich nicht vorhabe, ein Modell aus dem Pascal-VOC-Datensatz zu trainieren, habe ich Schritt 3 (Datenvorbereitung) in diesem Notebook übersprungen. Stattdessen habe ich direkt erstellt train_channel, train_annotation_channe, validation_channel und validation_annotation_channel Verwenden der S3-Speicherorte, an denen ich meine Bilder und Anmerkungen gespeichert habe:

Train_channel=’s3://turtle2022/train’
train_annotation_channel=’s3://turtle2022/train_annotation’
validation_channel=’s3://turtle2022/validation’
validation_annotation_channel=’s3://turtle2022/validation_annotation’

Passen Sie Hyperparameter für Ihren eigenen Datensatz im SageMaker-Schätzer an

Ich folgte dem Notizbuch und erstellte ein SageMaker-Estimator-Objekt (ss_estimator), um meinen Segmentierungsalgorithmus zu trainieren. Eine Sache, die wir für das neue Dataset anpassen müssen, ist in ss_estimator.set_hyperparameters: Wir müssen uns ändern num_classes=21 zu num_classes=2 (turtle und background), und ich habe mich auch verändert epochs=10 zu epochs=30 weil 10 nur für Demozwecke ist. Dann habe ich die p3.2xlarge-Instanz für das Modelltraining per Einstellung verwendet instance_type="ml.p3.2xlarge". Das Training war in 8 Minuten abgeschlossen. Der beste MioU (Mean Intersection over Union) von 0.846 wird bei Epoche 11 mit a erreicht pix_acc (der Prozentsatz der korrekt klassifizierten Pixel in Ihrem Bild) von 0.925, was für diesen kleinen Datensatz ein ziemlich gutes Ergebnis ist.

Ergebnisse der Modellinferenz

Ich habe das Modell auf einer kostengünstigen ml.c5.xlarge-Instanz gehostet:

training_job_name = 'ss-notebook-demo-2022-02-12-03-37-27-151'
ss_estimator = sagemaker.estimator.Estimator.attach(training_job_name)
ss_predictor = ss_estimator.deploy(initial_instance_count=1, instance_type="ml.c5.xlarge")

Schließlich habe ich einen Testsatz von 10 Schildkrötenbildern vorbereitet, um das Inferenzergebnis des trainierten Segmentierungsmodells zu sehen:

import os path = "testturtle/"
img_path_list=[]
files = os.listdir(path) for file in files: if file.endswith(('.jpg', '.png', 'jpeg')): img_path = path + file img_path_list.append(img_path) colnum=5
fig, axs = plt.subplots(2, colnum, figsize=(20, 10)) for i in range(len(img_path_list)): print(img_path_list[i]) img = mpimg.imread(img_path_list[i]) with open(img_path_list[i], "rb") as imfile: imbytes = imfile.read() cls_mask = ss_predictor.predict(imbytes) axs[int(i/colnum),i%colnum].imshow(img, cmap='gray') axs[int(i/colnum),i%colnum].imshow(np.ma.masked_equal(cls_mask,0), cmap='jet', alpha=0.8) plt.show()

Die folgenden Bilder zeigen die Ergebnisse.

Die Segmentierungsmasken der Meeresschildkröten sehen genau aus und ich bin zufrieden mit diesem Ergebnis, das auf einem 300-Bild-Datensatz trainiert wurde, der von Mechanical Turk-Mitarbeitern beschriftet wurde. Sie können auch andere verfügbare Netzwerke wie z Pyramid-Scene-Parsing-Netzwerk (PSP) or DeepLab-V3 im Beispielnotebook mit Ihrem Datensatz.

Aufräumen

Löschen Sie den Endpunkt, wenn Sie damit fertig sind, um weitere Kosten zu vermeiden:

ss_predictor.delete_endpoint()

Zusammenfassung

In diesem Beitrag habe ich gezeigt, wie Sie die semantische Segmentierungsdatenkennzeichnung und das Modelltraining mit SageMaker anpassen können. Zunächst können Sie einen Etikettierungsauftrag mit dem Autosegmentierungstool einrichten oder eine Mechanical Turk-Arbeitskraft (sowie andere Optionen) verwenden. Bei mehr als 5,000 Objekten können Sie auch die automatisierte Datenkennzeichnung nutzen. Anschließend wandeln Sie die Ausgaben Ihres Ground Truth-Labeling-Jobs in die erforderlichen Eingabeformate für das in SageMaker integrierte semantische Segmentierungstraining um. Danach können Sie eine beschleunigte Recheninstanz (z. B. p2 oder p3) verwenden, um ein semantisches Segmentierungsmodell mit dem Folgenden zu trainieren Notizbuch und stellen Sie das Modell in einer kostengünstigeren Instanz (z. B. ml.c5.xlarge) bereit. Schließlich können Sie die Inferenzergebnisse in Ihrem Testdatensatz mit ein paar Zeilen Code überprüfen.

Beginnen Sie mit der semantischen Segmentierung von SageMaker Datenkennzeichnung und Modelltraining mit Ihrem Lieblingsdatensatz!


Über den Autor

Kara Yang ist Data Scientist bei AWS Professional Services. Sie ist leidenschaftlich daran interessiert, Kunden dabei zu helfen, ihre Geschäftsziele mit AWS-Cloud-Services zu erreichen. Sie hat Organisationen dabei geholfen, ML-Lösungen in verschiedenen Branchen wie Fertigung, Automobil, ökologische Nachhaltigkeit und Luft- und Raumfahrt zu entwickeln.

Zeitstempel:

Mehr von AWS Maschinelles Lernen