Etichetarea datelor de segmentare semantică și formarea modelelor folosind Amazon SageMaker

Nodul sursă: 1551223

În viziunea computerizată, segmentarea semantică este sarcina de a clasifica fiecare pixel dintr-o imagine cu o clasă dintr-un set cunoscut de etichete, astfel încât pixelii cu aceeași etichetă să aibă anumite caracteristici. Acesta generează o mască de segmentare a imaginilor de intrare. De exemplu, următoarele imagini arată o mască de segmentare a cat eticheta.

În noiembrie 2018, Amazon SageMaker a anunțat lansarea algoritmului de segmentare semantică SageMaker. Cu acest algoritm, vă puteți antrena modelele cu un set de date public sau propriul set de date. Seturile de date de segmentare a imaginilor populare includ setul de date Common Objects in Context (COCO) și PASCAL Visual Object Classes (PASCAL VOC), dar clasele etichetelor lor sunt limitate și este posibil să doriți să antrenați un model pe obiecte țintă care nu sunt incluse în seturi de date publice. În acest caz, puteți utiliza Amazon SageMaker Ground Adevăr pentru a eticheta propriul set de date.

În această postare, demonstrez următoarele soluții:

  • Utilizarea Ground Truth pentru a eticheta un set de date de segmentare semantică
  • Transformarea rezultatelor din Ground Truth în formatul de intrare necesar pentru algoritmul de segmentare semantică încorporat SageMaker
  • Utilizarea algoritmului de segmentare semantică pentru a antrena un model și a efectua inferențe

Etichetarea datelor de segmentare semantică

Pentru a construi un model de învățare automată pentru segmentarea semantică, trebuie să etichetăm un set de date la nivel de pixel. Ground Truth vă oferă opțiunea de a utiliza adnotatori umani Amazon Mechanical Turk, furnizori terți sau forța de muncă privată. Pentru a afla mai multe despre forța de muncă, consultați Creați și gestionați forța de muncă. Dacă nu doriți să gestionați singur forța de muncă de etichetare, Amazon SageMaker Ground Truth Plus este o altă opțiune excelentă ca nou serviciu de etichetare a datelor la cheie, care vă permite să creați rapid seturi de date de instruire de înaltă calitate și reduce costurile cu până la 40%. Pentru această postare, vă arăt cum să etichetați manual setul de date cu funcția de auto-segment Ground Truth și etichetarea crowdsource cu o forță de muncă Mechanical Turk.

Etichetare manuală cu Ground Truth

În decembrie 2019, Ground Truth a adăugat o funcție de auto-segment la interfața de utilizator de etichetare cu segmentare semantică pentru a crește debitul de etichetare și pentru a îmbunătăți acuratețea. Pentru mai multe informații, consultați Segmentarea automată a obiectelor atunci când se efectuează etichetarea segmentării semantice cu Amazon SageMaker Ground Truth. Cu această nouă funcție, vă puteți accelera procesul de etichetare a sarcinilor de segmentare. În loc să desenați un poligon strâns sau să folosiți instrumentul pensulă pentru a captura un obiect într-o imagine, desenați doar patru puncte: în punctele de sus, de jos, de stânga și de dreapta ale obiectului. Ground Truth ia aceste patru puncte drept intrare și folosește algoritmul Deep Extreme Cut (DEXTR) pentru a produce o mască strânsă în jurul obiectului. Pentru un tutorial care folosește Ground Truth pentru etichetarea segmentării semantice a imaginii, consultați Segmentarea semantică a imaginii. Următorul este un exemplu despre modul în care instrumentul de auto-segmentare generează automat o mască de segmentare după ce alegeți cele patru puncte extreme ale unui obiect.

Crowdsourcing etichetare cu o forță de muncă Mechanical Turk

Dacă aveți un set de date mare și nu doriți să etichetați manual sute sau mii de imagini, puteți utiliza Mechanical Turk, care oferă o forță de muncă umană la cerere, scalabilă, pentru a finaliza sarcini pe care oamenii le pot face mai bine decât computerele. Software-ul Mechanical Turk oficializează ofertele de locuri de muncă pentru miile de lucrători dispuși să lucreze la bucată, după cum le convine. Software-ul preia și munca efectuată și o compilează pentru dvs., solicitantul, care plătește muncitorii pentru munca satisfăcătoare (doar). Pentru a începe cu Mechanical Turk, consultați Introducere în Amazon Mechanical Turk.

Creați o lucrare de etichetare

