Zephyrnet-logo

Semantische segmentatie van gegevenslabels en modeltraining met Amazon SageMaker

Datum:

In computervisie is semantische segmentatie de taak om elke pixel in een afbeelding te classificeren met een klasse uit een bekende set labels, zodat pixels met hetzelfde label bepaalde kenmerken delen. Het genereert een segmentatiemasker van de invoerbeelden. De volgende afbeeldingen tonen bijvoorbeeld een segmentatiemasker van de cat label.

In november 2018, Amazon Sage Maker kondigde de lancering aan van het SageMaker semantische segmentatie-algoritme. Met dit algoritme kunt u uw modellen trainen met een openbare dataset of uw eigen dataset. Populaire datasets voor beeldsegmentatie zijn de Common Objects in Context (COCO)-dataset en PASCAL Visual Object Classes (PASCAL VOC), maar de klassen van hun labels zijn beperkt en misschien wilt u een model trainen op doelobjecten die niet zijn opgenomen in de openbare datasets. In dit geval kunt u Amazon SageMaker Grondwaarheid om uw eigen dataset te labelen.

In dit bericht demonstreer ik de volgende oplossingen:

  • Ground Truth gebruiken om een ​​semantische segmentatiedataset te labelen
  • Transformeren van de resultaten van Ground Truth naar het vereiste invoerformaat voor het ingebouwde semantische segmentatie-algoritme van SageMaker
  • Het semantische segmentatie-algoritme gebruiken om een ​​model te trainen en gevolgtrekkingen uit te voeren

Semantische segmentatie data labeling

Om een ​​machine learning-model voor semantische segmentatie te bouwen, moeten we een dataset op pixelniveau labelen. Ground Truth geeft je de mogelijkheid om menselijke annotators te gebruiken via Amazon Mechanical Turk, externe leveranciers of uw eigen privépersoneel. Raadpleeg voor meer informatie over arbeidskrachten: Creëer en beheer arbeidskrachten. Als u het etiketteringspersoneel niet alleen wilt beheren, Amazon SageMaker Ground Truth Plus is een andere geweldige optie als een nieuwe kant-en-klare datalabelservice waarmee u snel hoogwaardige trainingsdatasets kunt maken en de kosten tot 40% kunt verlagen. Voor dit bericht laat ik je zien hoe je de dataset handmatig labelt met de Ground Truth auto-segment-functie en crowdsource-labeling met een Mechanical Turk-personeelsbestand.

Handmatig labelen met Ground Truth

In december 2019 heeft Ground Truth een functie voor automatisch segmenteren toegevoegd aan de gebruikersinterface voor semantische segmentatielabels om de labeldoorvoer te verhogen en de nauwkeurigheid te verbeteren. Voor meer informatie, zie: Objecten automatisch segmenteren bij het uitvoeren van semantische segmentatielabels met Amazon SageMaker Ground Truth. Met deze nieuwe functie kunt u uw labelproces voor segmentatietaken versnellen. In plaats van een strak passende polygoon te tekenen of het penseel te gebruiken om een ​​object in een afbeelding vast te leggen, tekent u slechts vier punten: op de bovenste, onderste, meest linkse en meest rechtse punten van het object. Ground Truth neemt deze vier punten als invoer en gebruikt het Deep Extreme Cut (DEXTR)-algoritme om een ​​strak passend masker rond het object te produceren. Voor een zelfstudie waarin Ground Truth wordt gebruikt voor het labelen van semantische segmentatie van afbeeldingen, raadpleegt u: Semantische segmentatie van afbeeldingen. Het volgende is een voorbeeld van hoe de automatische segmentatietool automatisch een segmentatiemasker genereert nadat u de vier uiterste punten van een object hebt gekozen.

Crowdsourcing labelen met een Mechanical Turk personeelsbestand

Als je een grote dataset hebt en je niet handmatig honderden of duizenden afbeeldingen wilt labelen, kun je Mechanical Turk gebruiken, dat on-demand, schaalbare, menselijke arbeidskrachten biedt om taken uit te voeren die mensen beter kunnen dan computers. Mechanical Turk-software formaliseert vacatures voor de duizenden werknemers die bereid zijn om op hun gemak stukje bij beetje werk te doen. De software haalt ook het uitgevoerde werk op en compileert het voor u, de aanvrager, die de werknemers betaalt voor (alleen) bevredigend werk. Om aan de slag te gaan met Mechanical Turk, zie: Inleiding tot Amazon Mechanical Turk.

Een labeltaak maken

