Semantisk segmenteringsdatamerking og modelltrening ved hjelp av Amazon SageMaker

Kilde node: 1551223

I datasyn er semantisk segmentering oppgaven med å klassifisere hver piksel i et bilde med en klasse fra et kjent sett med etiketter slik at piksler med samme etikett deler visse egenskaper. Den genererer en segmenteringsmaske av inngangsbildene. For eksempel viser følgende bilder en segmenteringsmaske av cat merkelapp.

I november 2018, Amazon SageMaker kunngjorde lanseringen av SageMaker semantiske segmenteringsalgoritme. Med denne algoritmen kan du trene modellene dine med et offentlig datasett eller ditt eget datasett. Populære bildesegmenteringsdatasett inkluderer Common Objects in Context (COCO) datasettet og PASCAL Visual Object Classes (PASCAL VOC), men klassene til etikettene deres er begrenset, og det kan være lurt å trene en modell på målobjekter som ikke er inkludert i offentlige datasett. I dette tilfellet kan du bruke Amazon SageMaker Ground Truth for å merke ditt eget datasett.

I dette innlegget demonstrerer jeg følgende løsninger:

  • Bruke Ground Truth til å merke et semantisk segmenteringsdatasett
  • Transformere resultatene fra Ground Truth til det nødvendige inndataformatet for SageMaker innebygde semantiske segmenteringsalgoritme
  • Bruke den semantiske segmenteringsalgoritmen for å trene en modell og utføre inferens

Merking av semantisk segmenteringsdata

For å bygge en maskinlæringsmodell for semantisk segmentering, må vi merke et datasett på pikselnivå. Ground Truth gir deg muligheten til å bruke menneskelige annotatorer gjennom Amazon Mekanisk Turk, tredjepartsleverandører eller din egen private arbeidsstyrke. For å lære mer om arbeidsstyrker, se Opprett og administrer arbeidsstyrker. Hvis du ikke ønsker å administrere merkearbeidsstyrken på egen hånd, Amazon SageMaker Ground Truth Plus er et annet flott alternativ som en ny nøkkelferdig datamerkingstjeneste som lar deg lage opplæringsdatasett av høy kvalitet raskt og reduserer kostnadene med opptil 40 %. For dette innlegget viser jeg deg hvordan du manuelt merker datasettet med Ground Truth-autosegment-funksjonen og crowdsource-merking med en Mechanical Turk-arbeidsstyrke.

Manuell merking med Ground Truth

I desember 2019 la Ground Truth til en automatisk segmenteringsfunksjon til brukergrensesnittet for merking av semantisk segmentering for å øke merkinggjennomstrømningen og forbedre nøyaktigheten. For mer informasjon, se Automatisk segmentering av objekter når du utfører merking av semantisk segmentering med Amazon SageMaker Ground Truth. Med denne nye funksjonen kan du fremskynde merkeprosessen på segmenteringsoppgaver. I stedet for å tegne en tettsittende polygon eller bruke penselverktøyet til å fange et objekt i et bilde, tegner du bare fire punkter: øverst, nederst, lengst til venstre og lengst til høyre på objektet. Ground Truth tar disse fire punktene som input og bruker algoritmen Deep Extreme Cut (DEXTR) for å produsere en tettsittende maske rundt objektet. For en opplæring som bruker Ground Truth for merking av semantisk bildesegmentering, se Bilde semantisk segmentering. Følgende er et eksempel på hvordan autosegmenteringsverktøyet genererer en segmenteringsmaske automatisk etter at du har valgt de fire ytterpunktene til et objekt.

Crowdsourcing-merking med en Mechanical Turk-arbeidsstyrke

Hvis du har et stort datasett og du ikke vil manuelt merke hundrevis eller tusenvis av bilder selv, kan du bruke Mechanical Turk, som gir en etterspørsel, skalerbar, menneskelig arbeidsstyrke for å fullføre jobber som mennesker kan gjøre bedre enn datamaskiner. Mechanical Turk-programvaren formaliserer jobbtilbud til tusenvis av arbeidere som er villige til å utføre stykkevis arbeid når det passer dem. Programvaren henter også utført arbeid og kompilerer det for deg, rekvirenten, som betaler arbeiderne for tilfredsstillende arbeid (kun). For å komme i gang med Mechanical Turk, se Introduksjon til Amazon Mechanical Turk.

Opprett en merkejobb

