Etichettatura dei dati di segmentazione semantica e training del modello utilizzando Amazon SageMaker

Nodo di origine: 1551223

Nella visione artificiale, la segmentazione semantica è il compito di classificare ogni pixel in un'immagine con una classe da un insieme noto di etichette in modo tale che i pixel con la stessa etichetta condividano determinate caratteristiche. Genera una maschera di segmentazione delle immagini di input. Ad esempio, le immagini seguenti mostrano una maschera di segmentazione di cat .

Nel mese di novembre 2018, Amazon Sage Maker ha annunciato il lancio dell'algoritmo di segmentazione semantica SageMaker. Con questo algoritmo, puoi addestrare i tuoi modelli con un set di dati pubblico o il tuo set di dati. I set di dati di segmentazione delle immagini più diffusi includono il set di dati COCO (Common Objects in Context) e le classi di oggetti visivi PASCAL (PASCAL VOC), ma le classi delle loro etichette sono limitate e potresti voler addestrare un modello su oggetti target che non sono inclusi nel set di dati pubblici. In questo caso, puoi usare Amazon SageMaker verità fondamentale per etichettare il tuo set di dati.

In questo post, mostro le seguenti soluzioni:

  • Utilizzo di Ground Truth per etichettare un set di dati di segmentazione semantica
  • Trasformare i risultati da Ground Truth nel formato di input richiesto per l'algoritmo di segmentazione semantica integrato di SageMaker
  • Utilizzo dell'algoritmo di segmentazione semantica per addestrare un modello ed eseguire l'inferenza

Etichettatura dei dati di segmentazione semantica

Per costruire un modello di apprendimento automatico per la segmentazione semantica, dobbiamo etichettare un set di dati a livello di pixel. Ground Truth ti dà la possibilità di utilizzare annotatori umani Amazon Mechanical Turk, fornitori di terze parti o la tua forza lavoro privata. Per saperne di più sulla forza lavoro, fare riferimento a Crea e gestisci la forza lavoro. Se non vuoi gestire da solo il personale addetto all'etichettatura, Amazon SageMaker Ground Truth Plus è un'altra grande opzione come nuovo servizio di etichettatura dei dati chiavi in ​​mano che consente di creare rapidamente set di dati di addestramento di alta qualità e ridurre i costi fino al 40%. Per questo post, ti mostro come etichettare manualmente il set di dati con la funzione di segmentazione automatica Ground Truth e l'etichettatura crowdsource con una forza lavoro Mechanical Turk.

Etichettatura manuale con Ground Truth

A dicembre 2019, Ground Truth ha aggiunto una funzione di segmentazione automatica all'interfaccia utente di etichettatura della segmentazione semantica per aumentare la produttività dell'etichettatura e migliorare la precisione. Per ulteriori informazioni, fare riferimento a Segmentazione automatica degli oggetti durante l'esecuzione dell'etichettatura della segmentazione semantica con Amazon SageMaker Ground Truth. Con questa nuova funzionalità, puoi accelerare il processo di etichettatura sulle attività di segmentazione. Invece di disegnare un poligono aderente o utilizzare lo strumento pennello per catturare un oggetto in un'immagine, disegna solo quattro punti: nei punti più in alto, più in basso, più a sinistra e più a destra dell'oggetto. Ground Truth prende questi quattro punti come input e utilizza l'algoritmo Deep Extreme Cut (DEXTR) per produrre una maschera aderente attorno all'oggetto. Per un tutorial sull'utilizzo di Ground Truth per l'etichettatura della segmentazione semantica delle immagini, fare riferimento a Segmentazione semantica dell'immagine. Quello che segue è un esempio di come lo strumento di segmentazione automatica genera automaticamente una maschera di segmentazione dopo aver scelto i quattro punti estremi di un oggetto.

Etichettatura in crowdsourcing con una forza lavoro Mechanical Turk

Se si dispone di un set di dati di grandi dimensioni e non si desidera etichettare manualmente centinaia o migliaia di immagini, è possibile utilizzare Mechanical Turk, che fornisce una forza lavoro umana su richiesta e scalabile per completare lavori che gli esseri umani possono svolgere meglio dei computer. Il software Mechanical Turk formalizza le offerte di lavoro alle migliaia di lavoratori disposti a svolgere un lavoro frammentario a loro piacimento. Il software recupera anche il lavoro svolto e lo compila per te, il richiedente, che paga i lavoratori per un lavoro soddisfacente (solo). Per iniziare con Mechanical Turk, fare riferimento a Introduzione ad Amazon Mechanical Turk.

Crea un lavoro di etichettatura

