… Менее чем за 5 минут

Если вы читаете это, то, вероятно, знаете, что ищете 🤷. Итак, я сразу перейду к этому и предполагаю, что вы знакомы с тем, что означает сегментация изображений, разницей между семантической сегментацией и сегментацией экземпляра и различными моделями сегментации, такими как U-Net, Mask R-CNN и т. Д. Если нет, я очень рекомендую прочитать эту отличную статью по Analytics Vidhya для исчерпывающего введения в тему, дополненного в конце примером с использованием Mask R-CNN.

В большинстве онлайн-руководств по сегментации изображений используются предварительно обработанные и помеченные наборы данных с созданными как достоверными изображениями, так и масками. В реальных проектах такое редко бывает, когда нужно работать над подобной задачей. Я столкнулся с той же проблемой и потратил СЧЕТЧИК часов, пытаясь найти достаточно простой и ПОЛНЫЙ пример, работая над проектом сегментации экземпляров. Я не мог и решил написать свое :)

Вот простая визуализация того, что мы будем делать в этой статье :)

Аннотатор изображений VGG (VIA)

VIA - чрезвычайно легкий аннотатор с поддержкой изображений и видео. Вы можете перейти на домашнюю страницу проекта, чтобы узнать больше. При использовании VIA у вас есть два варианта: V2 или V3. Я постараюсь объяснить различия ниже:

  1. V2 намного старше, но подходит для базовых задач и имеет простой интерфейс.
  2. В отличие от V2, V3 поддерживает аннотатор видео и аудио.
  3. Версия 2 предпочтительнее, если ваша цель - сегментация изображений с несколькими вариантами экспорта, такими как JSON и CSV.
  4. Проекты V2 несовместимы с проектами V3

В этой статье я буду использовать версию 2. Вы можете скачать необходимые файлы здесь. Или, если вы хотите опробовать VIA онлайн, вы можете сделать это здесь.

Как

Я буду использовать Kaggle Nuclei Dataset и аннотировать одно из тестовых изображений, чтобы сгенерировать маску сегментации. Полное раскрытие информации, я НЕ сертифицированный медицинский работник, и аннотации, которые я делаю, предназначены только для этой статьи. Вы также можете быстро адаптировать процесс к другим типам объектов.

Дерево корневой папки приведено ниже. via.html - это файл, который мы будем использовать для аннотирования наших изображений. Он находится по ссылке для загрузки VIA V2 ZIP, указанной выше. Поместите все изображения, которые необходимо аннотировать, в папку images. maskGen.py - это скрипт для преобразования аннотаций в маски.

├── images
│   └── test_image.png
├── maskGen.py
└── via.html

1. Открыть via.html: он откроется в браузере по умолчанию. В разделе Форма области выберите инструмент Полилиния (последний вариант) и дайте вашему проекту имя. Затем нажмите Добавить файлы и выберите все изображения, которые вы хотите аннотировать. На этом этапе ваш экран должен выглядеть как на рисунке 1.

2. Начать аннотирование: нажмите на границу объекта и нарисуйте многоугольник вокруг объекта. Вы можете завершить создание многоугольника, нажав Enter, или, если вы допустили ошибку, нажмите Backspace. Повторите это для всех объектов. После того, как вы закончите, ваш экран должен выглядеть, как на рисунке 2.

3. Экспорт аннотаций. По завершении нажмите вкладку Аннотации вверху и выберите Экспортировать аннотации (как JSON). Файл JSON будет сохранен на вашем устройстве. Найдите этот файл и перенесите его в корневую папку в соответствии с приведенным выше деревом.

4. Создание масок. Теперь ваша корневая папка должна выглядеть примерно так.

├── images
│   └── test_image.png
├── maskGen_json.json
├── maskGen.py
└── via.html

maskGen.py приводится в сущности ниже. Он считывает файл JSON, запоминает координаты многоугольника для каждого объекта маски, генерирует маски и сохраняет их в формате .png. Для каждого изображения в папке images сценарий создает новую папку с именем изображения, и эта папка содержит подпапки как исходного изображения, так и сгенерированных файлов маски. Обязательно обновите переменную json_path до имени вашего файла JSON и установите высоту и ширину маски. Некоторые из сгенерированных масок показаны после сути.

Если вы все сделали правильно, конечное дерево корневой папки должно выглядеть примерно так. Количество файлов в каждой mask папке соответствует количеству объектов, которые вы отметили на исходном изображении.

├── images
│   └── test_image
│       ├── images
│       │   └── test_image.png
│       └── masks
│           ├── test_image_10.png
│           ├── test_image_11.png
│           ├── test_image_12.png
│           ├── test_image_13.png
│           ├── test_image_14.png
│           ├── test_image_15.png
│           ├── test_image_1.png
│           ├── test_image_2.png
│           ├── test_image_3.png
│           ├── test_image_4.png
│           ├── test_image_5.png
│           ├── test_image_6.png
│           ├── test_image_7.png
│           ├── test_image_8.png
│           └── test_image_9.png
├── maskGen_json.json
├── maskGen.py
└── via.html

Заключение

Надеюсь, эта статья поможет вам в ваших проектах. Пожалуйста, обращайтесь за любыми предложениями / разъяснениями :)

Вы можете связаться со мной по: Электронная почта, LinkedIn, GitHub.