Følgende er et eksempel på en Mechanical Turk-merkejobb for et havskilpaddedatasett. Havskilpaddedatasettet er fra Kaggle-konkurransen Ansiktsgjenkjenning for havskilpadder, og jeg valgte 300 bilder av datasettet for demonstrasjonsformål. Havskilpadde er ikke en vanlig klasse i offentlige datasett, så den kan representere en situasjon som krever merking av et massivt datasett.

  1. Velg på SageMaker-konsollen Merking jobber i navigasjonsruten.
  2. Velg Lag merkejobb.
  3. Skriv inn et navn for jobben din.
  4. Til Inndataoppsett, plukke ut Automatisert dataoppsett.
    Dette genererer et manifest av inndata.
  5. Til S3-plassering for input-datasett, skriv inn banen for datasettet.
  6. Til Oppgavekategori, velg Bilde.
  7. Til Oppgavevalg, plukke ut Semantisk segmentering.
  8. Til Arbeidertyper, plukke ut Amazon Mekanisk Turk.
  9. Konfigurer innstillingene for oppgavetidsavbrudd, oppgavens utløpstid og pris per oppgave.
  10. Legg til en etikett (for dette innlegget, sea turtle), og gi instruksjoner for merking.
  11. Velg Opprett.

Etter at du har konfigurert merkejobben, kan du sjekke merkefremdriften på SageMaker-konsollen. Når den er merket som fullført, kan du velge jobben for å sjekke resultatene og bruke dem til de neste trinnene.

Datasetttransformasjon

Etter at du har fått utdataene fra Ground Truth, kan du bruke SageMaker innebygde algoritmer for å trene en modell på dette datasettet. Først må du klargjøre det merkede datasettet som det forespurte inngangsgrensesnittet for SageMaker semantiske segmenteringsalgoritme.

Forespurte inndatakanaler

SageMaker semantisk segmentering forventer at treningsdatasettet ditt blir lagret på Amazon enkel lagringstjeneste (Amazon S3). Datasettet i Amazon S3 forventes å bli presentert i to kanaler, en for train og en for validation, bruker fire kataloger, to for bilder og to for merknader. Merknader forventes å være ukomprimerte PNG-bilder. Datasettet kan også ha et etikettkart som beskriver hvordan merknadstilordningene er etablert. Hvis ikke, bruker algoritmen en standard. For slutninger aksepterer et endepunkt bilder med en image/jpeg innholdstype. Følgende er den nødvendige strukturen til datakanalene:

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

Hvert JPG-bilde i tog- og valideringskatalogen har et tilsvarende PNG-etikettbilde med samme navn i train_annotation og validation_annotation kataloger. Denne navnekonvensjonen hjelper algoritmen med å assosiere en etikett med dens tilsvarende bilde under trening. Toget, train_annotation, validering og validation_annotation kanaler er obligatoriske. Merknadene er en-kanals PNG-bilder. Formatet fungerer så lenge metadataene (modusene) i bildet hjelper algoritmen med å lese merknadsbildene til et enkeltkanals 8-bits usignert heltall.

Utdata fra Ground Truth-merkejobben

Utdataene generert fra Ground Truth-merkejobben har følgende mappestruktur:

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

Segmenteringsmaskene er lagret i s3://turtle2022/labelturtles/annotations/consolidated-annotation/output. Hvert merknadsbilde er en .png-fil oppkalt etter indeksen til kildebildet og tidspunktet da denne bildemerkingen ble fullført. Følgende er for eksempel kildebildet (Image_1.jpg) og segmenteringsmasken generert av Mechanical Turk-arbeidsstyrken (0_2022-02-10T17:41:04.724225.png). Legg merke til at indeksen til masken er forskjellig fra tallet i kildebildenavnet.

Utdatamanifestet fra merkejobben er i /manifests/output/output.manifest fil. Det er en JSON-fil, og hver linje registrerer en tilordning mellom kildebildet og etiketten og andre metadata. Følgende JSON-linje registrerer en tilordning mellom det viste kildebildet og dets merknad:

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

Kildebildet heter Image_1.jpg, og merknadens navn er 0_2022-02-10T17:41: 04.724225.png. For å forberede dataene som de nødvendige datakanalformatene til SageMaker semantiske segmenteringsalgoritmen, må vi endre merknadsnavnet slik at det har samme navn som kilde-JPG-bildene. Og vi må også dele opp datasettet i train og validation kataloger for kildebilder og merknader.

Transform utdataene fra en Ground Truth-merkejobb til det forespurte inndataformatet

