Маркування даних семантичної сегментації та навчання моделі за допомогою Amazon SageMaker

Вихідний вузол: 1551223

У комп’ютерному баченні семантична сегментація — це завдання класифікації кожного пікселя зображення за класом із відомого набору міток, так що пікселі з однаковою міткою мають певні характеристики. Він генерує маску сегментації вхідних зображень. Наприклад, на наступних зображеннях показано маску сегментації cat етикетка.

У листопаді 2018, Amazon SageMaker оголосила про запуск алгоритму семантичної сегментації SageMaker. За допомогою цього алгоритму ви можете навчати свої моделі за допомогою загальнодоступного або власного набору даних. Популярні набори даних сегментації зображень включають набір даних Common Objects in Context (COCO) і PASCAL Visual Object Classes (PASCAL VOC), але класи їхніх міток обмежені, і ви можете навчити модель на цільових об’єктах, які не включені до загальнодоступні набори даних. У цьому випадку можна скористатися Основна правда Amazon SageMaker щоб позначити свій власний набір даних.

У цій публікації я демонструю наступні рішення:

  • Використання Ground Truth для позначення набору даних семантичної сегментації
  • Перетворення результатів із Ground Truth у потрібний формат введення для вбудованого алгоритму семантичної сегментації SageMaker
  • Використання алгоритму семантичної сегментації для навчання моделі та виконання висновку

Маркування даних семантичної сегментації

Щоб побудувати модель машинного навчання для семантичної сегментації, нам потрібно позначити набір даних на рівні пікселя. Ground Truth дає вам можливість використовувати людські анотатори Amazon Mechanical Turk, сторонніх постачальників або вашої приватної робочої сили. Щоб дізнатися більше про робочу силу, див Створюйте та керуйте робочими силами. Якщо ви не хочете самостійно керувати персоналом із етикетування, Amazon SageMaker Ground Truth Plus це ще один чудовий варіант як новий сервіс маркування даних «під ключ», який дає змогу швидко створювати високоякісні набори навчальних даних і зменшує витрати до 40%. У цій публікації я покажу вам, як вручну позначити набір даних за допомогою функції автоматичного сегментування Ground Truth і маркування краудсорсингу за допомогою робочої сили Mechanical Turk.

Маркування вручну за допомогою Ground Truth

У грудні 2019 року Ground Truth додала функцію автоматичного сегментування в інтерфейс користувача для маркування семантичної сегментації, щоб збільшити пропускну здатність маркування та підвищити точність. Для отримання додаткової інформації див Автоматичне сегментування об’єктів під час виконання маркування семантичної сегментації за допомогою Amazon SageMaker Ground Truth. За допомогою цієї нової функції ви можете прискорити процес маркування для завдань сегментації. Замість того, щоб малювати щільно прилягаючий багатокутник або використовувати інструмент «Пензель» для зйомки об’єкта на зображенні, ви малюєте лише чотири точки: у верхній, нижній, крайній лівій та крайній правій точках об’єкта. Ground Truth приймає ці чотири точки як вхідні дані та використовує алгоритм глибокого екстремального вирізання (DEXTR), щоб створити щільно прилягаючу маску навколо об’єкта. Щоб отримати посібник із використання Ground Truth для позначення семантичної сегментації зображень, див Семантична сегментація зображення. Нижче наведено приклад того, як інструмент автоматичної сегментації автоматично створює маску сегментації після вибору чотирьох крайніх точок об’єкта.

Маркування краудсорсингу з робочою силою Mechanical Turk

Якщо у вас великий набір даних, і ви не хочете вручну позначати сотні чи тисячі зображень самостійно, ви можете використовувати Mechanical Turk, який надає на вимогу масштабовану людську робочу силу для виконання завдань, які люди можуть виконувати краще, ніж комп’ютери. Програмне забезпечення Mechanical Turk оформляє пропозиції роботи тисячам працівників, які бажають виконувати пошарову роботу, коли їм зручно. Програмне забезпечення також витягує виконану роботу та компілює її для вас, запитувача, який платить працівникам за задовільну роботу (тільки). Щоб почати роботу з Mechanical Turk, див Знайомство з Amazon Mechanical Turk.

Створіть завдання маркування

