Segmentacja semantyczna, etykietowanie danych i trenowanie modeli za pomocą Amazon SageMaker

Węzeł źródłowy: 1551223

W wizji komputerowej segmentacja semantyczna polega na zaklasyfikowaniu każdego piksela na obrazie do klasy ze znanego zestawu etykiet, tak aby piksele o tej samej etykiecie miały pewne cechy. Generuje maskę segmentacji obrazów wejściowych. Na przykład poniższe obrazy przedstawiają maskę segmentacji cat etykieta.

W listopadzie 2018, Amazon Sage Maker ogłosił uruchomienie algorytmu segmentacji semantycznej SageMaker. Za pomocą tego algorytmu możesz trenować swoje modele za pomocą publicznego zestawu danych lub własnego zestawu danych. Popularne zestawy danych segmentacji obrazów obejmują zestaw danych Common Objects in Context (COCO) i PASCAL Visual Object Classes (PASCAL VOC), ale klasy ich etykiet są ograniczone i możesz chcieć trenować model na obiektach docelowych, które nie są uwzględnione w publiczne zbiory danych. W takim przypadku możesz użyć Amazon SageMaker Ground Prawda oznaczyć własny zbiór danych.

W tym poście przedstawiam następujące rozwiązania:

  • Używanie Ground Truth do oznaczania zbioru danych segmentacji semantycznej
  • Przekształcenie wyników z Ground Truth do wymaganego formatu wejściowego dla wbudowanego algorytmu segmentacji semantycznej SageMaker
  • Używanie algorytmu segmentacji semantycznej do trenowania modelu i przeprowadzania wnioskowania

Oznaczanie danych segmentacji semantycznej

Aby zbudować model uczenia maszynowego do segmentacji semantycznej, musimy oznaczyć zbiór danych na poziomie piksela. Ground Truth daje możliwość korzystania z ludzkich adnotatorów poprzez Amazon Mechanical Turk, zewnętrzni dostawcy lub własna prywatna siła robocza. Aby dowiedzieć się więcej o pracownikach, zapoznaj się z Twórz siły robocze i zarządzaj nimi. Jeśli nie chcesz samodzielnie zarządzać personelem zajmującym się etykietowaniem, Amazon SageMaker Ground Truth Plus to kolejna świetna opcja jako nowa usługa etykietowania danych „pod klucz”, która umożliwia szybkie tworzenie wysokiej jakości zestawów danych szkoleniowych i zmniejsza koszty nawet o 40%. W tym poście pokazuję, jak ręcznie oznaczyć zestaw danych za pomocą funkcji automatycznego segmentowania Ground Truth i etykietowania crowdsource z siłą roboczą Mechanical Turk.

Ręczne etykietowanie z Ground Truth

W grudniu 2019 r. Ground Truth dodał funkcję automatycznego segmentowania do interfejsu użytkownika etykietowania z segmentacją semantyczną, aby zwiększyć przepustowość etykietowania i poprawić dokładność. Aby uzyskać więcej informacji, zobacz Automatyczna segmentacja obiektów podczas wykonywania etykietowania segmentacji semantycznej za pomocą Amazon SageMaker Ground Truth. Dzięki tej nowej funkcji możesz przyspieszyć proces etykietowania zadań segmentacji. Zamiast rysować ciasno dopasowany wielokąt lub używać narzędzia pędzla do uchwycenia obiektu na obrazie, rysujesz tylko cztery punkty: w najwyższym, najniższym, lewym i prawym punkcie obiektu. Ground Truth przyjmuje te cztery punkty jako dane wejściowe i wykorzystuje algorytm Deep Extreme Cut (DEXTR) do utworzenia ściśle dopasowanej maski wokół obiektu. Aby zapoznać się z samouczkiem dotyczącym używania Ground Truth do oznaczania semantycznej segmentacji obrazu, zobacz Segmentacja semantyczna obrazu. Poniżej znajduje się przykład tego, jak narzędzie automatycznej segmentacji automatycznie generuje maskę segmentacji po wybraniu czterech skrajnych punktów obiektu.