Quello che segue è un esempio di un lavoro di etichettatura Mechanical Turk per un set di dati di tartarughe marine. Il set di dati delle tartarughe marine proviene dalla competizione Kaggle Rilevamento facciale di tartarughe marinee ho selezionato 300 immagini del set di dati a scopo dimostrativo. La tartaruga marina non è una classe comune nei set di dati pubblici, quindi può rappresentare una situazione che richiede l'etichettatura di un enorme set di dati.

  1. Sulla console di SageMaker, scegli Lavori di etichettatura nel pannello di navigazione.
  2. Scegli Crea lavoro di etichettatura.
  3. Inserisci un nome per il tuo lavoro.
  4. Nel Impostazione dei dati di input, selezionare Configurazione automatica dei dati.
    Questo genera un manifest di dati di input.
  5. Nel Posizione S3 per i set di dati di input, immettere il percorso per il set di dati.
  6. Nel Categoria di attivitàscegli Immagine.
  7. Nel Selezione attività, selezionare Segmentazione semantica.
  8. Nel Tipi di lavoratori, selezionare Amazon Mechanical Turk.
  9. Configura le impostazioni per il timeout dell'attività, il tempo di scadenza dell'attività e il prezzo per attività.
  10. Aggiungi un'etichetta (per questo post, sea turtle), e fornire istruzioni per l'etichettatura.
  11. Scegli Creare.

Dopo aver impostato il lavoro di etichettatura, puoi controllare l'avanzamento dell'etichettatura sulla console SageMaker. Quando è contrassegnato come completato, puoi scegliere il lavoro per controllare i risultati e utilizzarli per i passaggi successivi.

Trasformazione del set di dati

Dopo aver ottenuto l'output da Ground Truth, puoi utilizzare gli algoritmi integrati di SageMaker per addestrare un modello su questo set di dati. Innanzitutto, è necessario preparare il set di dati etichettato come interfaccia di input richiesta per l'algoritmo di segmentazione semantica di SageMaker.

Canali dati di input richiesti

La segmentazione semantica di SageMaker prevede che il tuo set di dati di addestramento venga archiviato Servizio di archiviazione semplice Amazon (Amazon S3). Il set di dati in Amazon S3 dovrebbe essere presentato in due canali, uno per train e uno per validation, utilizzando quattro directory, due per le immagini e due per le annotazioni. Le annotazioni dovrebbero essere immagini PNG non compresse. Il set di dati potrebbe anche avere una mappa delle etichette che descrive come vengono stabilite le mappature delle annotazioni. In caso contrario, l'algoritmo utilizza un valore predefinito. Per inferenza, un endpoint accetta immagini con un image/jpeg tipo di contenuto. Quella che segue è la struttura richiesta dei canali dati:

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

Ogni immagine JPG nel treno e nelle directory di convalida ha un'immagine di etichetta PNG corrispondente con lo stesso nome in train_annotation ed validation_annotation directory. Questa convenzione di denominazione aiuta l'algoritmo ad associare un'etichetta all'immagine corrispondente durante l'addestramento. Il treno, train_annotation, convalida e validation_annotation i canali sono obbligatori. Le annotazioni sono immagini PNG a canale singolo. Il formato funziona fintanto che i metadati (modalità) nell'immagine aiutano l'algoritmo a leggere le immagini di annotazione in un intero senza segno a 8 bit a canale singolo.

Output dal lavoro di etichettatura Ground Truth

Gli output generati dal lavoro di etichettatura Ground Truth hanno la seguente struttura di cartelle:

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

Le maschere di segmentazione vengono salvate in s3://turtle2022/labelturtles/annotations/consolidated-annotation/output. Ogni immagine di annotazione è un file .png che prende il nome dall'indice dell'immagine di origine e dall'ora in cui l'etichettatura dell'immagine è stata completata. Ad esempio, le seguenti sono l'immagine di origine (Image_1.jpg) e la relativa maschera di segmentazione generata dalla forza lavoro di Mechanical Turk (0_2022-02-10T17:41:04.724225.png). Si noti che l'indice della maschera è diverso dal numero nel nome dell'immagine di origine.

Il manifest di output del processo di etichettatura è in /manifests/output/output.manifest file. È un file JSON e ogni riga registra una mappatura tra l'immagine di origine e la relativa etichetta e altri metadati. La seguente riga JSON registra una mappatura tra l'immagine di origine mostrata e la sua annotazione:

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

L'immagine di origine si chiama Image_1.jpg e il nome dell'annotazione è 0_2022-02-10T17:41: 04.724225.png. Per preparare i dati come formati di canale dati richiesti dell'algoritmo di segmentazione semantica di SageMaker, è necessario modificare il nome dell'annotazione in modo che abbia lo stesso nome delle immagini JPG di origine. E dobbiamo anche dividere il set di dati in train ed validation directory per le immagini sorgente e le annotazioni.

Trasforma l'output da un lavoro di etichettatura Ground Truth nel formato di input richiesto