Următorul este un exemplu de sarcină de etichetare Mechanical Turk pentru un set de date privind broaștele țestoase marine. Setul de date privind țestoasele marine este din competiția Kaggle Detectarea feței țestoasei marine, și am selectat 300 de imagini ale setului de date în scop demonstrativ. Țestoasa de mare nu este o clasă comună în seturile de date publice, așa că poate reprezenta o situație care necesită etichetarea unui set de date masiv.

  1. Pe consola SageMaker, alegeți Etichetarea locurilor de muncă în panoul de navigare.
  2. Alege Creați un job de etichetare.
  3. Introduceți un nume pentru postul dvs.
  4. Pentru Configurarea datelor de intrare, Selectați Configurare automată a datelor.
    Aceasta generează un manifest de date de intrare.
  5. Pentru Locația S3 pentru seturile de date de intrare, introduceți calea pentru setul de date.
  6. Pentru Categoria de sarcini, alege Imagine.
  7. Pentru Selectarea sarcinilor, Selectați Segmentarea semantică.
  8. Pentru Tipuri de lucrători, Selectați Amazon Mechanical Turk.
  9. Configurați setările pentru expirarea sarcinii, timpul de expirare a sarcinii și prețul per sarcină.
  10. Adăugați o etichetă (pentru această postare, sea turtle) și furnizați instrucțiuni de etichetare.
  11. Alege Crea.

După ce ați configurat sarcina de etichetare, puteți verifica progresul etichetării pe consola SageMaker. Când este marcat ca finalizat, puteți alege lucrarea pentru a verifica rezultatele și a le utiliza pentru pașii următori.

Transformarea setului de date

După ce obțineți rezultatul de la Ground Truth, puteți utiliza algoritmii încorporați SageMaker pentru a antrena un model pe acest set de date. Mai întâi, trebuie să pregătiți setul de date etichetat ca interfață de intrare solicitată pentru algoritmul de segmentare semantică SageMaker.

Canale de date de intrare solicitate

Segmentarea semantică SageMaker se așteaptă ca setul dvs. de date de antrenament să fie stocat Serviciul Amazon de stocare simplă (Amazon S3). Setul de date din Amazon S3 este de așteptat să fie prezentat pe două canale, unul pentru train și unul pentru validation, folosind patru directoare, două pentru imagini și două pentru adnotări. Se așteaptă ca adnotările să fie imagini PNG necomprimate. Setul de date poate avea, de asemenea, o hartă de etichete care descrie modul în care sunt stabilite mapările adnotărilor. Dacă nu, algoritmul folosește un implicit. Pentru deducere, un punct final acceptă imagini cu un image/jpeg tipul de conținut. Următoarea este structura necesară a canalelor de date:

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

Fiecare imagine JPG din directoarele de tren și validare are o imagine de etichetă PNG corespunzătoare cu același nume în train_annotation și validation_annotation directoare. Această convenție de denumire ajută algoritmul să asocieze o etichetă cu imaginea corespunzătoare în timpul antrenamentului. Trenul, train_annotation, validare și validation_annotation canalele sunt obligatorii. Adnotările sunt imagini PNG cu un singur canal. Formatul funcționează atâta timp cât metadatele (modurile) din imagine ajută algoritmul să citească imaginile de adnotare într-un număr întreg nesemnat pe 8 biți pe un singur canal.

Ieșire din jobul de etichetare Ground Truth

Ieșirile generate din jobul de etichetare Ground Truth au următoarea structură de foldere:

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

Măștile de segmentare sunt salvate în s3://turtle2022/labelturtles/annotations/consolidated-annotation/output. Fiecare imagine de adnotare este un fișier .png numit după indexul imaginii sursă și ora la care a fost finalizată etichetarea acestei imagini. De exemplu, următoarele sunt imaginea sursă (Imagine_1.jpg) și masca sa de segmentare generate de forța de muncă din Mechanical Turk (0_2022-02-10T17:41:04.724225.png). Observați că indexul măștii este diferit de numărul din numele imaginii sursă.

Manifestul de ieșire din jobul de etichetare este în /manifests/output/output.manifest fişier. Este un fișier JSON și fiecare linie înregistrează o mapare între imaginea sursă și eticheta acesteia și alte metadate. Următoarea linie JSON înregistrează o mapare între imaginea sursă afișată și adnotarea acesteia:

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

Imaginea sursă se numește Image_1.jpg, iar numele adnotării este 0_2022-02-10T17:41: 04.724225.png. Pentru a pregăti datele ca formatele de canal de date necesare ale algoritmului de segmentare semantică SageMaker, trebuie să schimbăm numele adnotării astfel încât să aibă același nume ca și imaginile JPG sursă. Și, de asemenea, trebuie să împărțim setul de date în train și validation directoarele pentru imaginile sursă și adnotările.

Transformați rezultatul dintr-o lucrare de etichetare Ground Truth în formatul de intrare solicitat