Etykietowanie crowdsourcingowe z siłą roboczą Mechanical Turk

Jeśli masz duży zestaw danych i nie chcesz samodzielnie etykietować setek lub tysięcy obrazów, możesz użyć Mechanical Turk, który zapewnia skalowalną, ludzką siłę roboczą na żądanie do wykonywania zadań, które ludzie mogą wykonywać lepiej niż komputery. Oprogramowanie Mechanical Turk formalizuje oferty pracy dla tysięcy pracowników, którzy chcą wykonywać pracę fragmentaryczną w dogodnym dla nich czasie. Oprogramowanie pobiera również wykonaną pracę i kompiluje ją dla Ciebie, wnioskodawcy, który płaci pracownikom za satysfakcjonującą pracę (tylko). Aby rozpocząć korzystanie z Mechanical Turk, zapoznaj się z Wprowadzenie do Amazon Mechanical Turk.

Utwórz zadanie etykietowania

Poniżej znajduje się przykład zadania etykietowania Mechanical Turk dla zestawu danych żółwia morskiego. Zbiór danych o żółwiach morskich pochodzi z konkursu Kaggle Wykrywanie twarzy żółwia morskiegoi wybrałem 300 obrazów zestawu danych do celów demonstracyjnych. Żółw morski nie jest powszechną klasą w publicznych zbiorach danych, więc może reprezentować sytuację, która wymaga etykietowania ogromnego zbioru danych.

  1. W konsoli SageMaker wybierz Etykietowanie zadań w okienku nawigacji.
  2. Dodaj Utwórz zadanie etykietowania.
  3. Wpisz nazwę swojej pracy.
  4. W razie zamówieenia projektu Konfiguracja danych wejściowych, Wybierz Zautomatyzowana konfiguracja danych.
    To generuje manifest danych wejściowych.
  5. W razie zamówieenia projektu Lokalizacja S3 dla wejściowych zestawów danych, wprowadź ścieżkę do zbioru danych.
  6. W razie zamówieenia projektu Kategoria zadaniawybierz Obraz.
  7. W razie zamówieenia projektu Wybór zadań, Wybierz Segmentacja semantyczna.
  8. W razie zamówieenia projektu Rodzaje pracowników, Wybierz Amazon Mechanical Turk.
  9. Skonfiguruj ustawienia dotyczące limitu czasu zadania, czasu wygaśnięcia zadania i ceny za zadanie.
  10. Dodaj etykietę (dla tego posta sea turtle) i podać instrukcje dotyczące etykietowania.
  11. Dodaj Stwórz.

Po skonfigurowaniu zadania etykietowania możesz sprawdzić postęp etykietowania w konsoli SageMaker. Gdy zostanie oznaczony jako ukończony, możesz wybrać zadanie, aby sprawdzić wyniki i wykorzystać je w kolejnych krokach.

Transformacja zbioru danych

Po uzyskaniu danych wyjściowych z Ground Truth możesz użyć wbudowanych algorytmów programu SageMaker do trenowania modelu na tym zestawie danych. Najpierw musisz przygotować oznaczony zestaw danych jako żądany interfejs wejściowy dla algorytmu segmentacji semantycznej SageMaker.

Żądane kanały danych wejściowych

Semantyczna segmentacja SageMaker oczekuje, że Twój zestaw danych treningowych będzie przechowywany na Usługa Amazon Simple Storage (Amazonka S3). Oczekuje się, że zbiór danych w Amazon S3 będzie prezentowany w dwóch kanałach, jeden dla train i jeden dla validation, używając czterech katalogów, dwóch dla obrazów i dwóch dla adnotacji. Oczekuje się, że adnotacje będą nieskompresowanymi obrazami PNG. Zestaw danych może również zawierać mapę etykiet opisującą sposób tworzenia mapowań adnotacji. Jeśli nie, algorytm używa wartości domyślnej. Na potrzeby wnioskowania punkt końcowy akceptuje obrazy z image/jpeg Typ zawartości. Poniżej przedstawiono wymaganą strukturę kanałów danych:

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