For å transformere utdataene, fullfør følgende trinn:

  1. Last ned alle filene fra merkejobben fra Amazon S3 til en lokal katalog:
    !aws s3 cp s3://turtle2022/ Seaturtles --recursive

  2. Les manifestfilen og endre navnene på merknaden til de samme navnene som kildebildene:
    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. Del opp tog- og valideringsdatasettene:
    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. Lag en katalog i det nødvendige formatet for datakanalene for semantisk segmenteringsalgoritme:
    os.chdir('./semantic_segmentation_pascalvoc_2022-01-11')
    os.mkdir('train')
    os.mkdir('validation')
    os.mkdir('train_annotation')
    os.mkdir('validation_annotation')

  5. Flytt tog- og valideringsbildene og deres merknader til de opprettede katalogene.
    1. For bilder, bruk følgende kode:
      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. For merknader, bruk følgende kode:
      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. Last opp tog- og valideringsdatasettene og deres merknadsdatasett til 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 semantisk segmenteringsmodellopplæring

I denne delen går vi gjennom trinnene for å trene din semantiske segmenteringsmodell.

Følg eksempelnotisboken og sett opp datakanaler

Du kan følge instruksjonene i Semantisk segmenteringsalgoritme er nå tilgjengelig i Amazon SageMaker for å implementere den semantiske segmenteringsalgoritmen til ditt merkede datasett. Denne prøven bærbare viser et ende-til-ende eksempel som introduserer algoritmen. I notatboken lærer du hvordan du trener og er vert for en semantisk segmenteringsmodell ved å bruke det fullstendig konvolusjonelle nettverket (FCN) algoritme som bruker Pascal VOC datasett for trening. Fordi jeg ikke planlegger å trene en modell fra Pascal VOC-datasettet, hoppet jeg over trinn 3 (dataforberedelse) i denne notatboken. I stedet opprettet jeg direkte train_channel, train_annotation_channe, validation_channelog validation_annotation_channel ved å bruke S3-stedene der jeg lagret bildene og kommentarene mine:

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

Juster hyperparametre for ditt eget datasett i SageMaker estimator

Jeg fulgte notatboken og laget et SageMaker-estimatorobjekt (ss_estimator) for å trene opp segmenteringsalgoritmen min. En ting vi må tilpasse for det nye datasettet er inne ss_estimator.set_hyperparameters: vi må endre num_classes=21 til num_classes=2 (turtle og background), og jeg endret også epochs=10 til epochs=30 fordi 10 bare er for demoformål. Deretter brukte jeg p3.2xlarge-forekomsten for modelltrening ved innstilling instance_type="ml.p3.2xlarge". Treningen ble fullført på 8 minutter. Den beste MIoU (Mean Intersection over Union) på 0.846 oppnås ved epoke 11 med en pix_acc (prosentandelen av piksler i bildet som er klassifisert riktig) på 0.925, som er et ganske bra resultat for dette lille datasettet.

Modellinferensresultater

Jeg var vert for modellen på en lavpris ml.c5.xlarge-instans:

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

Til slutt forberedte jeg et testsett med 10 skilpaddebilder for å se resultatet av den trente segmenteringsmodellen:

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

Følgende bilder viser resultatene.

Segmenteringsmaskene til havskilpaddene ser nøyaktige ut, og jeg er fornøyd med dette resultatet trent på et 300-bilders datasett merket av Mechanical Turk-arbeidere. Du kan også utforske andre tilgjengelige nettverk som f.eks pyramide-scene-parsing-nettverk (PSP) or DeepLab-V3 i eksempelnotisboken med datasettet ditt.

Rydd opp

Slett endepunktet når du er ferdig med det for å unngå å pådra deg fortsatte kostnader:

ss_predictor.delete_endpoint()

konklusjonen

I dette innlegget viste jeg hvordan du kan tilpasse merking av semantisk segmenteringsdata og modelltrening ved hjelp av SageMaker. Først kan du sette opp en merkejobb med autosegmenteringsverktøyet eller bruke en Mechanical Turk-arbeidsstyrke (samt andre alternativer). Hvis du har mer enn 5,000 objekter, kan du også bruke automatisert datamerking. Deretter transformerer du utdataene fra Ground Truth-merkejobben til de nødvendige inputformatene for SageMaker innebygde semantisk segmenteringstrening. Etter det kan du bruke en akselerert databehandlingsforekomst (som p2 eller p3) for å trene en semantisk segmenteringsmodell med følgende bærbare og distribuer modellen til en mer kostnadseffektiv instans (som ml.c5.xlarge). Til slutt kan du gjennomgå slutningsresultatene på testdatasettet ditt med noen få linjer med kode.

Kom i gang med SageMaker semantisk segmentering datamerking og modellopplæring med favorittdatasettet ditt!


om forfatteren

Kara Yang er en dataforsker i AWS Professional Services. Hun brenner for å hjelpe kunder med å nå sine forretningsmål med AWS skytjenester. Hun har hjulpet organisasjoner med å bygge ML-løsninger på tvers av flere bransjer som produksjon, bilindustri, miljømessig bærekraft og romfart.

Tidstempel:

Mer fra AWS maskinlæring