Нижче наведено приклад завдання маркування Mechanical Turk для набору даних про морську черепаху. Набір даних про морську черепаху взято з конкурсу Kaggle Виявлення обличчя морської черепахи, і я вибрав 300 зображень набору даних для демонстраційних цілей. Морська черепаха не є поширеним класом у загальнодоступних наборах даних, тому вона може представляти ситуацію, яка вимагає позначення масивного набору даних.

  1. На консолі SageMaker виберіть Роботи з маркування у навігаційній панелі.
  2. Вибирати Створення завдання маркування.
  3. Введіть назву своєї роботи.
  4. для Налаштування вхідних данихвиберіть Автоматичне налаштування даних.
    Це генерує маніфест вхідних даних.
  5. для Розташування S3 для вхідних наборів даних, введіть шлях до набору даних.
  6. для Категорія завданьвиберіть зображення.
  7. для Вибір завданнявиберіть Семантична сегментація.
  8. для Типи робітниківвиберіть Amazon Mechanical Turk.
  9. Налаштуйте параметри часу очікування завдання, терміну дії завдання та ціни за завдання.
  10. Додайте мітку (для цієї публікації, sea turtle), а також надайте інструкції щодо маркування.
  11. Вибирати Створювати.

Налаштувавши завдання маркування, ви можете перевірити хід маркування на консолі SageMaker. Коли його буде позначено як завершене, ви можете вибрати завдання, щоб перевірити результати та використати їх для наступних кроків.

Трансформація набору даних

Отримавши вихідні дані з Ground Truth, ви можете використовувати вбудовані алгоритми SageMaker для навчання моделі на цьому наборі даних. Спочатку вам потрібно підготувати позначений набір даних як запитуваний інтерфейс введення для алгоритму семантичної сегментації SageMaker.

Запитувані канали введення даних

Семантична сегментація SageMaker передбачає збереження вашого навчального набору даних Служба простого зберігання Amazon (Amazon S3). Очікується, що набір даних в Amazon S3 буде представлений у двох каналах, один для train і один для validation, використовуючи чотири каталоги, два для зображень і два для анотацій. Очікується, що анотації будуть нестисненими зображеннями PNG. Набір даних також може мати карту міток, яка описує, як створюються відображення анотацій. Якщо ні, алгоритм використовує значення за замовчуванням. Для висновку кінцева точка приймає зображення з image/jpeg тип вмісту. Нижче наведено необхідну структуру каналів даних:

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

Кожне зображення JPG у каталогах поїздів і перевірки має відповідне зображення мітки PNG з такою ж назвою в train_annotation та validation_annotation каталоги. Ця умова про іменування допомагає алгоритму пов’язувати мітку з відповідним зображенням під час навчання. Поїзд, train_annotation, підтвердження та validation_annotation канали є обов'язковими. Анотації є одноканальними зображеннями PNG. Формат працює до тих пір, поки метадані (режими) в зображенні допомагають алгоритму зчитувати зображення анотації в одноканальне 8-розрядне ціле число без знака.

Вихідні дані завдання маркування Ground Truth

Вихідні дані, згенеровані завданням маркування Ground Truth, мають таку структуру папок:

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

Маски сегментації зберігаються в s3://turtle2022/labelturtles/annotations/consolidated-annotation/output. Кожне зображення анотації є файлом .png, названим на честь індексу вихідного зображення та часу, коли це зображення було завершено. Наприклад, нижче наведено вихідне зображення (Image_1.jpg) та його маска сегментації, створена робочою силою Mechanical Turk (0_2022-02-10T17:41:04.724225.png). Зверніть увагу, що індекс маски відрізняється від номера в назві вихідного зображення.

Вихідний маніфест із завдання маркування знаходиться у файлі /manifests/output/output.manifest файл. Це файл JSON, і кожен рядок записує зіставлення між вихідним зображенням і його міткою та іншими метаданими. Наступний рядок JSON записує зіставлення між показаним вихідним зображенням та його анотацією:

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

Вихідне зображення називається Image_1.jpg, а назва анотації – 0_2022-02-10T17:41: 04.724225.png. Щоб підготувати дані як необхідні формати каналу даних алгоритму семантичної сегментації SageMaker, нам потрібно змінити назву анотації, щоб вона мала те саме ім’я, що й вихідні зображення JPG. І нам також потрібно розділити набір даних на train та validation каталоги вихідних зображень та анотацій.

Перетворіть вихідні дані із завдання маркування Ground Truth у потрібний формат введення

Щоб перетворити вихід, виконайте такі кроки:

  1. Завантажте всі файли із завдання маркування з Amazon S3 в локальний каталог:
    !aws s3 cp s3://turtle2022/ Seaturtles --recursive

  2. Прочитайте файл маніфесту та змініть імена анотації на ті самі імена, що й вихідні зображення:
    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. Розділіть набори даних про поїзд і перевірку:
    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. Створіть каталог у необхідному форматі для каналів даних алгоритму семантичної сегментації:
    os.chdir('./semantic_segmentation_pascalvoc_2022-01-11')
    os.mkdir('train')
    os.mkdir('validation')
    os.mkdir('train_annotation')
    os.mkdir('validation_annotation')

  5. Перемістіть зображення поїзда та перевірки та їх анотації до створених каталогів.
    1. Для зображень використовуйте наступний код:
      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 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. Завантажте набори даних поїзда та перевірки та їх набори даних анотацій до 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