Każdy obraz JPG w katalogach pociągu i walidacji ma odpowiedni obraz etykiety PNG o tej samej nazwie w train_annotation i validation_annotation katalogi. Ta konwencja nazewnictwa pomaga algorytmowi powiązać etykietę z odpowiadającym jej obrazem podczas uczenia. Pociąg, train_annotation, walidacja i validation_annotation kanały są obowiązkowe. Adnotacje to jednokanałowe obrazy PNG. Format działa tak długo, jak metadane (tryby) w obrazie pomagają algorytmowi odczytać obrazy adnotacji do jednokanałowej 8-bitowej liczby całkowitej bez znaku.

Dane wyjściowe z zadania etykietowania Ground Truth

Dane wyjściowe wygenerowane z zadania etykietowania Ground Truth mają następującą strukturę folderów:

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

Maski segmentacyjne są zapisywane w s3://turtle2022/labelturtles/annotations/consolidated-annotation/output. Każdy obraz adnotacji to plik .png nazwany na podstawie indeksu obrazu źródłowego i czasu zakończenia oznaczania tego obrazu. Na przykład poniżej znajduje się obraz źródłowy (Image_1.jpg) i jego maska ​​segmentacji wygenerowana przez pracowników Mechanical Turk (0_2022-02-10T17:41:04.724225.png). Zauważ, że indeks maski jest inny niż numer w nazwie obrazu źródłowego.

Manifest wyjściowy z zadania etykietowania znajduje się w /manifests/output/output.manifest plik. Jest to plik JSON, a każdy wiersz rejestruje mapowanie między obrazem źródłowym a jego etykietą i innymi metadanymi. Poniższy wiersz JSON rejestruje mapowanie między pokazanym obrazem źródłowym a jego adnotacją:

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

Obraz źródłowy nazywa się Image_1.jpg, a nazwa adnotacji to 0_2022-02-10T17:41: 04.724225.png. Aby przygotować dane jako wymagane formaty kanałów danych algorytmu segmentacji semantycznej SageMaker, musimy zmienić nazwę adnotacji tak, aby miała taką samą nazwę jak źródłowe obrazy JPG. Musimy też podzielić zbiór danych na train i validation katalogi dla obrazów źródłowych i adnotacji.

Przekształć dane wyjściowe z zadania etykietowania Ground Truth na żądany format wejściowy

Aby przekształcić dane wyjściowe, wykonaj następujące czynności:

  1. Pobierz wszystkie pliki z zadania etykietowania z Amazon S3 do katalogu lokalnego:
    !aws s3 cp s3://turtle2022/ Seaturtles --recursive

  2. Przeczytaj plik manifestu i zmień nazwy adnotacji na takie same, jak w przypadku obrazów źródłowych:
    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. Podziel zestawy danych pociągu i walidacji:
    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. Utwórz katalog w wymaganym formacie dla kanałów danych algorytmu segmentacji semantycznej:
    os.chdir('./semantic_segmentation_pascalvoc_2022-01-11')
    os.mkdir('train')
    os.mkdir('validation')
    os.mkdir('train_annotation')
    os.mkdir('validation_annotation')

  5. Przenieś obrazy pociągu i walidacji oraz ich adnotacje do utworzonych katalogów.
    1. W przypadku obrazów użyj następującego kodu:
      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. W przypadku adnotacji użyj następującego kodu:
      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. Prześlij zestawy danych pociągów i walidacji oraz ich zestawy danych adnotacji do 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

Trening modelu segmentacji semantycznej SageMaker

W tej sekcji omówimy etapy szkolenia modelu segmentacji semantycznej.

Postępuj zgodnie z przykładowym notatnikiem i skonfiguruj kanały danych