Pentru a transforma rezultatul, parcurgeți următorii pași:

  1. Descărcați toate fișierele din jobul de etichetare de pe Amazon S3 într-un director local:
    !aws s3 cp s3://turtle2022/ Seaturtles --recursive

  2. Citiți fișierul manifest și schimbați numele adnotărilor cu aceleași nume ca și imaginile sursă:
    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. Împărțiți trenul și seturile de date de validare:
    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. Creați un director în formatul necesar pentru canalele de date ale algoritmului de segmentare semantică:
    os.chdir('./semantic_segmentation_pascalvoc_2022-01-11')
    os.mkdir('train')
    os.mkdir('validation')
    os.mkdir('train_annotation')
    os.mkdir('validation_annotation')

  5. Mutați trenul și imaginile de validare și adnotările acestora în directoarele create.
    1. Pentru imagini, utilizați următorul cod:
      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. Pentru adnotări, utilizați următorul cod:
      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. Încărcați seturile de date tren și validare și seturile de date de adnotare ale acestora pe 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

Antrenamentul modelului de segmentare semantică SageMaker

În această secțiune, parcurgem pașii pentru a vă instrui modelul de segmentare semantică.

Urmați exemplul de blocnotes și configurați canale de date

Puteți urma instrucțiunile din Algoritmul de segmentare semantică este acum disponibil în Amazon SageMaker pentru a implementa algoritmul de segmentare semantică în setul de date etichetat. Acest eșantion caiet prezintă un exemplu end-to-end de introducere a algoritmului. În blocnotes, înveți cum să antrenezi și să găzduiești un model de segmentare semantică folosind rețeaua complet convoluțională (FCN) algoritm care utilizează Setul de date Pascal VOC pentru antrenament. Deoarece nu intenționez să antrenez un model din setul de date Pascal VOC, am sărit peste Pasul 3 (pregătirea datelor) din acest notebook. În schimb, am creat direct train_channel, train_annotation_channe, validation_channel, și validation_annotation_channel folosind locațiile S3 în care mi-am stocat imaginile și adnotările:

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

Ajustați hiperparametrii pentru propriul set de date în estimatorul SageMaker

Am urmărit caietul și am creat un obiect estimator SageMaker (ss_estimator) pentru a-mi antrena algoritmul de segmentare. Un lucru pe care trebuie să îl personalizăm pentru noul set de date este ss_estimator.set_hyperparameters: trebuie să ne schimbăm num_classes=21 la num_classes=2 (turtle și background), și m-am schimbat și eu epochs=10 la epochs=30 deoarece 10 este doar pentru scopuri demonstrative. Apoi am folosit instanța p3.2xlarge pentru antrenamentul modelului prin setare instance_type="ml.p3.2xlarge". Antrenamentul a fost finalizat în 8 minute. Cel mai bun MIoU (Mean Intersection over Union) de 0.846 este atins la epoca 11 cu un pix_acc (procentul de pixeli din imaginea dvs. care sunt clasificați corect) de 0.925, care este un rezultat destul de bun pentru acest set de date mic.

Rezultatele inferenței modelului

Am găzduit modelul pe o instanță ml.c5.xlarge la preț redus:

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

În cele din urmă, am pregătit un set de testare de 10 imagini de broaște țestoasă pentru a vedea rezultatul inferenței modelului de segmentare antrenat:

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

Următoarele imagini arată rezultatele.

Măștile de segmentare ale țestoaselor marine arată precis și sunt mulțumit de acest rezultat antrenat pe un set de date de 300 de imagini etichetat de lucrătorii Mechanical Turk. De asemenea, puteți explora alte rețele disponibile, cum ar fi rețea de analiză a scenelor piramidale (PSP) or DeepLab-V3 în probă de caiet cu setul de date.

A curăța

Ștergeți punctul final când ați terminat cu el pentru a evita costurile continue:

ss_predictor.delete_endpoint()

Concluzie

În această postare, am arătat cum să personalizați etichetarea datelor de segmentare semantică și formarea modelelor folosind SageMaker. În primul rând, puteți configura o lucrare de etichetare cu instrumentul de auto-segmentare sau puteți utiliza o forță de muncă Mechanical Turk (precum și alte opțiuni). Dacă aveți mai mult de 5,000 de obiecte, puteți utiliza și etichetarea automată a datelor. Apoi transformați ieșirile din jobul dvs. de etichetare Ground Truth în formatele de intrare necesare pentru instruirea de segmentare semantică încorporată SageMaker. După aceea, puteți utiliza o instanță de calcul accelerată (cum ar fi p2 sau p3) pentru a antrena un model de segmentare semantică cu următoarele caiet și implementați modelul într-o instanță mai rentabilă (cum ar fi ml.c5.xlarge). În cele din urmă, puteți examina rezultatele inferenței din setul de date de testare cu câteva rânduri de cod.

Începeți cu segmentarea semantică SageMaker etichetarea datelor și antrenament model cu setul de date preferat!


Despre autor

Kara Yang este Data Scientist în AWS Professional Services. Este pasionată de a ajuta clienții să-și atingă obiectivele de afaceri cu serviciile cloud AWS. Ea a ajutat organizațiile să construiască soluții ML în mai multe industrii, cum ar fi producția, industria auto, sustenabilitatea mediului și industria aerospațială.

Timestamp-ul:

Mai mult de la Învățare automată AWS