Per trasformare l'output, completare i seguenti passaggi:

  1. Scarica tutti i file dal processo di etichettatura da Amazon S3 in una directory locale:
    !aws s3 cp s3://turtle2022/ Seaturtles --recursive

  2. Leggi il file manifest e cambia i nomi dell'annotazione con gli stessi nomi delle immagini di origine:
    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. Suddividi il treno e i set di dati di convalida:
    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 una directory nel formato richiesto per i canali dati dell'algoritmo di segmentazione semantica:
    os.chdir('./semantic_segmentation_pascalvoc_2022-01-11')
    os.mkdir('train')
    os.mkdir('validation')
    os.mkdir('train_annotation')
    os.mkdir('validation_annotation')

  5. Sposta il treno e le immagini di convalida e le relative annotazioni nelle directory create.
    1. Per le immagini, utilizzare il seguente codice:
      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. Per le annotazioni, utilizzare il codice seguente:
      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. Carica i set di dati del treno e della convalida e i relativi set di dati di annotazione su 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

Formazione del modello di segmentazione semantica di SageMaker

In questa sezione, esamineremo i passaggi per addestrare il tuo modello di segmentazione semantica.

Segui il quaderno di esempio e imposta i canali dati

Puoi seguire le istruzioni in L'algoritmo di segmentazione semantica è ora disponibile in Amazon SageMaker per implementare l'algoritmo di segmentazione semantica nel set di dati etichettato. Questo campione taccuino mostra un esempio end-to-end che introduce l'algoritmo. Nel quaderno imparerai come addestrare e ospitare un modello di segmentazione semantica utilizzando la rete completamente convoluzionale (FCN) algoritmo utilizzando il Set di dati Pascal VOC per allenamento. Poiché non ho intenzione di addestrare un modello dal set di dati Pascal VOC, ho saltato il passaggio 3 (preparazione dei dati) in questo notebook. Invece, ho creato direttamente train_channel, train_annotation_channe, validation_channele validation_annotation_channel utilizzando le posizioni S3 in cui ho archiviato le mie immagini e annotazioni:

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

Regola gli iperparametri per il tuo set di dati nello stimatore SageMaker

Ho seguito il taccuino e ho creato un oggetto estimatore SageMaker (ss_estimator) per addestrare il mio algoritmo di segmentazione. C'è una cosa che dobbiamo personalizzare per il nuovo set di dati ss_estimator.set_hyperparameters: dobbiamo cambiare num_classes=21 a num_classes=2 (turtle ed background), e ho anche cambiato epochs=10 a epochs=30 perché 10 è solo a scopo dimostrativo. Quindi ho usato l'istanza p3.2xlarge per l'addestramento del modello impostando instance_type="ml.p3.2xlarge". La formazione completata in 8 minuti. Il migliore MIoU (Mean Intersection over Union) di 0.846 si ottiene all'epoca 11 con a pix_acc (la percentuale di pixel nell'immagine che sono classificati correttamente) di 0.925, che è un risultato abbastanza buono per questo piccolo set di dati.

Risultati dell'inferenza del modello

Ho ospitato il modello su un'istanza ml.c5.xlarge a basso costo:

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

Infine, ho preparato un set di test di 10 immagini di tartarughe per vedere il risultato dell'inferenza del modello di segmentazione addestrato:

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

Le immagini seguenti mostrano i risultati.

Le maschere di segmentazione delle tartarughe marine sembrano accurate e sono contento di questo risultato addestrato su un set di dati di 300 immagini etichettato dai lavoratori di Mechanical Turk. Puoi anche esplorare altre reti disponibili come rete di analisi delle scene piramidali (PSP) or DeepLab-V3 nel quaderno di esempio con il tuo set di dati.

ripulire

Elimina l'endpoint quando hai finito per evitare di incorrere in costi continui:

ss_predictor.delete_endpoint()

Conclusione

In questo post, ho mostrato come personalizzare l'etichettatura dei dati di segmentazione semantica e l'addestramento del modello utilizzando SageMaker. Innanzitutto, puoi impostare un lavoro di etichettatura con lo strumento di segmentazione automatica o utilizzare una forza lavoro Mechanical Turk (oltre ad altre opzioni). Se hai più di 5,000 oggetti, puoi anche utilizzare l'etichettatura automatica dei dati. Quindi trasformi gli output del tuo lavoro di etichettatura Ground Truth nei formati di input richiesti per il training di segmentazione semantica integrato di SageMaker. Successivamente, puoi utilizzare un'istanza di calcolo accelerato (come p2 o p3) per addestrare un modello di segmentazione semantica con quanto segue taccuino e distribuire il modello in un'istanza più conveniente (come ml.c5.xlarge). Infine, puoi rivedere i risultati dell'inferenza sul tuo set di dati di test con poche righe di codice.

Inizia con la segmentazione semantica di SageMaker etichettatura dei dati ed modello di formazione con il tuo set di dati preferito!


L'autore

Kara Yang è un Data Scientist in AWS Professional Services. È appassionata di aiutare i clienti a raggiungere i loro obiettivi di business con i servizi cloud AWS. Ha aiutato le organizzazioni a creare soluzioni ML in diversi settori come quello manifatturiero, automobilistico, della sostenibilità ambientale e aerospaziale.

Timestamp:

Di più da Apprendimento automatico di AWS