Możesz postępować zgodnie z instrukcjami w Algorytm segmentacji semantycznej jest teraz dostępny w Amazon SageMaker aby zaimplementować algorytm segmentacji semantycznej w oznaczonym zbiorze danych. Ta próbka notatnik pokazuje kompletny przykład wprowadzający algorytm. W zeszycie dowiesz się, jak trenować i hostować model segmentacji semantycznej przy użyciu w pełni splotowej sieci (FCN) algorytm wykorzystujący Zbiór danych Pascal VOC na trening. Ponieważ nie planuję trenować modelu z zestawu danych Pascal VOC, pominąłem krok 3 (przygotowanie danych) w tym notatniku. Zamiast tego stworzyłem bezpośrednio train_channel, train_annotation_channe, validation_channel, validation_annotation_channel przy użyciu lokalizacji S3, w których przechowywałem moje obrazy i adnotacje:

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

Dostosuj hiperparametry do własnego zestawu danych w estymatorze SageMaker

Śledziłem notatnik i utworzyłem obiekt estymatora SageMaker (ss_estimator) do trenowania mojego algorytmu segmentacji. Jedną z rzeczy, które musimy dostosować do nowego zestawu danych, jest ss_estimator.set_hyperparameters: musimy się zmienić num_classes=21 do num_classes=2 (turtle i background) i ja też się zmieniłam epochs=10 do epochs=30 ponieważ 10 służy tylko do celów demonstracyjnych. Następnie użyłem instancji p3.2xlarge do trenowania modelu poprzez ustawienie instance_type="ml.p3.2xlarge". Szkolenie ukończone w 8 minut. Najlepsze MIoU (Mean Intersection over Union) 0.846 osiąga się w epoce 11 z a pix_acc (odsetek pikseli w obrazie, które są prawidłowo sklasyfikowane) 0.925, co jest całkiem dobrym wynikiem dla tego małego zbioru danych.

Wyniki wnioskowania modelowego

Hostowałem model na taniej instancji ml.c5.xlarge:

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

Na koniec przygotowałem zestaw testowy 10 obrazów żółwi, aby zobaczyć wynik wnioskowania wytrenowanego modelu segmentacji:

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

Poniższe obrazy przedstawiają wyniki.

Maski segmentacyjne żółwi morskich wyglądają dokładnie i jestem zadowolony z tego wyniku przeszkolonego na 300-obrazowym zbiorze danych oznaczonym przez pracowników Mechanical Turk. Możesz także zapoznać się z innymi dostępnymi sieciami, takimi jak sieć analizująca sceny piramidowe (PSP) or DeepLab-V3 w przykładowym notesie z zestawem danych.

Sprzątać

Po zakończeniu usuń punkt końcowy, aby uniknąć ponoszenia dalszych kosztów:

ss_predictor.delete_endpoint()

Wnioski

W tym poście pokazałem, jak dostosować etykietowanie danych segmentacji semantycznej i trenowanie modeli za pomocą SageMaker. Po pierwsze, możesz skonfigurować zadanie etykietowania za pomocą narzędzia do automatycznej segmentacji lub użyć siły roboczej Mechanical Turk (a także innych opcji). Jeśli masz więcej niż 5,000 obiektów, możesz również użyć automatycznego oznaczania danych. Następnie przekształcasz dane wyjściowe z zadania etykietowania Ground Truth na wymagane formaty wejściowe dla wbudowanego szkolenia segmentacji semantycznej SageMaker. Następnie możesz użyć instancji przyspieszonego przetwarzania (takiej jak p2 lub p3), aby wytrenować model segmentacji semantycznej z następującymi notatnik i wdróż model w bardziej opłacalnym wystąpieniu (takim jak ml.c5.xlarge). Na koniec możesz przejrzeć wyniki wnioskowania w testowym zestawie danych za pomocą kilku wierszy kodu.

Zacznij korzystać z segmentacji semantycznej SageMaker etykietowanie danych i model szkolenia z Twoim ulubionym zbiorem danych!


O autorze

Kary Yang jest analitykiem danych w AWS Professional Services. Jej pasją jest pomaganie klientom w osiąganiu ich celów biznesowych dzięki usługom chmurowym AWS. Pomogła organizacjom w tworzeniu rozwiązań ML w wielu branżach, takich jak produkcja, motoryzacja, zrównoważony rozwój środowiska i lotnictwo.

Znak czasu:

Więcej z Uczenie maszynowe AWS