Het volgende is een voorbeeld van een Mechanical Turk-labeltaak voor een zeeschildpaddataset. De dataset van zeeschildpadden is afkomstig van de Kaggle-competitie Gezichtsdetectie zeeschildpad, en ik selecteerde 300 afbeeldingen van de dataset voor demonstratiedoeleinden. Zeeschildpadden zijn geen veelvoorkomende klasse in openbare datasets, dus het kan een situatie vertegenwoordigen waarvoor een enorme dataset moet worden gelabeld.

  1. Kies op de SageMaker-console Labelling banen in het navigatievenster.
  2. Kies Maak labelling job.
  3. Voer een naam in voor uw taak.
  4. Voor Instellingen voor invoergegevensselecteer Geautomatiseerde gegevensconfiguratie.
    Dit genereert een manifest van invoergegevens.
  5. Voor S3-locatie voor invoergegevenssets, voer het pad voor de gegevensset in.
  6. Voor Taakcategorie, kiezen Beeld.
  7. Voor Taakselectieselecteer Semantische segmentatie.
  8. Voor Soorten werknemersselecteer Amazon Mechanical Turk.
  9. Configureer uw instellingen voor taaktime-out, taakvervaltijd en prijs per taak.
  10. Voeg een label toe (voor dit bericht, sea turtle), en geef etiketteringsinstructies.
  11. Kies creëren.

Nadat u de labeltaak hebt ingesteld, kunt u de labelvoortgang controleren op de SageMaker-console. Wanneer deze als voltooid is gemarkeerd, kunt u de taak kiezen om de resultaten te controleren en deze voor de volgende stappen te gebruiken.

Dataset transformatie

Nadat u de uitvoer van Ground Truth hebt ontvangen, kunt u de ingebouwde algoritmen van SageMaker gebruiken om een ​​model op deze dataset te trainen. Eerst moet u de gelabelde dataset voorbereiden als de gevraagde invoerinterface voor het SageMaker semantische segmentatie-algoritme.

Gevraagde invoergegevenskanalen

SageMaker semantische segmentatie verwacht dat uw trainingsdataset wordt opgeslagen op Amazon eenvoudige opslagservice (Amazon S3). De dataset in Amazon S3 zal naar verwachting in twee kanalen worden gepresenteerd, één voor train en een voor validation, met vier mappen, twee voor afbeeldingen en twee voor annotaties. Annotaties zijn naar verwachting ongecomprimeerde PNG-afbeeldingen. De dataset kan ook een labelmap hebben die beschrijft hoe de annotatietoewijzingen tot stand komen. Zo niet, dan gebruikt het algoritme een standaard. Voor gevolgtrekking accepteert een eindpunt afbeeldingen met een image/jpeg inhoudstype. Het volgende is de vereiste structuur van de datakanalen:

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

Elke JPG-afbeelding in de trein- en validatiedirectory's heeft een bijbehorende PNG-labelafbeelding met dezelfde naam in de train_annotation en validation_annotation mappen. Deze naamgevingsconventie helpt het algoritme een label te associëren met de bijbehorende afbeelding tijdens de training. De trein, train_annotation, validatie en validation_annotation zenders zijn verplicht. De annotaties zijn PNG-afbeeldingen met één kanaal. De indeling werkt zolang de metagegevens (modi) in de afbeelding het algoritme helpen de annotatieafbeeldingen te lezen in een enkelkanaals 8-bits geheel getal zonder teken.

Uitvoer van de Ground Truth-labeltaak

De uitvoer die wordt gegenereerd door de taak Ground Truth-labeling heeft de volgende mapstructuur:

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

De segmentatiemaskers worden opgeslagen in s3://turtle2022/labelturtles/annotations/consolidated-annotation/output. Elke annotatieafbeelding is een .png-bestand dat is vernoemd naar de index van de bronafbeelding en het tijdstip waarop deze afbeeldingslabels zijn voltooid. Het volgende is bijvoorbeeld de bronafbeelding (Image_1.jpg) en het segmentatiemasker dat is gegenereerd door het personeel van Mechanical Turk (0_2022-02-10T17:41:04.724225.png). Merk op dat de index van het masker anders is dan het nummer in de naam van de bronafbeelding.

Het uitvoermanifest van de labeltaak bevindt zich in de /manifests/output/output.manifest het dossier. Het is een JSON-bestand en elke regel legt een toewijzing vast tussen de bronafbeelding en het label en andere metagegevens. De volgende JSON-regel legt een toewijzing vast tussen de weergegeven bronafbeelding en de annotatie:

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

De bronafbeelding heet Image_1.jpg en de naam van de annotatie is 0_2022-02-10T17:41: 04.724225.png. Om de gegevens voor te bereiden als de vereiste gegevenskanaalindelingen van het SageMaker-algoritme voor semantische segmentatie, moeten we de annotatienaam wijzigen zodat deze dezelfde naam heeft als de bron-JPG-afbeeldingen. En we moeten de dataset ook opsplitsen in: train en validation mappen voor bronafbeeldingen en de annotaties.

Transformeer de uitvoer van een Ground Truth-labeltaak naar het gevraagde invoerformaat

Voer de volgende stappen uit om de uitvoer te transformeren:

  1. Download alle bestanden van de labeltaak van Amazon S3 naar een lokale map:
    !aws s3 cp s3://turtle2022/ Seaturtles --recursive

  2. Lees het manifestbestand en verander de namen van de annotatie in dezelfde namen als de bronafbeeldingen:
    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. Splits de trein- en validatiedatasets:
    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. Maak een directory in het vereiste formaat voor de datakanalen van het semantische segmentatie-algoritme:
    os.chdir('./semantic_segmentation_pascalvoc_2022-01-11')
    os.mkdir('train')
    os.mkdir('validation')
    os.mkdir('train_annotation')
    os.mkdir('validation_annotation')

  5. Verplaats de trein- en validatiebeelden en hun annotaties naar de aangemaakte mappen.
    1. Gebruik voor afbeeldingen de volgende 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. Gebruik voor annotaties de volgende 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. Upload de trein- en validatiedatasets en hun annotatiedatasets naar Amazon S3:
    !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