У цьому розділі ми розглянемо кроки для навчання моделі семантичної сегментації.

Дотримуйтесь зразка блокнота та налаштуйте канали даних

Ви можете виконувати інструкції в Алгоритм семантичної сегментації тепер доступний в Amazon SageMaker щоб реалізувати алгоритм семантичної сегментації до вашого міченого набору даних. Цей зразок ноутбук показує наскрізний приклад, що представляє алгоритм. У блокноті ви дізнаєтеся, як навчити та розмістити модель семантичної сегментації за допомогою повністю згорткової мережі (FCN) алгоритм з використанням Набір даних Pascal VOC для навчання. Оскільки я не планую навчати модель з набору даних Pascal VOC, я пропустив крок 3 (підготовка даних) у цьому блокноті. Натомість я безпосередньо створював train_channel, train_annotation_channe, validation_channel та validation_annotation_channel використовуючи розташування S3, де я зберігав свої зображення та анотації:

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

Налаштуйте гіперпараметри для власного набору даних в оцінювачі SageMaker

Я пішов за записником і створив об’єкт оцінки SageMaker (ss_estimator), щоб навчити мій алгоритм сегментації. Є одна річ, яку нам потрібно налаштувати для нового набору даних ss_estimator.set_hyperparameters: нам потрібно змінитися num_classes=21 до num_classes=2 (turtle та background), і я теж змінився epochs=10 до epochs=30 тому що 10 призначено лише для демонстраційних цілей. Потім я використав екземпляр p3.2xlarge для навчання моделі шляхом налаштування instance_type="ml.p3.2xlarge". Навчання завершилося за 8 хвилин. Кращий MIoU (Середнє перетин через об’єднання) 0.846 досягається в епоху 11 за допомогою pix_acc (відсоток пікселів у вашому зображенні, які класифікуються правильно) 0.925, що є досить хорошим результатом для цього невеликого набору даних.

Результати модельного висновку

Я розмістив модель на недорогому екземплярі 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")

Нарешті, я підготував тестовий набір із 10 зображень черепах, щоб побачити результат висновку навченої моделі сегментації:

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

Наступні зображення показують результати.

Сегментаційні маски морських черепах виглядають точно, і я задоволений цим результатом, натренованим на наборі даних із 300 зображень, позначеному працівниками Mechanical Turk. Ви також можете досліджувати інші доступні мережі, наприклад мережа аналізу сцени піраміди (PSP) or DeepLab-V3 у зразку блокнота з вашим набором даних.

Прибирати

Видаліть кінцеву точку, коли ви закінчите з нею, щоб уникнути подальших витрат:

ss_predictor.delete_endpoint()

Висновок

У цій публікації я показав, як налаштувати маркування даних семантичної сегментації та навчання моделі за допомогою SageMaker. По-перше, ви можете налаштувати завдання маркування за допомогою інструмента автоматичної сегментації або використовувати робочу силу Mechanical Turk (а також інші варіанти). Якщо у вас більше 5,000 об’єктів, ви також можете використовувати автоматичне маркування даних. Потім ви перетворюєте вихідні дані з завдання маркування Ground Truth у необхідні формати введення для вбудованого навчання семантичної сегментації SageMaker. Після цього ви можете використовувати прискорений обчислювальний екземпляр (наприклад, p2 або p3) для навчання моделі семантичної сегментації за допомогою наступного ноутбук і розгорнути модель на більш економічно ефективному екземплярі (наприклад, ml.c5.xlarge). Нарешті, ви можете переглянути результати висновку у вашому наборі даних тесту за допомогою кількох рядків коду.

Почніть роботу з семантичною сегментацією SageMaker маркування даних та модельне навчання з вашим улюбленим набором даних!


Про автора

Кара Ян є спеціалістом із дослідження даних у AWS Professional Services. Вона прагне допомогти клієнтам досягти їхніх бізнес-цілей за допомогою хмарних сервісів AWS. Вона допомагала організаціям створювати рішення ML у багатьох галузях, таких як виробництво, автомобільна промисловість, екологічна стійкість та аерокосмічна промисловість.

Часова мітка:

Більше від AWS Машинне навчання