Создавайте и обучайте модель нейронной сети для сегментации изображений самым быстрым способом.

Модели нейронных сетей доказали свою высокую эффективность в решении задач сегментации, обеспечивая высочайшую точность. Они привели к значительным улучшениям в различных приложениях, включая анализ медицинских изображений, автономное вождение, робототехнику, спутниковые снимки, видеонаблюдение и многое другое. Однако построение этих моделей обычно занимает много времени, но после прочтения этого руководства вы сможете создать такую ​​модель, написав всего несколько строк кода.

Содержание

  1. Введение
  2. Строительные блоки
  3. Построить модель
  4. Обучите модель

Введение

Сегментация — это задача разделения изображения на несколько сегментов или областей на основе определенных характеристик или свойств. Модель сегментации принимает изображение в качестве входных данных и возвращает маску сегментации:

Сегментационные нейросетевые модели состоят из двух частей:

  • Кодировщик: берет входное изображение и извлекает функции. Примерами кодировщиков являются ResNet, EfficentNet и ViT.
  • Декодер: берет извлеченные функции и создает маску сегментации. Декодер зависит от архитектуры. Примерами архитектур являются U-Net, FPN и DeepLab.

Таким образом, при построении модели сегментации для конкретного приложения необходимо выбрать архитектуру и кодировщик. Однако трудно выбрать лучшую комбинацию, не протестировав несколько. Обычно это занимает много времени, потому что изменение модели требует написания большого количества шаблонного кода. Библиотека Модели сегментации решает эту проблему. Он позволяет создать модель в одну строку, указав архитектуру и кодировщик. Затем вам нужно только изменить эту строку, чтобы изменить любой из них.

Чтобы установить последнюю версию моделей сегментации из PyPI, используйте:

pip install segmentation-models-pytorch

Строительные блоки

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

На рисунке ниже показаны названия наиболее распространенных кодировщиков, предоставляемых библиотекой:

Существует более 400 энкодеров, поэтому показать их все невозможно, но полный список можно найти здесь.

Построить модель

После того, как архитектура и кодировщик выбраны из приведенных выше рисунков, построить модель очень просто:

Параметры:

  • encoder_name — это имя выбранного кодировщика (например, resnet50, efficentnet-b7, mit_b5).
  • encoder_weights — это набор данных предварительно обученного. Если encoder_weights равно "imagenet", веса кодировщика инициализируются с использованием предварительно обученного ImageNet. Все энкодеры имеют как минимум один предварительно обученный кодер, а полный список доступен здесь.
  • in_channels — количество каналов входного изображения (3, если RGB).
    Даже если in_channels не равно 3, можно использовать предварительно обученный ImageNet: первый слой будет инициализирован путем повторного использования весов из предварительно обученного первого сверточный слой (процедура описана здесь).
  • out_classes — количество классов в наборе данных.
  • activation — это функция активации выходного слоя. Возможные варианты: None (по умолчанию), sigmoid и softmax .
    Примечание. При использовании функции потерь, которая ожидает логитов в качестве входных данных, функция активации должна иметь значение «Нет». >Например, при использовании функции CrossEntropyLoss activation должно быть None .

Обучите модель

В этом разделе показан весь код, необходимый для выполнения обучения. Однако эта библиотека не изменяет обычный конвейер обучения и проверки модели. Для упрощения процесса в библиотеке реализовано множество функций потерь, таких как Потери Жаккара, Потери в кубиках, Потери кросс-энтропии в костях, Фокусные потери, а также такие метрики, как Точность, Точность, Отзыв. , F1Score и IOUScore. Полный их список и параметры смотрите в их документации в разделах Потери и Метрики.

Предлагаемый обучающий пример представляет собой бинарную сегментацию с использованием Oxford-IIIT Pet Dataset (он будет загружен по коду). Это два образца из набора данных:

Наконец, это все шаги для выполнения этого типа задачи сегментации:

  1. Постройте модель.

Установите функцию активации последнего слоя в зависимости от функции потерь, которую вы собираетесь использовать.

2. Определите параметры.