SageMaker-training voor semantisch segmentatiemodel

In deze sectie doorlopen we de stappen om uw semantisch segmentatiemodel te trainen.

Volg het voorbeeldnotitieblok en stel gegevenskanalen in

U kunt de instructies volgen in Semantic Segmentation-algoritme is nu beschikbaar in Amazon SageMaker om het semantische segmentatie-algoritme te implementeren in uw gelabelde dataset. Dit voorbeeld: notitieboekje toont een end-to-end voorbeeld waarin het algoritme wordt geïntroduceerd. In het notitieboek leert u hoe u een semantisch segmentatiemodel traint en host met behulp van het volledig convolutionele netwerk (FCN) algoritme met behulp van de Pascal VOC-gegevensset voor training. Omdat ik niet van plan ben een model uit de Pascal VOC-dataset te trainen, heb ik stap 3 (datavoorbereiding) in dit notebook overgeslagen. In plaats daarvan heb ik rechtstreeks gemaakt train_channel, train_annotation_channe, validation_channel en validation_annotation_channel met behulp van de S3-locaties waar ik mijn afbeeldingen en annotaties heb opgeslagen:

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

Pas hyperparameters aan voor uw eigen dataset in SageMaker Estimator

Ik volgde het notitieblok en maakte een SageMaker-schatterobject (ss_estimator) om mijn segmentatie-algoritme te trainen. Eén ding dat we moeten aanpassen voor de nieuwe dataset is in ss_estimator.set_hyperparameters: we moeten veranderen num_classes=21 naar num_classes=2 (turtle en background), en ik ben ook veranderd epochs=10 naar epochs=30 omdat 10 alleen voor demo-doeleinden is. Daarna gebruikte ik de p3.2xlarge-instantie voor modeltraining door in te stellen instance_type="ml.p3.2xlarge". De training was in 8 minuten afgerond. Het beste MIOU (Mean Intersection over Union) van 0.846 wordt bereikt in tijdperk 11 met a pix_acc (het percentage pixels in uw afbeelding dat correct is geclassificeerd) van 0.925, wat een redelijk goed resultaat is voor deze kleine dataset.

Model gevolgtrekking resultaten

Ik heb het model gehost op een goedkope ml.c5.xlarge-instantie:

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

Ten slotte heb ik een testset van 10 schildpaddenafbeeldingen voorbereid om het gevolgtrekkingsresultaat van het getrainde segmentatiemodel te zien:

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

De volgende afbeeldingen tonen de resultaten.

De segmentatiemaskers van de zeeschildpadden zien er nauwkeurig uit en ik ben blij met dit resultaat, getraind op een dataset van 300 afbeeldingen, gelabeld door Mechanical Turk-medewerkers. U kunt ook andere beschikbare netwerken verkennen, zoals: piramide-scène-parsing-netwerk (PSP) or DeepLab-V3 in het voorbeeldnotitieblok met uw dataset.

Opruimen

Verwijder het eindpunt wanneer u klaar bent om te voorkomen dat u doorlopende kosten maakt:

ss_predictor.delete_endpoint()

Conclusie

In dit bericht heb ik laten zien hoe u semantische segmentatiegegevenslabels en modeltraining kunt aanpassen met SageMaker. Ten eerste kunt u een labeltaak instellen met de auto-segmentatietool of een Mechanical Turk-personeelsbestand gebruiken (en andere opties). Als u meer dan 5,000 objecten heeft, kunt u ook gebruikmaken van geautomatiseerde gegevenslabeling. Vervolgens transformeert u de uitvoer van uw Ground Truth-labelingtaak naar de vereiste invoerformaten voor de ingebouwde semantische segmentatietraining van SageMaker. Daarna kunt u een versnelde computerinstantie (zoals p2 of p3) gebruiken om een ​​semantisch segmentatiemodel te trainen met het volgende notitieboekje en implementeer het model op een meer kosteneffectieve instantie (zoals ml.c5.xlarge). Ten slotte kunt u de gevolgtrekkingsresultaten op uw testdataset bekijken met een paar regels code.

Aan de slag met SageMaker semantische segmentatie data-etikettering en model opleiding met uw favoriete dataset!


Over de auteur

Kara Yang is een datawetenschapper bij AWS Professional Services. Ze is gepassioneerd om klanten te helpen hun zakelijke doelen te bereiken met AWS-cloudservices. Ze heeft organisaties geholpen bij het bouwen van ML-oplossingen in meerdere sectoren, zoals productie, auto-industrie, ecologische duurzaamheid en ruimtevaart.

spot_img

Laatste intelligentie

spot_img

Chat met ons

Hallo daar! Hoe kan ik u helpen?