Помните, что при использовании предварительно обученного входные данные должны быть нормализованы с использованием среднего значения и стандартного отклонения данных, используемых для обучения предварительно обученного.

3. Определите функцию поезда.

Здесь ничего не меняется по сравнению с функцией обучения, которую вы написали бы для обучения модели без использования библиотеки.

4. Определите функцию проверки.

Истинные срабатывания, ложноположительные, ложноотрицательные и истинные отрицательные результаты для пакетов суммируются для расчета метрик только в конце пакетов. Обратите внимание, что логиты должны быть преобразованы в классы, прежде чем можно будет рассчитать метрики. Вызовите функцию обучения, чтобы начать обучение.

5. Используйте модель.

Вот некоторые сегменты:

Заключительные замечания

В этой библиотеке есть все необходимое для экспериментов с сегментацией. Построить модель и применить изменения очень просто, и предоставляется большинство функций и показателей потерь. Кроме того, использование этой библиотеки не меняет конвейер, к которому мы привыкли. См. официальную документацию для получения дополнительной информации. Я также включил в справочники некоторые из наиболее распространенных кодировщиков и архитектур.

Набор данных домашних животных Oxford-IIIT доступен для загрузки в коммерческих/исследовательских целях в соответствии с Международной лицензией Creative Commons Attribution-ShareAlike 4.0. Авторские права остаются за первоначальными владельцами изображений.

Все изображения, если не указано иное, принадлежат Автору. Спасибо за чтение, я надеюсь, что вы нашли это полезным.

[1] О. Роннебергер, П. Фишер и Т. Брокс, U-Net: сверточные сети для сегментации биомедицинских изображений (2015)

[2] Z. Zhou, Md. M. R. Siddiquee, N. Tajbakhsh and J. Liang, UNet++: A Nested U-Net Architecture for Medical Image Segmentation (2018)

[3] Л. Чен, Г. Папандреу, Ф. Шрофф, Х. Адам, Переосмысление Atrous Convolution для семантической сегментации изображений (2017)

[4] Л. Чен, Ю. Чжу, Г. Папандреу, Ф. Шрофф, Х. Адам, Кодер-декодер с сложной сепарабельной сверткой для сегментации семантического изображения (2018)

[5] Р. Ли, С. Чжэн, К. Дуань, К. Чжан, Дж. Су, П.М. Аткинсон, Multi-Attention-Network для семантической сегментации изображений дистанционного зондирования с высоким разрешением (2020)

[6] А. Чаурасия, Э. Калурсиелло, LinkNet: использование представлений кодировщика для эффективной семантической сегментации (2017)

[7] Т. Лин, П. Доллар, Р. Гиршик, К. Хе, Б. Харихаран, С. Белонги, Пирамидные сети признаков для обнаружения объектов (2017)

[8] Х. Чжао, Дж. Ши, С. Ци, С. Ван, Дж. Цзя, Сеть разбора сцены пирамиды (2016)

[9] Х. Ли, П. Сюн, Дж. Ан, Л. Ван, Пирамидальная сеть внимания для семантической сегментации (2018)

[10] К. Симонян, А. Зиссерман, Очень глубокие сверточные сети для крупномасштабного распознавания изображений (2014)

[11] Каймин Хэ, Сянюй Чжан, Шаоцин Рен, Цзянь Сунь, Глубокое остаточное обучение для распознавания изображений (2015)

[12] С. Се, Р. Гиршик, П. Доллар, З. Ту, К. Хе, Агрегированные остаточные преобразования для глубоких нейронных сетей (2016)

[13] Дж. Ху, Л. Шен, С. Олбани, Г. Сан, Э. Ву, Сети сжатия и возбуждения (2017)

[14] Г. Хуанг, З. Лю, Л. ван дер Маатен, К. К. Вайнбергер, Плотно связанные сверточные сети (2016)

[15] М. Тан, К. В. Ле, EfficientNet: переосмысление масштабирования модели для сверточных нейронных сетей (2019)

[16] Э. Се, В. Ван, З. Ю, А. Анандкумар, Дж. М. Альварес, П. Луо, SegFormer: простой и эффективный дизайн для семантической сегментации с преобразователями (2021)